As melhores práticas sempre têm um objetivo, uma razão por trás delas. É sempre uma boa ideia considerar esses motivos em seu design - especialmente quando você está tentando decidir como e quão difícil seguir essas práticas recomendadas.
Nesse caso, o principal raciocínio por trás de tornar cada teste de teste uma coisa única é que, se a primeira coisa falhar, a segunda não será testada. Como muitos formadores de opinião parecem encontrar mérito em dividir tudo ao mínimo possível e envolver o máximo possível de inchaços, isso deu origem à ideia de que todo teste deveria conter uma única afirmação.
Não siga isso cegamente. Mesmo que todo teste teste uma coisa, você ainda deve pensar em quão grande ou pequeno cada "coisa" deve ser; para isso, lembre-se de por que deseja que cada teste teste uma coisa - para garantir um bug na primeira coisa não está deixando a segunda coisa não testada.
Então, você precisa se perguntar: "Eu realmente preciso dessa garantia aqui?"
Digamos que haja um erro no primeiro caso de teste - o código de resposta HTTP não é 200
. Então você começa a invadir o código, descubra por que você não obteve o código de resposta que deveria ter e corrija o problema. E agora?
- Se você executar o teste manualmente novamente, para verificar se sua correção resolveu o problema, você deve executar qualquer outro problema oculto pela primeira falha.
- Se você não executá-lo manualmente (talvez porque demore muito?), E apenas pressionar sua correção aguardando o servidor de testes automatizados executar tudo, convém colocar afirmações diferentes em testes diferentes. Os ciclos neste caso são muito longos, portanto vale a pena fazer um esforço para descobrir o máximo de bugs em cada ciclo.
Há mais algumas coisas a considerar:
Dependências de asserções
Eu sei que os testes que você descreveu são apenas um exemplo, e seus testes reais provavelmente são mais complicados - então o que vou dizer pode não ser válido com tanta força nos testes reais, mas ainda pode ser um pouco eficaz para você pode querer considerar.
Se você possui um serviço REST (ou qualquer outro protocolo HTTP) que retorna respostas no formato JSON, normalmente escreve uma classe de cliente simples que permite usar os métodos REST como métodos regulares que retornam objetos regulares. Supondo que o cliente tenha testes separados para garantir que funcione, eu teria abandonado os três primeiros assertivos e ficado com apenas quatro!
Por quê?
- A primeira declaração é redundante - a classe do cliente deve lançar uma exceção se o código de resposta HTTP não for 200.
- A segunda afirmação é redundante - se a resposta estiver vazia, o objeto resultante será nulo ou alguma outra representação de um objeto vazio, e você não terá onde colocar a chave X.
- A terceira afirmação é redundante - se o JSON for inválido, você receberá uma exceção ao tentar analisá-lo.
Portanto, você não precisa executar todos esses testes - basta executar o quarto teste e, se algum dos erros das três primeiras tentativas de detectar acontecer, o teste falhará com uma exceção apropriada antes mesmo de você obter a afirmação real.
Como você deseja receber os relatórios?
Digamos que você não receba emails de um servidor de teste, mas, em vez disso, o departamento de controle de qualidade executa os testes e o notifica de falhas nos testes.
Jack do controle de qualidade bate à sua porta. Ele diz que o primeiro método de teste falhou e o método REST retornou um código de resposta incorreto. Você agradece e começa a procurar a causa raiz.
Depois vem Jen do controle de qualidade e diz que o terceiro método de teste falhou - o método REST não retornou um JSON válido no corpo da resposta. Você diz a ela que já está analisando esse método e acredita que a mesma coisa que causou o retorno de um código de saída incorreto também causou o retorno de algo que não é um JSON válido e se parece mais com um rastreamento de pilha de exceção.
Você volta a trabalhar, mas Jim do controle de qualidade chega, dizendo que o quarto método de teste falhou e que não há chave X na resposta ...
Você não pode nem procurar o motivo, porque é difícil olhar o código quando você não tem uma tela de computador. Se Jim fosse rápido o suficiente, ele poderia ter esquecido a tempo ...
Os e-mails do servidor de teste são mais fáceis de descartar, mas ainda assim - você não gostaria de ser notificado apenas uma vez que algo está errado com o método de teste e verificar os logs de teste relevantes?