TDD: Por onde começar meus testes?
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?
E você leitor prefere começar seus testes por qual parte?
by
Carlos Alberto
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
TDD: Por onde começar meus testes?
by
Valdemar Júnior
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
Thiago da Silva Adriano
thiago.adriano26@gmail.com
Re: E você leitor prefere começar seus testes por qual parte?
by
Leandro Nunes
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.
Conteúdo educacional
Mobilidade: Frameworks, SOs e o Mercado
Ricardo Ogliari 23 Mai, 2013
Caminhos de uma estratégia mobile
Sérgio Lopes 23 Mai, 2013
Complexidade organizacional no Século 21
Alexandre Magno 16 Mai, 2013

Olá visitante
Você precisa cadastrar-se no InfoQ Brasil ou Login para enviar comentários. Há muitas vantagens em se cadastrar.Obtenha o máximo da experiência do InfoQ Brasil.
Dê sua opinião