Las pruebas unitarias durante la revisión del código son un mal sustituto de las pruebas unitarias durante el desarrollo.
Lo que estás sugiriendo tiene mucho sentido, intuitivamente. ¿Para qué es la revisión? Para comprobar que el código es bueno. ¿Para qué son las pruebas? Para comprobar que el código es bueno. Entonces, ¿por qué no combinar los dos?
Este es el por qué.
Poner el código a prueba es un trabajo duro. Escribir código que solo funciona en la única cosa que debe hacer es una cosa; escribir código que pueda ser probado de manera efectiva y eficiente es otro. El solo hecho de que el código ahora se ejecuta bajo dos escenarios: "trabajo real" y "prueba", exige una flexibilidad mucho mayor, exige que ese código sea capaz de mantenerse por sí solo de manera significativa.
Escribir su código para que sea comprobable es un trabajo y habilidad adicionales. Refactorizar el código de otra persona para la comprobabilidad, cuando no se escribió teniendo en cuenta la comprobabilidad, puede ser una tarea importante.
Estás duplicando el esfuerzo entre el desarrollador y el revisor. Presumiblemente, su desarrollador no está entregando su código para su revisión sin al menos un cierto nivel de confianza de que está funcionando. Él ya necesita probar el código. Ahora, hay diferentes niveles y alcances de pruebas. QA prueba el código después del desarrollador y el revisor. Pero sea cual sea el alcance que considere apropiado para el desarrollador y el revisor, no tiene sentido que el desarrollador descubra cómo probar el código a ese nivel una vez , sino que haga que sus pruebas sean descartables y difíciles de reproducir, y luego lleve al revisor a desarrollar prueba nuevamente, esta vez las que son automatizadas y reproducibles. Solo hace que ambos inviertan tiempo en escribir las mismas pruebas, una vez mal, una vez bien.
Estás convirtiendo la revisión en un paso mucho más largo y laborioso. Si las pruebas son una parte importante del proceso de revisión, ¿qué sucede cuando algunas pruebas fallan ? ¿El revisor es responsable de ejecutar todas las pruebas, por lo que también necesita depurar el código? ¿O va a ser sometido a ping de ida y vuelta, una prueba de escritura y la otra haciendo que pasen?
A veces puedes escribir un montón de pruebas que son ortogonales entre sí, por lo que no necesitas hacer ping-pong. El revisor escribe una docena de pruebas, la mitad de ellas fallan, el desarrollador corrige los errores y todas las pruebas siguen siendo válidas y pasan ahora. Pero ... muchas veces, tienes errores de bloqueo, o errores que requieren rediseño y cambios de API, o cualquier otra cosa. Si usted está asumiendo la responsabilidad de pasar las pruebas entre el revisor y el desarrollador, entonces no está realmente en la etapa de revisión. Aún te estás desarrollando.
La necesidad de escribir exámenes no incentiva una revisión más exhaustiva. Básicamente significa que cuanto más profundo vayas, más pruebas tienes que escribir, y probablemente serán pruebas difíciles que deben profundizar en el sistema.
Compárese con el desarrollador que escribe las pruebas, donde está su incentivo: si no escribo pruebas importantes, el revisor lo señalará en la revisión.
Incluso el revisor tendrá una mejor comprensión del sistema si necesita revisar minuciosamente el código , y si necesita decidir por sí misma cuándo puede dejar de escribir una prueba de excavación profunda y simplemente aceptar la revisión del código.
Si el desarrollador no escribe pruebas unitarias, el revisor tampoco lo hará. Existen muchos obstáculos para adoptar las pruebas como una práctica común. Tal vez estás bajo demasiada presión, y tu base de código es difícil de poner a prueba. Tal vez no tenga tanta experiencia en las pruebas y sienta que no puede permitirse la curva de aprendizaje. Tal vez tienes un asesino con hacha que envía notas amenazantes a las personas que escriben pruebas. ¡No lo sé!
Pero sea cual sea la causa, es seguro apostar que se aplica por igual al revisor y al desarrollador. Si el equipo está estresado, el revisor no tiene más tiempo que el desarrollador (si lo hace, redistribuya el trabajo para que la gente no esté tan estresada ). Si nadie sabe cómo escribir bien las pruebas unitarias, el revisor probablemente tampoco (si lo sabe, debería sentarse y enseñar a sus compañeros de equipo ).
Esta sugerencia suena como tratar de pasar el dinero de un colega a otro. Y simplemente no veo ninguna manera de que eso funcione bien, en primer lugar porque es realmente difícil (y poco saludable) crear una situación en la que una persona es la única que puede hacer pruebas, y otra persona no puede hacer cualquier prueba en absoluto.
Lo que sí funciona es que la revisión cubra las pruebas también. Si el desarrollador ya ha escrito diez pruebas, es mucho más probable que el revisor pueda ayudar a sugerir otras diez, que si el desarrollador no hubiera escrito ninguna.
Y, si probar casos clave es una tarea importante, podría tener sentido distribuirlo más ampliamente en todo el equipo. ** Una vez que el código es comprobable en primer lugar, escribir más pruebas se vuelve mucho más fácil. ** **
La revisión es un buen momento para detectar casos de esquina. Y, si el revisor puede entrar y escribir una prueba para los casos de esquina que encuentra, entonces, ¡ojalá! ¡Mucho mejor! Pero en general, suponiendo que el revisor puede escribir pruebas donde el desarrollador no parece una idea muy mala.