Um novo nome para testes de unidade [fechado]

9

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?

Vai
fonte
14
O que há em um nome? o que chamamos de rosa Por outro nome, teria um cheiro tão doce; - Shakespeare, Romeu e Julieta, c.1600
Steven A. Lowe
8
Eu não sei se você está no crack. Eu nunca tentei crack, ou ser você.
Tim Post
11
Penso que as ideias se apegam às palavras principalmente por causa das idéias e atitudes associadas a elas, não das palavras. Lembro-me de descobrir que a Sociedade Spastics mudou seu nome para Scope, porque o nome estava associado ao preconceito. Lembro-me porque explicava por que ouvira crianças chamando um ao outro de "escarnecedor" mais cedo naquele dia. Se você quiser mudar a atitude, concentre-se na atitude, não no nome - a obsessão pelo nome é apenas uma perda de tempo.
precisa saber é o seguinte
2
Design por contrato: en.wikipedia.org/wiki/Design_by_contract Tem uma conotação específica e testes de unidade não são. Se vejo algo com Contract no nome, é isso (e as interfaces) que meu cérebro associa a ele.
Berin Loritsch
@ Steve314 Scopey. Gosto disso. :) Acho que, neste caso, a palavra teste já está definida e, portanto, renomear testes de unidade para um termo indefinido seria melhor. O contrato não pode ser devido à "interface" mencionada. Que tal 'criar programas melhores mais rapidamente' ou CBPF.
Will

Respostas:

5

Estou no crack ou alguém vê essa recusa em fazer testes e eles acham que é uma razão semelhante para não quererem fazer isso?

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.

Que razões você / outras pessoas dão para não testar?

Dependências difíceis de zombar / falsificar /

O que você acha que as motivações deles não são os testes unitários?

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.

MatthewMartin
fonte
Ótimos pontos. Tentar explicar por que você 'testaria' um método get simples é difícil, explicar por que é contratualmente importante para a estabilidade de todo o resto do seu código que o método get sempre retorna o que você espera é um argumento mais fácil de fazer
Will
3

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.

Berin Loritsch
fonte
2
A especificação executável provavelmente é anterior ao TDD / BDD / Agile / XP. Pode ser tão antigo quanto o CMMI. Costumava ser uma co-moda com a UML quando as pessoas pensavam que UML é a linguagem para escrever ES.
rwong
O BDD, como o TDD, é uma abordagem para teste, não um tipo de teste (funcional x integração x unidade x aceitação). O autor está perguntando especificamente sobre um nome "melhor" para o teste de unidade.
ybakos
0

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.

Lennart Regebro
fonte
0

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?

gbjbaanb
fonte
Você deve escrever um código muito simples então. A quantidade de estados alcançáveis ​​na maioria dos sistemas modernos significa que fazer testes de ponta a ponta levaria a vida útil do universo - testar duas peças com 4 bits de estado leva 16 casos para testar cada um, ou 32 casos de teste no total; transformado em um sistema de ponta a ponta fornece 8 bits de estado ou 256 casos de teste para cobrir todos os estados. Pessoalmente, prefiro fazer 1/8 do trabalho.
Pete Kirkham
11
@PeteKirkham, o corolário disso é que você precisa escrever um grande número de testes de unidade e também escrever os testes de integração para garantir que a unidade ainda funcione. Os lugares em que trabalhei, que gostavam muito de testes de unidade, passaram tanto tempo escrevendo (e mantendo) eles que diminuíram a base de código, e a quantidade de trabalho que eles fizeram foi pequena em comparação com o que realizo fora desse ambiente. Nada é uma bala mágica, eu recomendo tentar encontrar uma abordagem mais pragmática que ofereça cobertura de teste dos bits importantes e, ao mesmo tempo, produza algo.
Gbjbaanb