Escreva o teste primeiro, deixe-o guiar o design e construa confiança a cada tecla digitada.
O Desenvolvimento Orientado a Testes é simples de descrever e difícil de dominar:
É isso. Três passos, repetidos centenas de vezes por dia.
A ordem importa. Você escreve o teste primeiro, antes que qualquer código de produção exista. Isso parece estranho no início. Mas muda tudo:
TDD É Design
TDD é uma técnica de design disfarçada de técnica de teste. Os testes não são o ponto—o pensamento que os produz é.
A parte mais difícil do TDD é aprender a escrever testes para código que ainda não existe. Veja como:
Comece com a interface, não com a implementação. Como o código deveria ser quando estiver pronto? Escreva um teste que o use dessa forma.
Comece pequeno. Não tente testar tudo de uma vez. Teste o caso mais simples possível primeiro.
Faça-o falhar pelo motivo certo. O teste deve falhar porque a funcionalidade não existe, não porque você cometeu um erro de sintaxe.
Use nomes de teste como documentação. O nome do teste deve descrever qual comportamento você está testando: "retorna lista vazia quando nenhum item corresponde ao filtro" e não "teste1."
Escrever o teste primeiro força você a pensar sobre:
Essas são questões de design. Ao respondê-las antes de escrever o código, você toma melhores decisões de design.
Precisa de uma função para calcular custo de envio. Escreva um teste: 'envio para São Paulo com pedido de R$50 é R$5.' Então escreva apenas código suficiente para fazê-lo passar. Depois teste o próximo caso.
Escreva todo o cálculo de envio com todos os casos extremos. Depois tente escrever testes. Descubra que o código é difícil de testar porque não foi projetado para testabilidade. Escreva testes confusos ou pule os testes.
Depois de ter um teste que falha, faça-o passar. Mas aqui está a disciplina: escreva o código mínimo para passar no teste, nada mais.
Isso significa:
Isso parece ridículo. "Apenas retornar 5?" Sim, se isso faz o teste passar. Então escreva outro teste que force você a fazer computação real.
Por quê? Porque:
A mágica acontece quando você triangula. Primeiro teste: retorne 5. Segundo teste (entrada diferente): agora você tem que computar. Terceiro teste: agora você tem que lidar com casos extremos. Cada teste empurra você em direção a uma implementação real.
Se você pode fazer o teste passar escrevendo 'return 5', escreva 'return 5'. Então escreva outro teste que o quebre. Deixe os testes guiarem você em direção ao código real.
Depois que o teste passa, limpe. Isso não é opcional.
O passo de refatoração é onde você:
A chave: mantenha os testes passando durante todo o processo. Refatore em passos pequenos, executando testes após cada mudança. Se os testes falharem, você sabe exatamente o que quebrou.
É aqui que o TDD compensa. Sem testes, refatorar é aterrorizante—você pode quebrar algo. Com testes, refatorar é rotina—você saberá imediatamente se quebrar algo.
Pular o passo de refatoração leva ao que Kent Beck chama de "desculpas verdes rápidas." O código funciona, mas está bagunçado. A bagunça se acumula. Logo a base de código fica difícil de trabalhar, e você perdeu o benefício do TDD.
Mito: TDD é mais lento. Realidade: TDD parece mais lento no início porque você está escrevendo mais código. Mas você gasta menos tempo depurando, menos tempo no debugger, menos tempo corrigindo bugs de produção. Ao longo da vida da base de código, TDD é mais rápido.
Mito: TDD leva a testes excessivos. Realidade: TDD leva exatamente aos testes que você precisa—nem mais, nem menos. Você testa o que constrói. Teste depois frequentemente leva a testes faltando (você esquece casos extremos) ou testes redundantes (você testa a mesma coisa de várias formas).
Mito: TDD não funciona para [meu domínio]. Realidade: TDD funciona para qualquer código que possa ser testado. Se seu código não pode ser testado, isso é um problema de design. TDD força você a escrever código testável, que é código melhor.
Mito: Não temos tempo para TDD. Realidade: Você não tem tempo para não fazer. Bugs são caros. Depuração é cara. Incidentes de produção são caros. TDD é um investimento que compensa.
Não Negociável
No XP, TDD não é algo bom de ter. É uma prática não negociável. Sem testes, todas as outras práticas se tornam mais difíceis ou impossíveis.