A curta pergunta: como você segue o desenvolvimento orientado a testes em um projeto que abrange vários idiomas?
Especificamente, estou escrevendo um aplicativo da Web que usa JavaScript e PHP e quero seguir os princípios do TDD, mas não tenho certeza de como integrá-los. Executo conjuntos de testes separados para as seções JS e PHP e uso zombarias no conjunto JS para emular as respostas do servidor? Existe uma técnica para testar a unidade dos dois componentes em uma execução?
Esta é a minha primeira experiência usando o Test-Driven Development, portanto, qualquer conselho que você possa compartilhar sobre como torná-lo menos assustador seria ótimo. A razão pela qual escolhi é que, assim que terminei um protótipo, os requisitos foram alterados, forçando-me a alterar meu design. Imaginei que, se estou começando de novo, gostaria de escrever um código mais extensível com testes de regressão integrados desde o início.
Estou escrevendo meus testes de PHP no SimpleTest e meus testes de JavaScript no JsTestDriver. Estou acostumado a paradigmas orientados a objetos, por isso tenho algumas classes em PHP e estou fazendo algo semelhante em JavaScript usando herança de protótipo. Também comecei a ler este livro sobre TDD em Python e este sobre TDD em JavaScript , mas, pelo que vi, eles não descrevem o teste completo de um aplicativo (além de usar algo como Selenium ou outro driver da web para executar testes de aceitação de front-end O TDD não é um recurso adequado para desenvolvedores de pilha completa?
fonte
Respostas:
Na verdade, isso seria o oposto do teste de unidade - o teste de unidade, especialmente no estilo TDD, significa testar seus componentes isoladamente . Portanto, a resposta é sim, "execute conjuntos de testes separados para as seções JS e PHP "; caso contrário, não será um teste de unidade nem um TDD.
Obviamente, os testes de integração automatizados podem testar "os dois componentes de uma só vez" e você pode utilizar exatamente as ferramentas que você já mencionou (como o Selenium). Mas esses são tipicamente testes mais complexos, desenvolvidos fora dos ciclos do TDD.
fonte
O importante é distinguir entre TDD e ATDD . O AT significa " testes de aceitação ", e isso se refere ao desenvolvimento em que você começa com um teste de aceitação, que provavelmente testa toda a pilha. Isso às vezes também é chamado de "desenvolvimento orientado a testes externos". Quando as pessoas falam sobre TDD, o "T" lá provavelmente se refere especificamente a testes de unidade .
Uma parte essencial dos testes de unidade é isolar a unidade em teste de suas dependências. Isso oferece dois benefícios muito importantes:
Você pode fazer seus testes com extrema rapidez, para executá-los com frequência, como parte de um ciclo de feedback muito curto. Em vez de executá-los, digamos, a cada hora, você poderá executar todos os seus testes de unidade após cada pequena alteração, para receber instantaneamente o feedback deles sobre se essa alteração quebrou alguma coisa.
Seus testes podem ser direcionados ao mesmo tempo comportamento muito específico. Se um deles falhar, você poderá determinar quase instantaneamente a natureza exata do bug que o teste está indicando.
Devido à importância desse isolamento, você desejará automaticamente que os testes sejam restritos a unidades muito menores do que os limites do idioma o forçam. Embora não seja uma regra rígida, você normalmente espera que uma única classe seja uma unidade testável. Portanto, em termos de TDD, a questão da linguagem é mais ou menos irrelevante.
Se, por outro lado, você deseja fazer o ATDD, verifique os recursos especificamente para isso (isso geralmente é feito como parte do BDD, consulte também as ferramentas direcionadas a isso). Aqui é onde algo como o Selenium se encaixa naturalmente. Normalmente, ao fazer o ATDD, você ainda escreve testes de unidade e, na verdade, para passar em cada teste de aceitação, você pode testar sua implementação com testes de unidade também. Portanto, mesmo se você quiser fazer o ATDD, entender como escrever testes de unidade ainda é importante.
fonte
Além disso, você não precisa usar o TDD para a pilha completa do aplicativo. TDD como uma metodologia de desenvolvimento é mais adequado para as partes lógicas de um aplicativo. As partes que exigem um toque mais experimental, como o design do front-end, certas interações ou o domínio do banco de dados, são melhor executadas no estilo tradicional, pois você ainda não sabe se essa será a versão final.
Mas a lógica do aplicativo não deve mudar no futuro, e se isso acontecer, você estará enfrentando o temido requisito. Isso torna perfeito para um conjunto de testes de regressão dar confiança sempre que fizer uma alteração no código, que é o objetivo final do TDD.
Tio Bob explica isso melhor do que eu. https://blog.8thlight.com/uncle-bob/2014/04/30/When-tdd-does-not-work.html
fonte