Embora eu não tenha participado de um projeto de TDD ou BDD, ou de alguns que dizem que estão fazendo TDD, mas estão muito longe disso, essas são coisas em que penso e realmente tento ler o máximo que posso sobre.
De volta à pergunta. Ao fazer o BDD, você deve escrever seu "teste" primeiro e fazê-lo falhar, certo? E então implemente esse recurso ou como você o chama. Mas se você levar isso ao extremo, isso não poderia ser algum tipo de desenvolvimento de cima para baixo? Você está olhando sua interface do usuário e diz: "Gostaria de ter esse recurso / comportamento aqui". Em seguida, você corrige sua interface do usuário para implementar esse recurso e o código que suporta a interface do usuário. Neste ponto, você não implementou nenhuma lógica comercial ou lógica de acesso a dados, apenas implementou seu comportamento. O que eu pretendo, em vez de escrever o teste, primeiro você escreve seu código de interface do usuário. Em alguns casos, deve resultar no mesmo código para a camada de negócios e acesso a dados, pois você usa o código da interface do usuário para definir o que sua empresa precisa oferecer suporte.
É claro que você deve complementar isso com testes que são usados para garantir que o recurso esteja funcionando como deveria.
Alguma ideia?
fonte
main
. No seu comentário de cima para baixo, você está falando sobre testes funcionais, que executam todo o programa em um únicomain
.Respostas:
Você está falando sobre o BDD de uma perspectiva de alto nível para testar sua interface do usuário. O teste é um pouco mais fácil nesse nível do que no código Javascript / servidor.
Vários livros que li no TDD dizem que você deve escrever código como se os sistemas subjacentes existissem e apenas escrever o suficiente para fazer o teste passar. Você pode escrever stubs no servidor para obter aprovação nos testes comportamentais da interface do usuário. Então você começa nesse stub seam e escreve alguns testes de unidade para o código do lado do servidor e trabalha até a implementação completa.
Costumo codificar como se as camadas subjacentes existissem para que um teste de alto nível passasse, é como descer por uma toca de coelho e extrair muitas outras classes para satisfazer o teste de alto nível e depois escrever testes para esses níveis mais baixos. Como você já reconheceu, ajuda a manter o foco, começando com testes de nível superior.
Como qualquer programador experiente sabe, há muitas camadas no desenvolvimento de software. Costumo trabalhar abaixo da interface do usuário e pensar nos dados ou no comportamento que minha interface precisa do servidor e começar por aí (talvez porque eu não faça muito trabalho na interface hoje em dia).
Se eu for realmente honesto, extrair uma classe das camadas subjacentes significa que não estou fazendo o teste primeiro, mas ... dentro de minutos ou às vezes horas, terei um teste para esse código. Isso ainda me parece benéfico, pois ajuda a ver onde você pode precisar fornecer dependências para uma classe e respeitar o princípio de responsabilidade única - se for difícil de testar, você está fazendo muito em um só lugar etc.
fonte
Sim! Caso contrário, o que você obtém é um teste orientado ao desenvolvimento .
Realisticamente falando, no entanto, existem problemas que são difíceis de abordar usando TDD "puro". Você pode ser mais produtivo escrevendo escrevendo um código de produção descoberto antecipadamente e cobrindo-o com testes mais tarde (e aprendendo a abordar problemas semelhantes com o TDD no futuro). Veja essa técnica , que seu autor chamou de TDD de enxágue e repetição por falta de um termo melhor.
fonte
Se você não escrever seus testes primeiro, não estará conduzindo o desenvolvimento através dos testes. Portanto, você não está fazendo desenvolvimento orientado a testes!
fonte
Se você quiser trabalhar dessa maneira, vá em frente. Mas não é um desenvolvimento orientado a testes.
fonte
O que você descreve parece muito com a abordagem de design antecipado. Infelizmente, o Front-Ahead Design é a facada satírica de Alex Papadimoulis nos métodos ágeis.
fonte
Pessoalmente, acredito que é fundamental pensar em testes durante a fase de design. É realmente ótimo ter uma implementação funcional, mas a única maneira de garantir um produto em funcionamento é se você o testou peça por peça. A maneira de cobrir isso é através de uma combinação de testes de unidade e uma equipe qualificada de controle de qualidade trabalhando em parceria.
Agora, como você instala esse dicipline em sua equipe é com você. O TDD é uma dessas estratégias - e uma que tem seu lugar, e existem muitas outras variações. No entanto, o TDD não é particularmente adequado para o desenvolvimento de layout da interface do usuário.
fonte