Compreendo o desenvolvimento orientado a testes até o momento em que você só pode escrever código produtivo quando tiver um teste de unidade (vermelho) com falha.
Não. Você só pode escrever o código mais simples possível para alterar a mensagem do teste. Não diz nada sobre que tipo de teste.
De fato, você provavelmente começará escrevendo um teste de aceitação com falha (vermelho) para um critério de aceitação; mais precisamente, você escreverá o teste de aceitação mais simples que pode falhar; depois de executar o teste, observe-o falhar e verifique se ele falha pelo motivo certo. Em seguida, você escreve um teste funcional com falha para obter uma fatia da funcionalidade desse critério de aceitação; novamente, você escreve o teste funcional mais simples que pode falhar, executa-o, observa-o falhar e verifica se ele falha pelo motivo certo. Em seguida, você escreve um teste de unidade com falha, o teste de unidade mais simples que pode falhar, executa-o, assista-o falhar, verifique se ele falha pelo motivo certo.
Agora , você escreve o código de produção mais simples que pode alterar a mensagem de erro. Execute o teste novamente, verifique se a mensagem de erro foi alterada, se foi na direção correta e se o código alterou a mensagem pelo motivo correto. (Idealmente, a mensagem de erro já deve ter saído e o teste deve passar, mas, na maioria das vezes, é melhor tomar pequenas etapas para alterar a mensagem em vez de tentar fazer o teste passar de uma só vez - essa é a razão por que os desenvolvedores de estruturas de teste gastam tanto esforço em suas mensagens de erro!)
Depois de passar no teste de unidade, você refatora seu código de produção sob a proteção de seus testes. (Observe que, no momento, o teste de aceitação e o teste funcional ainda estão falhando, mas tudo bem, já que você está refatorando apenas unidades individuais cobertas por testes de unidade.)
Agora você cria o próximo teste de unidade e repita o procedimento acima, até que o teste funcional também passe. Sob a proteção do teste funcional, agora você pode fazer refatorações em várias unidades.
Esse ciclo intermediário agora se repete até que o teste de aceitação seja aprovado; nesse momento, você pode fazer refatorações em todo o sistema.
Agora, você escolhe o próximo critério de aceitação e o ciclo externo inicia novamente.
Kent Beck, o "descobridor" do TDD (ele não gosta do termo "inventor", ele diz que as pessoas fazem isso o tempo todo, ele apenas deu um nome e escreveu um livro sobre ele) usa uma analogia da fotografia e chama isso de "aumentar e diminuir o zoom".
Nota: você nem sempre precisa de três níveis de testes. Talvez, às vezes você precise de mais. Mais frequentemente, você precisa de menos. Se suas peças de funcionalidade são pequenas e seus testes funcionais são rápidos, você pode passar sem (ou com menos testes de unidade). Muitas vezes, você só precisa de testes de aceitação e testes de unidade. Ou, seus critérios de aceitação são tão refinados que seus testes de aceitação são funcionais.
Kent Beck diz que, se ele tiver um teste funcional rápido, pequeno e focado, ele primeiro escreverá os testes de unidade, permitirá que os testes de unidade conduzam o código e exclua (alguns) os testes de unidade novamente que abrangem o código que também é coberto pelo teste funcional rápido. Lembre-se: o código de teste também é um código que precisa ser mantido e refatorado, quanto menos houver, melhor!
No entanto, estou me perguntando se a abordagem orientada a testes também pode ser aplicada a outras formas de testes.
Você realmente não aplica o TDD aos testes. Você o aplica a todo o processo de desenvolvimento. É isso que significa a parte "orientada" do Desenvolvimento Orientado a Testes : todo o seu desenvolvimento é orientado por testes. Os testes não apenas orientam o código que você escreve, mas também o código a ser escrito, o código a ser escrito a seguir. Eles dirigem o seu design. Eles dizem quando você termina. Eles dizem a você o que trabalhar a seguir. Eles falam sobre falhas de design no seu código (quando é difícil escrever testes).
Keith Braithwaite criou um exercício que ele chama de TDD como se você quisesse . Consiste em um conjunto de regras (baseadas nas Três Regras do TDD do tio Bob Martin , mas muito mais rigorosas) que você deve seguir rigorosamente e que foram projetadas para orientá-lo a aplicar o TDD com mais rigor. Funciona melhor com a programação de pares (para que seu par possa garantir que você não está infringindo as regras) e com um instrutor.
As regras são:
- Escreva exatamente um novo teste, o menor teste possível, que parece apontar na direção de uma solução
- Veja isso falhar; falhas de compilação contam como falhas
- Faça o teste de (1) passar escrevendo o menor código de implementação possível no método de teste .
- Refatorar para remover a duplicação e, se necessário, para melhorar o design. Seja rigoroso sobre o uso desses movimentos:
- você deseja um novo método - aguarde até o tempo de refatoração e, em seguida, crie novos métodos (sem teste) executando um destes procedimentos, e de nenhuma outra maneira:
- de preferência: extraia o método no código de implementação criado como (3) para criar um novo método na classe de teste ou
- se você deve: mover o código de implementação de acordo com (3) para um método de implementação existente
- você deseja uma nova classe - espere até o tempo de refatoração e, em seguida, crie classes que não são de teste para fornecer um destino para um método Move e por nenhum outro motivo
- preencha classes de implementação com métodos executando o método Move e de nenhuma outra maneira
Essas regras são destinadas ao exercício do TDD. Eles não foram feitos para realmente fazer TDD na produção (embora nada o impeça de testá-lo). Eles podem se sentir frustrantes porque às vezes parecerá que você dá milhares de pequenos passos sem fazer nenhum progresso real.