BT

TDD: Por onde começar meus testes?

por Pedro Mariano em 19 Ago 2010 |

TDD é uma técnica bastante utilizada hoje por diversos times. Os benefícios de tal abordagem já estão mais do que comprovados em diversas literaturas como neste artigo publicado na InfoQ. Porém essa forma de iniciar sua funcionalidade pelo teste deve começar por qual parte do nosso projeto? Se estivermos utilizando uma abordagem MVC devemos começar pelos controladores, pela tela ou pelo modelo?

Em um recente discussão no mais novo fórum de arquitetura do Brasil, o Tectura, André Silva iniciou a seguinte discussão: "Por onde começar a codificar o Teste" com a pergunta:

Bom seguindo o conceito de TDD, devemos começar sempre pelo teste. No caso estou criando uma funcionalidade nova, por exemplo: cadastro de aluno. Aqui surge uma dúvida que eu sempre tive: por onde começamos?

Bom, geralmente eu começo pela entidade. [...] Gostaria de saber se está forma que eu faço é correta? Tem outra forma de fazer?[...]Então agora com a entidade “existindo” eu consigo criar os testes das outras camadas (persitência, controle, etc..). Ou é possível criar esses testes (persistência, controle, etc) sem a entidade existir?

Igo Coelho sugeriu utilizar, em conjunto, uma outra abordagem utilizando o Behavior Driven Development (BDD).

Esse geralmente é o caminho seguido por parecer mais natural. Tentando ajudar mais sem querer te deixar com mais dúvida, já pensou em usar BDD? Conhece o JBehave? Quando você começar a pensar nos testes partindo do entendimento de qual funcionalidade você deseja desenvolver a coisa fica mais natural. Daí você parte tanto para teste de aceitação quanto para o de unidade juntando BDD com TDD.

Concordando parcialmente, Luiz Corte disse que é possível seguir essa linha de raciocinio (pensar nos testes partindo de qual funcionalidade você deseja desenvolver - apenas com a utilização do BDD, ele diz:

Realmente começar pensando na funcionalidade que você quer implementar ajuda bastante. Mas não precisa usar BDD para seguir essa linha; dá pra fazer TDD assim.

Meu jeito de começar pensando na funcionalidade é começar com os testes de controladores, afinal são eles que vão “orquestrar” seu sistema e delegar as coisas para os caras que realmente fazem (isso se você estiver usando MVC). Nos testes desse cara, coloca mock em tudo quanto é dependência que você tiver, e aí você já vai definindo a interface que suas dependências vão ter que seguir.

Guilherme Silveira mostra uma outra forma de iniciar seus testes começando pelo teste end-to-end (testes que simulam a utilização do usuário final).

Mais um caso diferente, nos sistemas que temos teste de integração, costumamos começar pelo teste de end-to-end que nos diz o caminho geral, fazemos ele compilar (quando a linguagem for compilável), implementamos o teste unitário e o código. Repetimos o teste unitário e código até o teste end-to-end passar.

Com isso temos o end-to-end que nos deu o behavior e o unitário que nos deu os detalhes finos.

Durante a discussão foi possível observar que as opiniões são variadas e não é possível dizer que uma abordagem é de fato a melhor de todas, isso depende do que o desenvolvedor prefere e a forma que mais ajudará no seu raciocínio.

E você leitor prefere começar seus testes por qual parte? Qual a importância que você vê na escolha dela? Começar pelo lugar errado pode ou não gerar problemas no futuro?

Olá visitante

Você precisa cadastrar-se no InfoQ Brasil ou para enviar comentários. Há muitas vantagens em se cadastrar.

Obtenha o máximo da experiência do InfoQ Brasil.

Dê sua opinião

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber menssagens dessa discussão

E você leitor prefere começar seus testes por qual parte? by Carlos Alberto

E você leitor prefere começar seus testes por qual parte? Qual a importância que você vê na escolha dela?

Como falei no tectura, acho meio insano começar pelas camadas mais recondidas do software, o que vejo é uma tendência de começar a desenvolver pela interface visual do usuário e ai ir decendo nas funcionalidades. Desta forma ajuda não precisamos pensar em que daos precisaremos ou que servico xpto usaremos, mas pensaremos apenas naquilo que realmente for importante para nós, e dai ir criando as outras classes a medida que for sendo necessário, conforme disse em meu blog isso te ajuda a ter um design limpo. Portanto acho imperativo começar sempre pelo que conhecemos, geralmente é a interface do usuário, mas pode ser a interface de uma classe ou até mesmo um serviço remoto. Então comece pelo o que você conhece.


Começar pelo lugar errado pode ou não gerar problemas no futuro?

Com toda certeza, caso você comece a implementar pelas partes mais baixas da aplicação, por exemplo a persistência, você corre o risco de ter métodos que nunca vão ser acessados, começar pelo lugar errado te atrapalha a manter o foco somente o que deve ser implementado, você pode ser pego pensando "o que vou precisar", se para que o meu cliente acesse? sendo que o correto deveria ser "vou precisar acessar isso", parece uma distinção boba, mas que tem impactos profundos no desenvolvimento, pensar assim te ajuda a implementar somente o que deve ser implementado.

Re: E você leitor prefere começar seus testes por qual parte? by Pedro Henrique Santana Mariano

Excelente comentário Carlos Alberto. Concordo com o que você falou sobre os problemas. Também acho que coisas desnecessárias irão surgir caso você inicie pela parte errada.

Re: E você leitor prefere começar seus testes por qual parte? by Carlos Alberto

Obrigado.

TDD: Por onde começar meus testes? by Valdemar Júnior

Eu nunca tinha pensado por essa forma, sempre faço meus testes pelo DAO(ou camada de dados), mas realmente o pensamento de desenvolver pensando em "vou precisar acessar isso" do que "o que vou precisar" é mais eficiente e tem uma resposta mais rápida do que é preciso implementar.

Agora fazer os testes como Guilherme falou, end-to-end, perde-se um pouco de tempo devido a um teste end-to-end demorar um pouco a executar(para sistemas web: abrir browser, logar no sistema.. blá blá blá), em relação a execução de um teste unitário. Mas é uma abordagem a se pensar também.

Ótimo post

Re: E você leitor prefere começar seus testes por qual parte? by thiago adriano

Na minha opinião depende do framework que você esta trabalhando, como ele trabalha com os testes.Por exemplo estou em um projeto php com o cakephp no nosso projeto começamos os testes na camada model, mas em outro projeto que eu estava com o zend, começamos pelos controllers. É muito relativo mas o importante e realizar os testes, pois eles sao muito importantes.

Thiago da Silva Adriano
thiago.adriano26@gmail.com

Re: E você leitor prefere começar seus testes por qual parte? by Leandro Nunes

Sei que to atrasado aqui na discursão, mais nunca é tarde para começar!
Concordo plenamente com o Carlos Alberto. Tenho 3 projetos somente de experiência em TDD e já passei por essas situações de pensar "o que vou precisar", pois sempre comecei pelo teste unitário dos models.

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber menssagens dessa discussão

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber menssagens dessa discussão

6 Dê sua opinião

Conteúdo educacional

Feedback geral
Bugs
Publicidade
Editorial
InfoQ Brasil e todo o seu conteúdo: todos os direitos reservados. © 2006-2014 C4Media Inc.
Política de privacidade
BT