Como usar testes de unidade como fonte de informação?

8

Um colega meu esteve em um seminário sobre desenvolvimento ágil, onde ouviu que é possível usar testes de unidade como documentação técnica. Algo como usar testes de unidade como um exemplo de como usar a classe.

Uma rápida pesquisa no Google forneceu TDD e documentação , o que prova que isso é possível. Mas, olhando para o nosso código, vejo que obviamente não conseguimos implementar testes de unidade dessa maneira.

Na minha opinião, os testes de unidade existem para testar o código como uma unidade mínima, mesmo com a ajuda de classes e funções simuladas e falsas.

Então, as perguntas são:

  • Não é tarefa dos testes funcionais mostrar como uma classe (ou conjunto de classes) deve ser usada?
  • Se for possível usar testes de unidade como documentação técnica, existem algumas diretrizes sobre como implementar esses testes de unidade?
BЈовић
fonte
2
Os testes de unidade são uma fonte de documentação, mas geralmente não devem ser a única fonte.
Garrett Hall
"Mas, olhando para o nosso código, vejo que obviamente não conseguimos implementar testes de unidade dessa maneira". ...? O que significa que seus testes de unidade não são compreensíveis como código de exemplo?
Steven Jeuris
@StevenJeuris Temos muitos testes de unidade c ++, e alguns são longos (mais de 30 linhas). Nunca examinei testes de unidade para ver como a classe é usada. Para isso, usei a documentação doxygen que possuímos e o código (onde uma classe específica é usada), e tentei entender a partir do código da classe o que ela está fazendo. Isso é uma coisa nova para mim #
217

Respostas:

10

Se você estiver aplicando TDD, cada teste de unidade que você escreveu corresponderá à funcionalidade de uma classe. Então, ao escrever testes, você está realmente criando as funcionalidades da classe, dependências, exceções e também a documentação da classe.

Se você não está aplicando TDD, os testes de unidade ainda dão uma idéia sobre a classe e o que ela faz. Os nomes dos testes de unidade são muito descritivos, portanto você não precisa criar uma documentação principalmente.

Considere um teste de unidade como

public void Customer_Service_Can_Register_New_Customers(){...}
public void Customer_Service_Cannot_Register_Customers_With_Duplicate_Emails(){...}

Estes são métodos auto-descritivos e fáceis de ler também. Então eles também servem como documentação.

Mert Akcakaya
fonte
4

Os testes de unidade, se bem escritos, servem como documentação de uma classe ou método ou qualquer outra coisa.

Os bem escritos levam a mais compreensão por serem fáceis de descobrir o que estão testando, mas mesmo testes ruins dão ao leitor uma idéia de como a coisa que está sendo testada deve agir e quais coisas o autor achava importante testar.

Heck, sou conhecido por escrever testes de unidade para bibliotecas externas - não porque eles precisam de testes, mas porque quero garantir que meu entendimento da biblioteca esteja correto. E no futuro, se alguém tiver dúvidas sobre como estou usando as coisas, bem, aí está meu entendimento, diretamente no código do teste.

Michael Kohne
fonte
3
Boa sugestão sobre testes de código externo!
1
Os testes que verificam sua compreensão de uma biblioteca são conhecidos como Testes de Caracterização .
Carl Manaster
2
@CarlManaster - Acho que gosto mais do termo Teste de Aprendizagem - sei que o Feathers os agrupa nos testes de caracterização, mas acho útil distinguir os testes que permitem alterar algo com segurança (testes de caracterização) dos testes que apenas dizem você sobre alguma coisa.
Michael Kohne
2

Embora os testes funcionais possam ajudá-lo a entender toda uma parte da funcionalidade, um teste de unidade pode ajudar a entender um pequeno escopo de código (como um único método).

Bons testes de unidade também servirão como boa documentação técnica e existem algumas coisas que podem ajudar a escrever testes bons, simples e úteis. Os dois pontos mais importantes que encontrei são

  • Verifique se todos os seus testes são independentes. Você deve poder executar qualquer subconjunto de testes, em qualquer ordem.

  • Certifique-se de testar apenas uma coisa em cada teste. Isso mantém seus testes específicos, simples, mas não quebradiços.

