Confusões sobre TDD
Posted by Ivan Sanchez em Terça-feira, Novembro 28, 2006
Lendo o post sobre Desenvolvimento Orientado a Testes no blog do José Oliveira notei que ele pode gerar algumas confusões comuns para que está começando a aprender sobre esta técnica. E digo isso por experiência própria, já que levei meses até começar a desenvolver orientado a testes com alguma desenvoltura.
O texto apresenta a seguinte definição de TDD:
“…TDD é simplesmente você escrever o teste do seu programa antes de codificá-lo de fato. Teste nesse contexto seriam os testes unitários.”
Ao meu ver a essência está correta, porém talvez faltasse deixar claro que TDD não se trata apenas de escrever testes antes do código. Esta é a primeira visão que a maioria dos iniciantes têm sobre desenvolvimento orientado a testes: que basta escrever todos os testes antes e pronto. Isto é compreensível, já que escrever testes antes do código já causa um choque por si só. Porém, TDD foi definido pelo Kent Beck com a seguinte fórmula:
TDD = Test-First + Design Incremental
E a parte do design incremental ficou um pouco confusa na continuação do texto:
“…O processo de desenvolvimento usando TDD é muito simples:
- Escolha a classe e o método que você que codificar e pense em todos os testes possíveis para ela;
- Antes de escrever a classe, codifique os testes que você pensou….”
Seguindo estas instruções (escrever todos os testes possíveis antes) pode-se perder um pouco de um dos maiores benefícios de TDD, que é prover feedback rápido sobre o que está sendo implementado. Aí que entra o design incremental. A idéia é que a solução seja criada em pequenos passos (Baby Steps), seguindo a rotina descrita no livro TDD by Example:
- Escreva um pequeno teste que falhe, e talvez até mesmo sequer compile inicialmente;
- Faça o teste passar da maneira rápida, cometendo qualquer “pecado” durante este processo;
- Refatore: elimine toda duplicação criada para fazer os testes passarem.
Desta forma, não é preciso pensar na solução completa (sequer numa classe inteira) antes de começar, basta pensar em um teste apenas e fazê-lo passar. Com o conhecimento adquirido é possível então passar para o próximo teste com mais segurança, e assim avançar até que a solução esteja completa.
Outra noção comum é pensar que TDD trata apenas de testes de unidade. Como bem disse o José no seu post, TDD faz bastante uso de testes unitários. Porém, embora a maioria dos exemplos (inclusive o meu) mostra TDD sendo feito através deste tipo de teste, isto não significa que a técnica está restrita a eles. Escrever testes de aceitação simples antes do código existir também pode colaborar na hora de desenvolver com TDD, já que com eles também pode-se obter feedback sobre a solução.
Embora sejam bem pontuais, observar estes detalhes pode ajudar no uso mais eficiente de TDD. E no geral achei o post do José Olivera bastante útil pra quem está começando 🙂
Apropósito, fiquei contente em ver que mais gente se interessa em escrever sobre TDD. É sinal que a técnica esta se tornando popular. Além disso, recomendo visitas regulares ao blog do José Oliveira. (quem sabe um dia eu ainda respondo o questionário que ele publicou por lá…)
José Oliveira said
Opa, Ivan. Perfeitos os seus comentários.
Como você bem capturou, o meu post foi mais para quem não manja nada de TDD e quer começar com a técnica. Para esses, eu acho que usar termos como “design incremental”, “teste de aceitação”, etc algo muito avançado, o que pode complicar a mente de quem tá se interessando agora.
Por isso eu preferi uma abordagem bem mais objetiva e simples. (TDD é isso, é aquilo e se faz assim). 😀
[]s
Leandro Zis said
Testes de aceitação fazem parte de TDD?
BTUF « Mergulhando no Caos said
[…] Então se você leu o artigo do José Oliveira, considere com muito carinho os conselhos dele. Mas leia o esclarecedor artigo do Ivan Sanchez também. Escreva os testes que conseguir imaginar antes de começar a escrever o código para fazê-los passar, mas por favor não fique muito tempo pensando. Você pode esperar para começar a escrever o código depois que todos os testes estiverem prontos, mas você não precisa e nem quer fazer isso. […]
Ivan Sanchez said
Leandro,
TDD é uma abordagem para projeto de software e não somente de codificação, então não há restrições quanto aos tipos de testes. Eles só precisam poder ser escritos antes, de maneira incremental e serem automatizados, pra prover o feedback (fator “vermelho/verde”) conforme o software vai evoluindo.
Inclusive é muito comum usar o jUnit para fazer testes de integração (entre módulos, ou banco de dados) durante o desenvolvimento orientado a testes. E partir de um teste de aceitação para chegar aos unitários também é o que acontece geralmente quando se usa eXtreme Programming.
Ou seja, testes funcionais, de integração e de aceitação também PODEM colaborar nesta maneira de projetar software.
Test-Driven Development at José Oliveira said
[…] UPDATE: dois blogueiros que eu admiro bastante fizeram trackbacks muito bons para esse meu artigo, o que me deixou bastante feliz. Você deve ler: BTUF e Confusões sobre TDD. […]
TDD - Os testes devem ser feitos antes ou durante a implementação? « Think about Tests said
[…] leitura recomendada […]
Anderson said
Olá, os links para o blog do José de Oliveira estão quebrados. Sei que faz tempo que o post foi escrito mas parabéns, muito boa explicação!
camilo said
excelente o comentario, realmente muito bom, estou querendo me aprofundar mais na técnica e os posts aqui no blog ajudaram e muito. parabens pela iniciativa. Porem, fiquei curioso no blog do Jose, mas ta quebrando. =/.
abracos,