Os testes de unidade durante a revisão de código são um mau substituto para os testes de unidade durante o desenvolvimento.
O que você está sugerindo faz muito sentido, intuitivamente. Qual é a revisão? Para verificar se o código está bom. Para que servem os testes? Para verificar se o código está bom. Então, por que não combinar os dois?
Aqui está o porquê.
Colocar o código em teste é um trabalho árduo. Escrever código que simplesmente funciona com a única coisa que deve fazer é uma coisa; escrever código que possa ser testado de maneira eficaz e eficiente é outro. Apenas o fato de o código agora ser executado em dois cenários - "trabalho real" e "teste" - exige muito mais flexibilidade, exige que esse código seja capaz de se sustentar por si próprio de maneira significativa.
Escrever seu código para que seja testável é um trabalho e habilidade extra. Refatorar o código de outra pessoa para testabilidade, quando não foi escrito com a testabilidade em mente, pode ser uma tarefa importante.
Você está duplicando o esforço entre o desenvolvedor e o revisor. Presumivelmente, seu desenvolvedor não está entregando seu código para revisão sem pelo menos algum nível de confiança de que está funcionando. Ele já precisa testar o código. Agora, existem diferentes níveis e escopos de teste. O controle de qualidade testa o código após o desenvolvedor e o revisor. Mas qualquer que seja o escopo que você considere apropriado para o desenvolvedor e o revisor, não faz sentido para o desenvolvedor descobrir como testar o código nesse nível uma vez , mas torne seus testes descartáveis e difíceis de reproduzir e, em seguida, leve o revisor para desenvolver teste novamente, desta vez automatizados e reproduzíveis. Você está apenas fazendo com que ambos invistam tempo escrevendo os mesmos testes - uma vez mal, outra bem.
Você está transformando a revisão em uma etapa muito mais longa e trabalhosa. Se o teste é uma parte importante do processo de revisão, o que acontece quando alguns testes falham ? O revisor é responsável por executar todos os testes e, portanto, também precisa depurar o código? Ou será um pingue-pongue de um lado para o outro, um escrevendo testes, o outro fazendo com que eles passem?
Às vezes, você pode escrever vários testes ortogonais entre si, para não precisar de ping-pong. O revisor escreve uma dúzia de testes, metade deles falha, o desenvolvedor corrige os bugs e todos os testes permanecem válidos e passam agora. Mas ... na maioria das vezes, você tem bugs de bloqueadores, ou que exigem alterações de redesenho e API, ou outros enfeites. Se você está assumindo a responsabilidade de passar nos testes entre o revisor e o desenvolvedor, não está realmente na fase de revisão. Você ainda está desenvolvendo.
A necessidade de escrever testes não incentiva uma revisão mais completa. Basicamente, significa que, quanto mais fundo você vai, mais testes você precisa escrever e provavelmente serão testes difíceis que precisam se aprofundar no sistema.
Compare com o desenvolvedor que está escrevendo os testes, onde está seu incentivo: se eu não escrever testes importantes, o revisor indicará isso na revisão.
Mesmo o revisor terá uma compreensão muito melhor do sistema se precisar passar por testes completos do código , se precisar decidir por si próprio quando pode parar de escrever o teste de escavação profunda e apenas fazer a revisão do código.
Se o desenvolvedor não estiver escrevendo testes de unidade, o revisor também não. Existem muitos obstáculos para a adoção de testes como uma prática comum. Talvez você esteja sob muita pressão e seja difícil colocar sua base de código em teste. Talvez você não seja tão experiente em testes e sinta que não pode pagar a curva de aprendizado. Talvez você tenha um assassino em machado enviando notas ameaçadoras para as pessoas que fazem testes. Eu não sei!
Seja qual for a causa, é seguro apostar que se aplica igualmente ao revisor e ao desenvolvedor. Se a equipe está estressada, o revisor não tem mais tempo do que o desenvolvedor (se tiver, redistribua o trabalho para que as pessoas não fiquem tão estressadas ). Se ninguém souber escrever bem os testes de unidade, o revisor provavelmente também não (se souber, deve sentar-se e ensinar aos colegas de equipe ).
Essa sugestão parece tentar passar a bola de um colega para outro. E eu simplesmente não vejo nenhuma maneira de isso dar certo, em primeiro lugar, porque é realmente difícil (e doentio) criar uma situação em que uma pessoa é a única que pode fazer testes e outra não pode fazer qualquer teste.
O que funciona é ter a revisão para cobrir os testes também. Se o desenvolvedor já escreveu dez testes, é muito mais provável que o revisor possa ajudar a sugerir outros dez, do que se o desenvolvedor não tivesse escrito nenhum.
E, se testar casos de esquina é uma tarefa importante, pode fazer sentido distribuí-lo mais amplamente por toda a equipe. ** Uma vez que o código é testável, escrever mais testes se torna muito mais fácil. **
A revisão é um ótimo momento para identificar casos de canto. E, se o revisor puder entrar e escrever um teste para os casos de canto que encontrar, então ei - melhor ainda! Mas de um modo geral, supondo que o revisor possa escrever testes nos quais o desenvolvedor não parece uma péssima idéia.