Eu nunca gostava de testes de unidade. Eu sempre pensei que isso aumentava a quantidade de trabalho que eu tinha que fazer.
Acontece que isso é verdade apenas em termos do número real de linhas de código que você escreve e, além disso, isso é completamente compensado pelo aumento no número de linhas de código útil que você pode escrever em uma hora com testes e desenvolvimento orientado a testes.
Agora eu amo testes de unidade, pois eles me permitem escrever código útil, que muitas vezes funciona na primeira vez! (bata na madeira)
Descobri que as pessoas relutam em fazer testes de unidade ou iniciar um projeto com desenvolvimento orientado a testes, se estiverem sob prazos rígidos ou em um ambiente em que outros não o façam, e não o fazem. Meio que, uma recusa cultural de tentar.
Eu acho que uma das coisas mais poderosas sobre o teste de unidade é a confiança que isso lhe dá para realizar a refatoração. Ele também dá uma nova esperança encontrada: eu posso dar meu código a outra pessoa para refatorar / melhorar e, se meus testes de unidade ainda funcionarem, eu posso usar a nova versão da biblioteca que eles modificaram, praticamente sem medo.
É esse último aspecto do teste de unidade que acho que precisa de um novo nome. O teste de unidade é mais como um contrato do que esse código deve fazer agora e no futuro.
Quando ouço a palavra teste, penso em camundongos em gaiolas, com vários experimentos realizados para verificar a eficácia de um composto. Não é isso que é o teste de unidade, não estamos testando código diferente para ver qual é a abordagem mais afetiva, estamos definindo quais saídas esperamos com quais entradas. No exemplo dos ratos, os testes de unidade são mais parecidos com as definições de como o universo funcionará, em oposição às experiências realizadas nos ratos.
Estou no crack ou alguém vê essa recusa em fazer testes e eles acham que é uma razão semelhante pela qual não querem fazer isso?
Que razões você / outras pessoas dão para não testar?
O que você acha que as motivações deles não são os testes unitários?
E como um novo nome para o teste de unidade que pode superar algumas das objeções, que tal o jContract? (Um pouco centrada em Java, eu sei :), ou Contratos de Unidade?
fonte
Respostas:
A palavra teste em teste de unidade faz as pessoas pensarem que é um teste de integração ou interface do usuário, porque esse é o único tipo de teste que eles já fizeram. É como colocar java em javascript.
Quando algo tem um nome ruim e afeta o pensamento das pessoas, é chamado de erro de enquadramento. Erros de enquadramento tendem a ser superficiais - as pessoas são inteligentes e podem ver todos os tipos de nomes ruins, metáforas ruins.
Dependências difíceis de zombar / falsificar /
O teste de unidade tem uma contagem de conceito modesta e uma quantidade não trivial de trabalho precisa ser feita antes que se pare de escrever testes de unidade ruins e comece a escrever bons. À medida que as pessoas melhoram em explicar o que é o teste de unidade, a adoção aumenta. Na minha experiência, o teste de unidade tem um efeito quase mágico na produtividade e na qualidade do código. Mas não começou assim. Originalmente, usei estruturas de teste de unidade como uma maneira conveniente de escrever testes de integração.
fonte
O conceito de mudança de nome já foi apresentado. Chama-se Desenvolvimento Orientado ao Comportamento . Os caras que criaram isso notaram muitos dos mesmos argumentos, além do ajuste artificial de testar algo que ainda não foi criado. Em vez disso, seu conceito é escrever uma especificação executável (que é o que realmente é o TDD).
Eu notei a mesma reação. Também notei que várias pessoas simplesmente não sabem escrever testes de unidade. Eles estão ausentes nas disciplinas do processo científico e apenas usam a estrutura de teste de unidade como uma maneira de conectar tudo e iniciar o depurador. Em suma, eles não estão realmente melhorando o uso de seu tempo. Não sei dizer quantos testes de unidade que eu vi que tiveram várias dezenas de linhas (mais de 30 linhas) e nenhuma declaração de afirmação. Quando vejo isso, sei que é hora de trabalhar com o desenvolvedor e ensiná-lo o que é uma afirmação e como escrever testes de unidade que realmente testam.
fonte
Os contratos são chamados de "interfaces" na maioria dos casos aqui. A realização de testes de unidade não garante os contratos propriamente ditos, pois você também pode alterá-los, para que não saiba realmente que pode usar a nova versão da biblioteca apenas porque a biblioteca foi testada. Você precisa testar o código que também usa a biblioteca. Isso não é diferente de qualquer outro teste de unidade, então não vejo por que isso precisaria de um novo nome.
Eu acho que, como você, a maioria das pessoas relutantes em fazer testes o faz porque acha que é mais trabalhoso e inútil.
fonte
Vou lhe dizer por que não gosto de TDD: não é porque não consigo ver o valor dele ou reconheço os benefícios de um conjunto de testes que posso executar para verificar todo o meu código após cada modificação.
É porque eu não preciso disso. Eu sou um desenvolvedor bem antiquado, quando eu era garoto, não tínhamos depuradores integrados sofisticados com edição e continuação para escrever código, e uma compilação poderia levar muito tempo, então tivemos que conseguir coisas certo, desde o início. Dado esse treinamento, realmente não vejo que escrever uma carga de testes de unidade me tornasse mais produtivo ou meu código mais livre de erros.
Eu testei meu código, mas, como sempre fiz, isso aconteceu na totalidade, e não nas partes individuais. Então, talvez eu tenha 'testes de unidade', mas eles são um pouco mais grosseiros.
Então essa é a minha razão. Não vejo a necessidade de fazê-lo. O código que produzo é bom o suficiente e, se for o caso, por que devo mudar meus processos para corrigir algo que não está quebrado?
fonte