Estou começando no mundo dos testes de software e gostaria de saber algumas coisas:
- Quais classes devo testar e como devo testa-las?
- Quando temos uma interface repository(que implementa o jpa), uma interface service(com os métodos) e uma interface service implmentation, qual dessas classes devo testar?
- Quando e onde devo usar os mocks?
- Quais são as boas práticas?
- Quais classes devo testar e como devo testa-las?
Partindo do princípio que testes unitários são feitos para testar a menor parte de um código e que esta é um método, crio testes somente para aqueles dos quais eu fiz a lógica. Ou seja, não há porque eu criar um teste para para um getter, ou um toString, por exemplo. Ou então qualquer outro métro que venha de uma API externa.
É o seguinte: sou responsável somente pelo que eu crio, o que outras pessoas criaram, elas que testem.
- Quando e onde devo usar os mocks?
Exatamente quando um teste unitário passa a ser um teste de integração. Isso é, quando o que estamos a testar tem dependências externas como dados vindo do banco, ou de API externa por exemplo.
Para podermos simular esses dados podemos criar objetos fake, que é mais simples de criar e muito mais trabalhoso e complicado de gerir. Daí a ideia de utilizarmos objetos mock. Dos quais há frameworks para isso, eu utilizo o PowerMock, que dá várias funcionalidades que me ajudam no dia a dia.
- Quais são as boas práticas?
- Foque-se somente no necessário para o teste passe.
- Um teste deve testar somente um método.
- Deixe seu teste com uma rastreabilidade alta. Escreva-os de forma que quando algum deles falhar, você saiba logo que cara o que é ao invés de ficar perdendo tempo descobrindo o que é ou se somente aquele falhou. Pode fazer isso com testes separados ou parametrizados, depende da necessidade. não sou um purista que acha que cada teste só deve ter um Assert() mas a grosso modo, quanto mais asserts tem em um único teste menos rastreável ele fica.
- javadocs para suas classes e métodos de teste.
-
@DisplayName() também ajuda muito
- Se possível, adote o TDD. Ele garante que o teu código manter-se-á sempre o mais simples possível.
- Siga o princípio FIRST
- Quando temos uma interface repository(que implementa o jpa), uma interface service(com os métodos) e uma interface service implmentation, qual dessas classes devo testar?
Como eu disse no primeiro tópico, somente aquelas das quais há lógica tua implementada. Naquelas que há somente chamada de métodos que já vem da própria API não há porque testar.