Estou fazendo certo? Se não, o que exatamente eu tenho que mudar
É difícil dizer apenas a partir dessa breve descrição, mas suspeito que não, você não está fazendo certo. Nota: Não estou dizendo que o que você está fazendo não funciona ou é de alguma forma ruim, mas você não está fazendo TDD. O meio "D" significa "Dirigido", os testes conduzem tudo, o processo de desenvolvimento, o código, o design, a arquitetura, tudo .
Os testes informam o que escrever, quando escrever, o que escrever a seguir, quando parar de escrever. Eles dizem o design e a arquitetura. (O design e a arquitetura emergem do código por meio da refatoração.) O TDD não se refere a testes. Nem se trata de escrever testes primeiro: o TDD é permitir que os testes o conduzam, escrevê-los primeiro é apenas um pré-requisito necessário para isso.
Não importa se você realmente escreve o código ou o detalha completamente: você está escrevendo (esqueletos de) código em sua cabeça e depois escrevendo testes para esse código. Isso não é TDD.
Abandonar esse hábito é difícil . Muito, muito difícil. Parece ser especialmente difícil para programadores experientes.
Keith Braithwaite criou um exercício que ele chama de TDD como se você quisesse . Ele 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:
- preferido: 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
Normalmente, isso levará a designs muito diferentes do que o "método pseudo-TDD" comumente praticado de "imaginar em sua cabeça qual deveria ser o design e, em seguida, escrever testes para forçar esse design, implementar o design que você já havia previsto antes de escrever seu testes ".
Quando um grupo de pessoas implementa algo como um jogo do tic tac toe usando pseudo-TDD, eles geralmente terminam com projetos muito semelhantes, envolvendo algum tipo de Board
classe com uma matriz 3 x 3 de Integer
s. E pelo menos uma parte dos programadores realmente escreveu essa classe sem testes, porque "sabem que vão precisar" ou "precisam de algo para escrever seus testes". No entanto, quando você força esse mesmo grupo a aplicar o TDD como se você quisesse, eles geralmente acabam com uma grande diversidade de designs muito diferentes, geralmente sem empregar nada remotamente semelhante a um Board
.
Existe alguma maneira de identificar se o teste que você escreveu é suficiente?
Quando eles cobrem todos os requisitos de negócios. Os testes são uma codificação dos requisitos do sistema.
É uma boa prática escrever teste para uma funcionalidade muito simples, que pode ser equivalente a 1 + 1 = 2 ou é apenas um exagero?
Novamente, você tem o inverso: você não escreve testes de funcionalidade. Você escreve funcionalidade para testes. Se a funcionalidade para passar no teste for trivial, isso é ótimo! Você acabou de cumprir um requisito de sistema e nem sequer trabalhou duro para isso!
É bom alterar a funcionalidade e testar adequadamente se o requisito muda?
Não. O contrário. Se um requisito for alterado, você modifica o teste que corresponde a esse requisito, observa-o falhar e altera o código para fazê-lo passar. Os testes sempre vêm em primeiro lugar.
É difícil fazer isso. Você precisa de dezenas, talvez centenas de horas de prática deliberada , a fim de criar algum tipo de "memória muscular" para chegar a um ponto em que, quando o prazo se aproxima e você está sob pressão, nem precisa pensar nisso. , e fazer isso se torna a maneira mais rápida e natural de trabalhar.