Adelante
He leído muchas cosas antes de hacer esta pregunta, incluidas muchas preguntas relevantes aquí en SE:
- (Ingeniería de software SE) Escribir pruebas para código cuyo propósito no entiendo
- (Ingeniería de software SE) El equipo de principiantes de pruebas unitarias necesita una prueba unitaria
- (Ingeniería de software SE) Mejores prácticas para actualizar código heredado con pruebas automatizadas
- (Ingeniería de software SE) ¿Cómo realizar pruebas unitarias de sistemas heredados grandes?
- (Publicación de blog) Cómo simular su entorno de Prueba de unidad
Sin embargo, no puedo evitar sentir que aún no he rascado la picazón después de leer para pedir ayuda.
TL; DR
¿Cómo escribo pruebas unitarias para código heredado que no puedo ejecutar, simular, leer o entender fácilmente? ¿Qué pruebas de regresión son útiles para un componente que presumiblemente funciona según lo previsto?
La imágen completa
Vuelvo a ser pasante de verano nuevamente mientras estoy haciendo la transición a la escuela de posgrado. Mi tarea implica estos requisitos:
- Para un producto en particular, evalúe si nuestro equipo de software puede actualizar su versión IDE y JUnit sin perder la compatibilidad con sus proyectos existentes.
- Desarrolle pruebas unitarias para algún componente en el código Java existente (en gran medida no es Java). Queremos convencer al equipo de software de que las pruebas unitarias y TDD son herramientas invaluables que deberían utilizar. (Actualmente hay un 0% de cobertura de código).
- De alguna manera, termine los días de codificación de vaquero para un sistema crítico.
Después de obtener una copia del código fuente, intenté compilarlo y ejecutarlo, para poder entender qué hace este producto y cómo funciona. No pude Le pregunté a mis supervisores cómo me iba, y me dieron una nueva máquina independiente capaz de construirlo, incluidos los scripts de compilación que realmente funcionan. Eso tampoco funcionó porque, como deberían haber esperado, su código de producción solo se ejecuta en el sistema integrado para el que está diseñado. Sin embargo, tienen un simulador para este propósito, por lo que obtuvieron el simulador y me lo pusieron en esta máquina. El simulador tampoco funcionó. En cambio, finalmente recibí una copia impresa de una GUI para una pantalla en particular. Tampoco tienen comentarios de código en ningún lugar dentro del 700 LOC de Java, lo que hace que sea aún más difícil de entender. Además, hubo problemas al evaluar si sus proyectos eran compatibles o no con IDE más nuevos. Particularmente, su código no se cargó correctamente en la versión IDE que usan.
Mi inventario se ve así:
- NetBeans 8, 9, 10, 11
- JUEGO 4, 5
- Su código fuente para un producto en particular (incluye más de 700,000 Java LOC)
- Prácticamente no hay comentarios de código (ocasionalmente una firma)
- No hay pruebas existentes
- Una foto física de una ventana GUI
- Un documento de diseño de software (109 p.) Que no discute el componente en la imagen
Al menos tengo suficiente para escribir teóricamente pruebas que puedan ejecutarse. Entonces, probé una prueba de unidad básica en este componente mencionado. Sin embargo, no pude inicializar los objetos que tenía como dependencias, que incluían modelos, gerentes y conexiones de base de datos. No tengo mucha experiencia en JUnit más allá de las pruebas unitarias básicas, así que sígame en la siguiente sección.
Lo que aprendí de mi lectura
- Burlarse: si escribo una prueba unitaria, es probable que necesite tener variables simuladas para dependencias de producción que no puedo inicializar fácilmente
setUp
. - Todos aquí sugieren generosamente el libro "Trabajando efectivamente con código heredado" de Michael Feathers.
- Las pruebas de regresión son probablemente un buen lugar para comenzar. No creo que tenga suficiente armamento para intentar las pruebas de integración, y las pruebas de regresión proporcionarían más gratificación instantánea a nuestro equipo de software. Sin embargo, no tengo acceso a sus errores conocidos; pero, posiblemente podría preguntar.
Y ahora un intento de articular la incertidumbre que todavía tengo como una pregunta. Esencialmente, no entiendo cómo parte de escribir estas pruebas. Asumiendo que no recibo ninguna guía adicional de mis supervisores (probablemente), está en mi estadio no solo aprender qué hace este componente sino también decidir qué pruebas son realmente útiles como pruebas de regresión.
Como profesionales que han trabajado con proyectos como este por más tiempo que yo, ¿pueden ofrecer alguna guía sobre cómo escribir pruebas unitarias en este tipo de situación?
How do I write unit tests for legacy code that I can't build, run, simulate, read about, or otherwise understand?
No puedes. Al menos debe saber cuál es la salida esperada para una entrada dada.