Introdução ao T D D - api.ning.comapi.ning.com/.../TDD.pdfTest-Driven Development Introdução ao...

Preview:

Citation preview

T D DIntrodução ao

@CharlesFortes

.com Community

@CharlesFortes

.com Test-Driven Development Introdução ao

Cadastro de Usuário

Cadastro de Usuário

Cadastro de Usuário Cadastro de Usuário

Cadastro de Usuário Cadastro de Usuário

Cadastro de Usuário

Cadastro de Usuário

@CharlesFortes

.com

• Meu sistema pode ter no máximo 6 usuários; • Para poder cadastrar um usuário, deve-se estar logado no sistema e possuir

permissão específica para isto;

• Não podem haver dois logins iguais no sistema;

• A senha deve ter no mínimo 6 caracteres e não pode ter mais de 50 caracteres;

• Nome, Login e senha são campos obrigatórios;

Test-Driven Development Introdução ao

Test-Driven Development Introdução ao

@CharlesFortes

.com

O que é

Test-DrivenDevelopment?

@CharlesFortes

.com

É Desenvolver Focado no Caso

de Testes, nas Especificações

Test-Driven Development Introdução ao

@CharlesFortes

.com Test-Driven Development Introdução ao

É Desenvolver Focado no Caso

de Testes, nas Especificações

WTF?

@CharlesFortes

.com

Casos de Testes são condições aos quais o

software deverá ser submetido para que possa ser testado quanto ao seu funcionamento adequado e verificando se ele

atende ao que foi solicitado

Test-Driven Development Introdução ao

@CharlesFortes

.com

Entende-se que nossa tela de cadastro de usuário está

funcionando corretamente quando as seguintes condições estiverem

satisfeitas:

1. Logado no sistema e tendo permissão para cadastrar usuários, cadastrar um usuário Incluir

corretamente, exibir mensagem de sucesso

2. Tentar inserir 7 usuário O sistema não pode permitir, retornando uma exceção

3. Com 6 usuários cadastrados, remover um usuário e inserir um novo Incluir corretamente, exibir

mensagem de sucesso

4. Tentar cadastrar um usuário sem estar logado no sistema Não permitir, retornar exceção

5. Estando logado no sistema, tentar cadastrar um usuário sem ter permissão Não permitir, retornar

exceção

6. Tentar cadastrar dois usuários com o mesmo nome Não permitir, retornar uma exceção

7. Remover um usuário e cadastrar um novo com o mesmo nome

Test-Driven Development Introdução ao

@CharlesFortes

.com

Entende-se que nossa tela de cadastro de usuário está

funcionando corretamente quando as seguintes condições estiverem

satisfeitas:

1. Tentar salvar um usuário com o login em branco não permitir, retornar uma exceção

2. Tentar salvar um usuário com o nome em branco não permitir, retornar uma exceção

3. Tentar cadastrar um usuário com senha em branco não permitir, retornar uma exceção

4. Tentar cadastrar uma senha com 5 dígitos não permitir, retornar uma exceção

5. Tentar cadastrar uma senha com 6 dígitos Incluir corretamente, exibir mensagem de sucesso

6. Tentar cadastrar uma senha de 50 dígitos Incluir corretamente, exibir mensagem de sucesso

7. Tentar cadastrar uma senha com 51 dígitos não permitir, retornar uma exceção

Test-Driven Development Introdução ao

@CharlesFortes

.com

Para cada um dos casos de testes apresentados anteriormente,

deve existir um teste de unidade que o valide de forma

absoluta.

Test-Driven Development Introdução ao

@CharlesFortes

.com

Para cada um dos casos de testes apresentados anteriormente,

deve existir um teste de unidade que o valide de forma

absoluta.

Test-Driven Development Introdução ao

WTF?

@CharlesFortes

.com

“Testes de unidade é um método pelo qual as unidades individuais do

código-fonte são testados para determinar se eles estão aptos

para o uso.

A unidade é a menor parte testável de um aplicativo. Na programação

procedural uma unidade pode ser uma função individual ou

procedimento. Na programação orientada a objeto uma unidade é

normalmente um método.”

Test-Driven Development Introdução ao

Segundo a Wikipédia

@CharlesFortes

.com

Um teste de unidade, é um teste automatizado que testa

uma funcionalidade/aspecto/Requisito do sistema

Test-Driven Development Introdução ao

i.e. Testar a capacidade do sistema de se permitir cadastrar um usuário dentro dos moldes do negócio

@CharlesFortes

.com Test-Driven Development Introdução ao

Testa

@CharlesFortes

.com Test-Driven Development Introdução ao

Teste de unidade deve ser executável independente dos dados

O teste de unidade deve conter tudo

o que o teste necessita, ele não pode depender de estados gerados por

outros testes, ele deve funcionar tão bem sendo executado sozinho como com todos os demais

Teste de unidade sempre será usado como teste de regressão

@CharlesFortes

.com Test-Driven Development Introdução ao

Teste de unidade feito por fazer não tem valor

@CharlesFortes

.com Test-Driven Development Introdução ao

Não altere ou exclua testes para ter um novo. O teste só deve mudar

quando a funcionalidade mudar

Teste de unidade deve testar o Contrato, não teste nada além do contrato

