domingo, 4 de abril de 2010

Testes unitário x TDD x BDD

Acompanhando os grupos de discussão eu percebo que ainda tem muita gente fazendo confusão entre testes unitários, TDD e BDD. Eu sei que a "sopa de letrinhas" não colabora, mas é fundamental entender as as diferenças entre eles para que você consiga usufluir dos seus benefícios.

Eu não vou ficar aqui dando as definições formais de cada um, abaixo segue alguns links onde você pode obter mais informações, mas vou me preocupar em destacar as diferenças entre eles.


http://pt.wikipedia.org/wiki/Teste_de_unidade
http://pt.wikipedia.org/wiki/Test_Driven_Development
http://pt.wikipedia.org/wiki/Behavior_Driven_Development

Quando estamos aplicando teste unitário, estamos testando um único trecho do nosso código, nada mais do que isso. Se o nosso teste faz mais do que isso ou ele é um teste de integração ou é qualquer outra coisa parecida mas não é teste unitário.

Isso quer dizer que testes de integração não importantes? De forma alguma, mas um dos problemas em se ter teste de integração sem testes unitários é que se o seu teste falhar como você irá descobrir o motivo? Lembrando que, dependendo do tipo de teste de integração que você esteja fazendo, outros fatores podem influenciar o resultado (fatores externos como banco de dados por exemplo).

Um dos fatores de resistência aos testes unitários é a mudança que ele causa no nosso código. Como escrevemos testes para que testem apenas um único trecho, precisamos desacoplar nossas classes e métodos para garantir que estamos testando apenas uma única coisa.

TDD é uma disciplina de desenvolvimento, o seu conceito é bem simples, você cria o testa, o teste falha, você faz funcionar e refatora caso necessário. O famoso red, green, refactoring.
Se você não desenvolve dessa forma você não esta utilizando TDD, isso não significa que você não esteja produzindo testes unitários, mas você não esta seguindo a disciplina de desenvolvimento.

Uma das desvantagens mais levantadas contra a disciplina contida no TDD é referente ao tempo: "Escrever testes e fazer falhar é muito demorado.". A parte ironica disso, é que não é uma reclamação dos gestores mas sim dos desenvolvedores.

BDD é uma evolução do TDD, a quem diz que o TDD foi mal interpretado e que na verdade o BDD sempre existiu.
Com o BDD não é apenas testar, o BDD tem como finalidade documentar o código através de testes feitos com base em especificações contruídas a partir de contextos.
Se você acha o desenvolvimento com TDD é demorado o BDD talvez não ajude a mudar esse conceito.

Bom, podemos ter teste unitário sem TDD e BDD, podemos desenvolver com TDD sem BDD e podemos escrever especificações conforme o BDD sem TDD, entretanto não podemos ter BDD ou TDD sem teste unitário.

Se você vai utilizar TDD ou BDD o mais importante é ter os testes escritos e utilizando as melhores práticas da mesma forma que você escreve o código do produto final, pois com certeza, testes mal escritos são difíceis de entender e manter atualizados.

Como você tem escrito seus testes?



Um comentário:

Anônimo disse...
Este comentário foi removido por um administrador do blog.