Como sei se tenho cobertura de teste de unidade suficiente para remover um teste de integração?

15

Estou trabalhando em um sistema legado (com isso quero dizer que foi escrito sem testes). Tentamos testar parte do sistema escrevendo testes de integração que testam a funcionalidade de fora.

Isso me dá certa confiança para refatorar partes do código sem se preocupar em quebrá-lo. Mas o problema é que esses testes de integração exigem uma implantação (mais de 2 minutos) e muitos minutos para serem executados. Além disso, eles são uma dor de manter. Cada um deles cobre milhares de linhas de código e, quando um deles quebra, pode levar horas para depurar o motivo.

Tenho escrito muitos testes de unidade para essas alterações funcionais que venho fazendo ultimamente, mas antes de me comprometer, sempre faço uma nova implantação e executo todos os testes de integração, apenas para garantir que não perdi nada. Neste ponto, eu sei que meus testes de unidade e alguns dos testes de integração estão sobrepostos ao que eles testam.

Como sei quando meus bons testes de unidade estão cobrindo adequadamente um mau teste de integração para que eu possa excluir esse teste de integração?

Daniel Kaplan
fonte

Respostas:

18

A métrica mais fácil é perguntar: "quando foi a última vez que esse teste de integração falhou legitimamente ?" Se já faz muito tempo (houve muitas alterações) desde que o teste de integração falhou, os testes de unidade provavelmente estão fazendo um bom trabalho. Se o teste de integração falhou recentemente, ocorreu um defeito que não foi detectado pelos testes de unidade.

Minha preferência geralmente seria aumentar a robustez dos testes de integração, a ponto de poderem ser executados de forma confiável sem supervisão. Se eles demorarem muito para serem executados, execute-os da noite para o dia. Eles ainda são valiosos, mesmo que sejam executados apenas ocasionalmente. Se esses testes forem muito frágeis ou exigirem intervenção manual, pode não valer o tempo gasto para mantê-los em execução, e você pode considerar descartar aqueles que obtêm sucesso com mais frequência.

Greg Hewgill
fonte
3
+1 por recomendar a automatização dos testes, pois isso leva à pergunta óbvia de "Por que eliminar um teste automatizado?"
1
Sim, eu concordo com isso. Obviamente, mesmo isso ainda o incomoda se você não tiver uma cobertura de teste de unidade suficientemente boa. Por exemplo, atualmente temos um conjunto de testes de integração que leva cerca de 6 horas para ser executado ... mas eu não acho que um teste já foi excluída devido ao foco da minha empresa sobre a compatibilidade
Earlz
2
Talvez eu deva começar uma nova pergunta para isso, mas você sugere que sempre que um teste de integração falhar legitimamente, devo descobrir como escrever um teste de unidade que também falhe e fazer com que ambos passem?
Daniel Kaplan
2
@tieTYT: Sim, isso parece absolutamente uma boa ideia. Os testes de unidade são bons; testes de unidade para coisas que você sabe que já quebraram antes são ainda melhores.
precisa saber é o seguinte
7

Os testes de unidades não são o santo graal dos testes, eles são apenas uma ferramenta de muitos que devem ser usados ​​para testar uma base de código. Portanto, nenhuma quantidade de testes de unidade deve ser considerada segura para substituir outros testes. Se você tiver um teste de integração ruim, deve trabalhar para torná-lo um bom teste de integração, não substituí-lo por outra coisa, como substituir a porta da frente por uma cerca de perímetro e um portão.

Ryathal
fonte
Se esse projeto começasse do zero, isso faria mais sentido para mim. Mas meu primeiro teste de integração foi "verifique se você pode fazer login" e, eventualmente, fiz muitos testes de unidade que "verificaram que você pode fazer login". O teste de integração trava o tempo todo se você alterar o html. Este exemplo é completamente artificial, mas não é um bom caso para remover o teste de integração?
Daniel Kaplan
3
@tieTYT: testar algo através da interface do usuário geralmente leva a uma solução muito instável. No entanto, o teste pela interface do usuário é importante; às vezes, os testes manuais aqui produzem menos esforço do que tentar automatizar esse teste e mantê-lo estável. Portanto, quando achar que esse é o caso aqui, você pode remover esse "teste de integração" da lista de testes automatizados e adicioná-lo ao seu plano de testes manuais.
Doc Brown
@DanielKaplan seria possível atualizar o teste de integração para ficar mais estável? Se ele está falhando porque o html muda, às vezes, então possivelmente algo teste como "aparece de nome de usuário na página após início de sessão", em vez de algo mais específico, como "nome de usuário aparece dentro deste div após o login"
Jen