Oleksi
fonte
2

A idéia de testes como critérios / documentação de aceitação é excelente. No entanto, os testes de unidade tendem a se concentrar no design da arquitetura / código, e não nas histórias do usuário - tentar documentar casos de uso ou requisitos de nível superior pode ser complicado. Ainda não procurei muito nisso, mas o Behavior Driven Development pode ajudar com esse problema.

ptyx
fonte
1

Acho exemplos muito mais fáceis de aprender do que a documentação e os testes de unidade servem muito bem. Não apenas isso, mas eles me mostram, por exemplo, o que NÃO fazer com uma unidade.

No entanto, eles não podem ser a única forma de documentação. É preciso perceber que todos os cérebros funcionam de maneira diferente. Acho que as pessoas que recomendam usar apenas os testes de unidade como sua documentação ou APENAS o código perdem completamente. Ainda mais pungente é o fato de que mesmo cérebros únicos aprendem coisas diferentes de diferentes mídias. Aprendo algo completamente diferente em um diagrama de classes do que apenas vendo código ou lendo documentos da API.

Mas no final das contas, se diagramas e documentos da API são tudo o que você tem, provavelmente eu estou ferrado. Eu preciso de exemplos Eu preciso ver algo sendo usado. Eu posso pesquisar o código para isso, e sem outros exemplos, é com isso que eu estou preso, mas isso nunca me diz tanto quanto um bom teste de unidade.

Edward Strange
fonte
0

Hoje, testar é uma bagunça de terminologia, onde pessoas diferentes significam coisas ligeiramente diferentes, e as definições mudaram ao longo do tempo.

Por exemplo, o TDD costumava ser algo que agora é chamado de BDD. A distinção se deve ao fato de que o teste de unidade através do desenvolvimento orientado a teste é agora uma abordagem muito mais refinada aos métodos de teste (geralmente gerados por ferramentas automatizadas). O que costumava ser TDD era uma maneira um pouco mais grossa de testar unidades do tamanho de classes, o que eu acho que agora é chamado de teste funcional.

A idéia de que você pode usar (alguma forma de) teste é que você pode escrever um teste parecido com o que o usuário usaria uma unidade do seu código. Torna-se um exemplo para os documentos e um teste ao mesmo tempo.

Portanto, se você tivesse uma classe de rede simples (por exemplo). Em vez de testar cada método individualmente, você abordaria o teste de que a classe é a unidade que precisa ser testada. Em seguida, seu teste de unidade exercitaria a unidade inteira chamando o método para inicializar o objeto, configurando o host e a porta e chamando um método para enviar dados, possivelmente chamando também um método para receber.

Tudo o que pode caber em um único 'teste de unidade' que testaria o objeto, definindo-o em um estado configurado e fazendo com que ele fizesse algum trabalho. Testes de unidade adicionais o exercitariam com dados incorretos, mas você não precisa colocá-los na documentação.

Hoje, isso não é considerado teste de unidade, mas tudo se resume à sua definição de unidade.

gbjbaanb
fonte
Teste de unidade e teste funcional são coisas diferentes. Se você começar a abrir e fechar conexões e usar recursos reais, estará realizando testes funcionais e esses testes serão lentos, enquanto os testes de unidade precisam ser muito rápidos.
BЈовић
1
Você comprou o hype dos testes de unidade. Eles não devem ser pequenos, rápidos ou qualquer outra coisa que não seja um meio de testar uma unidade de código isoladamente. Todo o resto é feito para fazer com que as ferramentas incluídas pareçam corretas. Eles podem ser lentos e administrados diariamente, e grandes e cheios de exemplo para trabalhar uma classe completamente. Não há uma definição simplista de um teste de unidade. Não se prenda a uma definição arbitrária do que você deve fazer, teste seu código isoladamente, zombando ou stubbing de conexões externas e você tem um bom teste.
Gbjbaanb