@CharlesFortes

.com Test-Driven Development Introdução ao

No modelo tradicional de desenvolvimento, primeiro se cria o código, e

depois se implementam os testes necessários para seu funcionamento

Requisitos

Análise

Desenho

Código Teste de Unidade

Teste de Integração

Teste de Sistema

Teste de Aceite Planeja >

Planeja >

Planeja >

Planeja >

@CharlesFortes

.com Test-Driven Development Introdução ao

O problema deste modelo é que o teste muitas vezes se torna viciado,

acaba sendo um teste criado para provar que o código funciona, e não

para validar se há ou não falhas

@CharlesFortes

.com Test-Driven Development Introdução ao

Pensando em como solucionar este problema, foi criado o TDD

Desenho reaproveitado de uma tirinha do site vidadeprogramador.com.br O texto apresentado não é o texto original da tirinha.

@CharlesFortes

.com Test-Driven Development Introdução ao

Pensando em como solucionar este problema, foi criado o TDD

Requisitos

Análise

Desenho

Código Teste de Unidade

Teste de Integração

Teste de Sistema

Teste de Aceite Planeja >

Planeja >

Planeja >

Planeja >

@CharlesFortes

.com

Quem diz: _“o importante é testar, não importa quando” esta errado, porque entende TDD como uma abordagem de testes.

TDD utiliza testes para dirigir o desenvolvimento

da aplicação

Test-Driven Development Introdução ao

@CharlesFortes

.com

“Testes escritos antes do código da aplicação, antes de serem testes, são especificações”

Giovanni Bassi

Test-Driven Development Introdução ao

@CharlesFortes

.com Test-Driven Development Introdução ao

Dentre as vantagens desta abordagem estão o fato de que se desenvolve

apenas o necessário e com agilidade

E a segurança de que a aplicação continuará funcionando no

futuro (evitando regressões), qualquer erro que apareça pode ser facilmente

encontrado sem ficar debugando o código a esmo.

@CharlesFortes

.com Test-Driven Development Introdução ao

O TDD NÃO realiza todos os testes que o projeto precisa, ele apenas fornece uma direção para ser seguida durante o desenvolvimento que foca as

especificações. Ele testa se o que foi solicitado funciona.

O TDD deve ser realizado pelo desenvolvedor, de forma que guie seu raciocínio quanto a como e o que implementar

@CharlesFortes

.com

Lets Test

Test-Driven Development Introdução ao

0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0

@CharlesFortes

.com Test-Driven Development Introdução ao

Pensando em como solucionar este problema, foi criado o TDD

Pré-Condição

Deve ser preparado o ambiente de testes, suas pré-condições

Podem ser usados MOCKs, fakes, querys, a execução de

outro teste (ou outros), etc...

@CharlesFortes

.com Test-Driven Development Introdução ao

Pré-Condição

O Visual Studio usa a marcação TestInitialize em um método para

executar algo que prepara o ambiente.

@CharlesFortes

.com Test-Driven Development Introdução ao

Domain-Driven Design Introdução ao

@CharlesFortes

.com

Escreva o Teste Verifique se ele falhou Escreva o Código para que ele passe Rode todos os testes Refatore Escreva o Teste Verifique se ele falhou Escreva o Código para que ele passe Rode todos os testes Refatore

Domain-Driven Design Introdução ao

@CharlesFortes

.com

Domain-Driven Design Introdução ao

@CharlesFortes

.com

Escreva o Teste Verifique se ele falhou Escreva o Código para que ele passe Rode todos os testes Refatore Escreva o Teste Verifique se ele falhou Escreva o Código para que ele passe Rode todos os testes Refatore

Domain-Driven Design Introdução ao

@CharlesFortes

.com

Domain-Driven Design Introdução ao

@CharlesFortes

.com

Escreva o Teste Verifique se ele falhou Escreva o Código para que ele passe Rode todos os testes Refatore Escreva o Teste Verifique se ele falhou Escreva o Código para que ele passe Rode todos os testes Refatore

Domain-Driven Design Introdução ao

@CharlesFortes

.com

Domain-Driven Design Introdução ao

@CharlesFortes

.com

Escreva o Teste Verifique se ele falhou Escreva o Código para que ele passe Rode todos os testes Refatore Escreva o Teste Verifique se ele falhou Escreva o Código para que ele passe Rode todos os testes Refatore

Domain-Driven Design Introdução ao

@CharlesFortes

.com

Domain-Driven Design Introdução ao

@CharlesFortes

.com

Escreva o Teste Verifique se ele falhou Escreva o Código para que ele passe Rode todos os testes Refatore Escreva o Teste Verifique se ele falhou Escreva o Código para que ele passe Rode todos os testes Refatore

VB6

@CharlesFortes

.com Test-Driven Development Introdução ao

@CharlesFortes

.com

Lets Code

0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0

Test-Driven Development Introdução ao

@CharlesFortes

.com Test-Driven Development Introdução ao

http://bugbang.com.br

http://artofunittesting.com

http://www.agiledata.org/essays/tdd.html

@CharlesFortes

pangeanet.org/profile/charlesfortes

br.linkedin.com/in/charlesfortes

Test-Driven Development Introdução ao

Recommended