- Estoy hablando de pruebas unitarias en el sentido TDD. (No es una "integración" automatizada, o lo que le gusta llamar pruebas).
- Código heredado como en: código (C ++) sin pruebas. (ver: Michael Feathers ' Trabajando efectivamente con código heredado )
- Pero también el código heredado como en: Código con el que nuestro equipo ha estado trabajando durante los últimos 10-5 años, por lo que a menudo tenemos una muy buena idea de dónde poner las cosas para cambiar algo.
- Tenemos pruebas unitarias (a través de Boost.Test) para algunos módulos que vinieron más tarde o que han sido "naturales" para pruebas unitarias (contenedores específicos de aplicaciones comunes, elementos de cadena, ayudantes de red, etc.)
- Todavía no tenemos pruebas de aceptación automatizadas adecuadas.
Ahora, recientemente tuve el "placer" de implementar 3 nuevas funciones orientadas al usuario.
Cada uno de ellos me tomó aproximadamente 1-2 horas para ponerme al día con las partes del código que necesitaba cambiar, 1-2 horas para implementar el (pequeño) código que necesitaba cambiar y otras 1-2 horas para asegurarme de que la aplicación funcionó correctamente después e hizo lo que se suponía que debía hacer.
Ahora, realmente agregué un pequeño código. (Creo que hay un método y algunas líneas de llamada para cada función).
Factorizar el código (a través de cualquiera de los métodos sugeridos en WEwLC ), de modo que una unidad de prueba hubiera algún sentido (y no ha sido una tautología completa) habría fácilmente tomado otras 2-4 horas, si no más. Esto habría agregado un 50% -100% de tiempo a cada función, sin beneficio inmediato, ya que
- No necesitaba la prueba unitaria para entender nada sobre el código
- La prueba manual es la misma cantidad de trabajo, ya que aún necesito probar si el código está integrado correctamente en el resto de la aplicación.
De acuerdo, si , más adelante, "alguien" vino y tocó ese código, teóricamente podría obtener algún beneficio de esa prueba de unidad. (Solo teóricamente, ya que esa isla de código probada viviría en un océano de código no probado).
Entonces, "esta vez" decidí no hacer el trabajo duro de agregar una prueba unitaria: los cambios en el código para obtener esas cosas bajo prueba habrían sido significativamente más complejos que los cambios en el código para implementar la función correctamente (y limpiamente).
¿Es esto algo típico para código heredado fuertemente acoplado? ¿Soy flojo / establecemos las prioridades equivocadas como equipo? ¿O soy prudente, solo probando cosas donde la sobrecarga no es demasiado alta?