Coding Dojo Floripa

Desenvolvimento Ágil

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:

  1. Escolha a classe e o método que você que codificar e pense em todos os testes possíveis para ela;
  2. 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:

  1. Escreva um pequeno teste que falhe, e talvez até mesmo sequer compile inicialmente;
  2. Faça o teste passar da maneira rápida, cometendo qualquer “pecado” durante este processo;
  3. 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á…)

8 Respostas to “Confusões sobre TDD”

  1. 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

  2. Leandro Zis said

    Testes de aceitação fazem parte de TDD?

  3. […] 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. […]

  4. 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.

  5. […] 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. […]

  6. […] leitura recomendada […]

  7. 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!

  8. 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,

Deixe um comentário