Estou experimentando o desenvolvimento orientado a teste e descobri que frequentemente chego à seguinte situação:
- Escrevo testes para algumas funcionalidades X. Esses testes falham.
- Ao tentar implementar o X, vejo que preciso implementar algum recurso Y em uma camada inferior do meu código. Então...
- Escrevo testes para Y. Agora, ambos os testes para X e Y falham.
Uma vez que eu tinha quatro recursos em diferentes camadas de código sendo trabalhados ao mesmo tempo, estava perdendo meu foco no que realmente estava fazendo (muitos testes falharam ao mesmo tempo).
Eu acho que poderia resolver isso colocando mais esforço no planejamento de minhas tarefas antes mesmo de começar a escrever testes. Mas, em alguns casos, eu não sabia que precisaria ir mais fundo, porque, por exemplo, não conhecia muito bem a API da camada inferior.
O que devo fazer nesses casos? O TDD tem alguma recomendação?
fonte
X
, tenho que saber de que parte das dependênciasX
preciso zombar. Sinto que isso faz parte dos detalhes da implementação, que não devem fazer parte dos testes - caso contrário, talvez seja necessário alterar os testes enquanto refatoramos a implementação. Devo me preocupar com isso?Stubs e zombarias podem ser usados para simular a funcionalidade que ainda não está sendo modificada / implementada. Eles também podem ajudá-lo a resolver as dependências que causam esse tipo de 'reação em cadeia'.
Por outro lado, talvez manter apenas um teste (com falha) que conduza a próxima mudança seja a melhor abordagem.
Outros testes direcionados ao código que depende de novas funcionalidades podem ser desabilitados temporariamente, pois não são realmente relevantes neste momento. no seu caso, desative os testes para o X até implementar Y etc.
Dessa forma, você pode manter o foco na próxima mudança, que é o que você quer, eu acho.
fonte
unittest
já tem pular teste. Isso pode ser suficiente para mim.Pare
De antemão, parece que pode haver dois problemas separados aqui:
você esqueceu algumas histórias e cenários de teste e não as descobriu até começar a trabalhar em um cenário de teste específico e / ou
você está realmente fazendo testes de unidade, e não testes de recursos TDD
Para o número 1, pare , volte e atualize as histórias e os cenários de teste e comece novamente com um cenário diferente.
Na segunda posição, pare e lembre-se de que você está testando recursos, não unidades, portanto, use simulações para encobrir outras interfaces e / ou implementar mais código para fazer o teste passar sem adicionar novos cenários de teste. Isso pressupõe que você não esteja perdendo cenários de teste, mas sim - e isso é realmente comum - testes de unidade conflitantes e TDD.
fonte
Esta é uma ótima pergunta e uma enorme frustração para mim também com o TDD. Sinto que o TDD não tem nesse cenário em que você simplesmente não tem como saber quais componentes ou recursos de nível inferior serão necessários até começar a desenvolver.
Pessoalmente, descobri que o TDD só funciona se você sabe exatamente o que precisa fazer e o que precisa chamar para executar um recurso. Os desenvolvedores nem sempre sabem tudo antes de começarmos, então descobri que a melhor maneira de mitigar a mesma situação que você descreve:
Protótipo
Quando faço aplicativos protótipos simples para explorar e descobrir métodos e abordagens para um problema técnico, descubro muito do trabalho de perna e removo essa pesquisa antes de começar. Projetar e estimar também é muito mais fácil.
Se o protótipo precisar estar tão envolvido que se torne o aplicativo, peço que você não faça a coisa preguiçosa no entanto e crie testes de unidade para o seu protótipo após o fato.
Nesse momento, você deve saber mais sobre a API de nível inferior e conseguir zombar da API de nível inferior em seus componentes de nível superior.
fonte
Depende do tipo de teste que você escreve enquanto faz TDD.
O modelo clássico é escrever testes de unidade e usar zombarias ou stubs para separar o teste das outras "unidades" do código.
Existem muitos outros modelos alternativos, como o ATDD, onde o teste é feito em uma pilha cheia ou quase em uma pilha cheia. Nesse caso específico, seus testes de escrita que afirmam que o comportamento exigido do programa não é uma única unidade de código, portanto você não escreveria outros testes. Você implementaria a ida e volta para satisfazer o teste. Você adiciona outros testes para outros recursos / comportamentos.
fonte