Unidad 9 / 11

Pruebas de regresión, mantenimiento de pruebas y lucha contra pruebas frágiles

Ganancias:

  • Comprender el propósito de las pruebas de regresión y ser capaz de seleccionar pruebas y producir casos de regresión de acuerdo con los cambios con inteligencia artificial.
  • Capacidad para diagnosticar las causas fundamentales de las pruebas frágiles (momento, dependencia del orden, estado compartido, dependencia externa) y aplicar soluciones permanentes sin suprimir el síntoma.
  • Capacidad para mantener la disciplina de ejecutar el paquete completo de prelanzamiento mientras se mantiene la suite de regresión rápida, independiente y confiable mediante la eliminación de pruebas duplicadas.

El software cambia constantemente; Cada característica nueva, cada solución, puede romper algo que funcionaba antes. La interrupción posterior de una función que anteriormente funcionaba se llama regresión. Las pruebas de regresión consisten en volver a probar la funcionalidad existente con cada cambio para detectar estas degradaciones. Con el tiempo, estos conjuntos de pruebas crecen (miles de pruebas) y surgen dos grandes problemas: el conjunto se ralentiza y las pruebas inestables (pruebas poco confiables que a veces pasan y otras fallan en el mismo código) destruyen la confianza del equipo en los resultados de las pruebas. La inteligencia artificial (IA) es una ayuda poderosa para mantener el conjunto de regresión en buen estado, rápido y confiable. Pero la advertencia central permanece: si bien la IA puede ofrecer "hacer pasar" una prueba frágil, a menudo puede producir un parche que encubre un error real. Su trabajo es encontrar la causa raíz de la inestabilidad, no suprimir el síntoma.

Causas fundamentales de las pruebas frágiles

Las pruebas frágiles son el problema de prueba más insidioso: no son confiables si se aprueban o fallan, lo que empuja al equipo al hábito de "debe haberse atascado de nuevo, ejecutarlo de nuevo", y este hábito algún día ignorará un error real como "inconsistente". Principales causas fundamentales:

  • Condición de cronometraje/carrera: La prueba comprueba el resultado sin esperar a que finalice una operación. La razón más común.
  • Dependencia del orden: las pruebas dependen de los datos que dejan entre sí; Se rompe cuando cambia el orden.
  • Caso compartido: varias pruebas utilizan los mismos datos de prueba/usuario, lo que genera conflictos.
  • Dependencia externa: red real, servicio de terceros, hora del sistema, valor aleatorio.
  • Diferencia de entorno: cambia a local, permanece en CI (entorno de integración continua).
Precaución: Pasar una prueba frágil "reintentando varias veces" a menudo enmascarará un error de concurrencia real. El reintento es una herramienta de diagnóstico, no un tratamiento. Encuentre primero la causa raíz; Utilice el reintento únicamente como último recurso en caso de inestabilidad documentada y verdaderamente externa.

Mantenimiento de pruebas: mantener el paquete sano

La suite de regresión es como un jardín; Si no se cuida, las malas hierbas se apoderarán de él. La IA ayuda en tres tareas de mantenimiento:

1. Limpieza de prueba duplicada/innecesaria. Con el tiempo se acumulan una gran cantidad de casos probando lo mismo. La IA sugiere agrupar y fusionar pruebas similares.

2. Diagnóstico de prueba frágil. Le das a la IA el código de prueba y el patrón de inestabilidad; sugiere posibles causas fundamentales y una solución permanente.

3. Selección/priorización de pruebas. Es costoso ejecutar el paquete completo con cada cambio. Con el análisis de impacto de las pruebas (seleccionando solo las pruebas relevantes según el código modificado), la IA recomienda qué pruebas deben ejecutarse primero. Sin embargo, el paquete completo de prelanzamiento es imprescindible.

Cuarentena: gestionar correctamente las pruebas frágiles

Ha descubierto que una prueba es frágil, pero no tiene tiempo para solucionar la causa raíz de inmediato. ¿Qué hacer? Hay dos formas incorrectas: eliminar la prueba por completo (ese comportamiento ya no se conserva) o silenciarla con un reintento (cubriendo el error real). La forma correcta es poner en cuarentena (separar temporalmente la prueba frágil del paquete principal y rastrearla en una lista separada). Las pruebas en cuarentena no impiden la fusión de versiones, pero siguen siendo una deuda visible y se solucionan periódicamente. El punto crítico es este: la cuarentena es una sala de espera, no un bote de basura. Si la lista de cuarentena crece, es una alarma de que la salud de las pruebas del equipo se está deteriorando. La IA puede revisar periódicamente su lista de cuarentena y agruparla por patrones de causa raíz; Permite soluciones colectivas al revelar causas comunes, como "las 6 pruebas están conectadas al mismo usuario de prueba compartido".

Consejo: agregue un "propietario" y una "fecha de última revisión" a cada registro de cuarentena. La cuarentena abandonada se convierte en un vertedero permanente; Las pruebas frágiles viven allí para siempre porque a nadie le importa.

Tabla de estrategia de regresión

Estado

Estrategia

Papel de la IA

corrección menor

Zona afectada + prueba de humo

Seleccione pruebas relevantes

nueva característica

Módulo relacionado + integración

Proponer un nuevo caso de regresión

gran refactorización

Paquete de regresión completo

Análisis de brechas de cobertura

prelanzamiento

Paquete completo + exploración

Estimación de prioridad y duración.

Solución urgente en vivo

Enfocado + camino crítico

Conjunto mínimo de prueba segura

Aviso débil / Aviso fuerte

Débil: "Esta prueba a veces falla, corríjala".
Fuerte: "Esta prueba falla en 3 de cada 10 ejecuciones, el código no ha cambiado. Diagnostique la causa raíz de la inestabilidad: podría ser tiempo/carrera, dependencia de orden, estado compartido, dependencia externa o diferencia de entorno. Muestre qué línea en la prueba apunta a cada causa posible. Sugiera una solución permanente; NO sugiera una solución que suprima los síntomas como 'agregar reintento'; si es inevitable, escriba claramente el motivo. Prueba: [código]. Rastro de error: [registro]".

Aviso potente; dirige el diagnóstico a la causa raíz y prohíbe explícitamente la supresión de los síntomas.

Cuatro plantillas copiables

1) Diagnóstico de prueba frágil:

Este código de prueba a veces pasa y a veces falla sin cambios. Enumere las causas principales candidatas (raza, dependencia del orden, estado compartido, dependencia externa, reloj/aleatorio, diferencia de entorno) y muestre la línea de evidencia en la prueba para cada una. Sugerir una solución permanente; Marcar la solución supresiva como el reintento como último recurso y con justificación. Prueba: [código] / Patrón de inestabilidad: [cuántas veces en cuántas ejecuciones]

2) Proponer un caso de regresión:

Se realizó el siguiente cambio: [cambio/resumen de relaciones públicas]. Enumere los comportamientos ACTUALES que este cambio rompería y proponga un caso de prueba de regresión para cada uno. Resalte particularmente las áreas de efectos secundarios y dependencias compartidas.

3) Limpieza de pruebas duplicadas:

Consulte el conjunto de pruebas a continuación. Agrupar casos duplicados o superpuestos que prueben el mismo comportamiento; Sugerir cuáles debo conservar y cuáles debo combinar para cada grupo. Advertir si existe riesgo de pérdida de cobertura. Pruebas: [lista/código]

4) Selección del efecto de prueba:

Los siguientes archivos/funciones han cambiado: [lista]. Del conjunto de pruebas existente, seleccione y justifique las pruebas que necesito ejecutar primero (aquellas que están directa/indirectamente vinculadas al código modificado). Nota: recuérdenme que seguiré ejecutando el paquete completo de versión preliminar.

tres mini casos

Caso 1: Error real encubierto por Reintento. Un equipo agregó 3 reintentos a una prueba de pago restante ocasional; La prueba siempre "pasaba" ahora. Al aplicar la "prueba de diagnóstico frágil" se descubrió que la inestabilidad provenía de una condición de carrera real: con una carga alta, la confirmación de pago a veces se procesaba dos veces. Durante meses, Retry ocultó un error que podría haber resultado en una pérdida real de dinero. Causa raíz solucionada, reintento eliminado.

Caso 2: El paquete se encogió, la velocidad aumentó. Un conjunto de regresión de 1.400 pruebas tomó 55 minutos. Con la "limpieza de pruebas duplicadas", 380 pruebas resultaron duplicadas o cubiertas; fusionado. El paquete se redujo a 900 pruebas, el tiempo se redujo a 34 minutos y la cobertura no se redujo de manera apreciable. La retroalimentación más rápida animó al equipo a realizar pruebas con más frecuencia.

Caso 3: Dependencia del pedido. Una prueba siempre pasaría localmente, pero fallaría aleatoriamente en CI. Los diagnósticos de IA mostraron que la prueba dependía del usuario creado por otra prueba, en CI se rompió porque las pruebas se ejecutaron en paralelo/en orden diferente. Cada prueba se realizó para establecer sus propios datos; Se acabó la indecisión.

Errores comunes

  • Silenciar la prueba frágil con reintento. Intentar de nuevo sin buscar la causa raíz; encubriendo el verdadero error.
  • Cultura del "atascado de nuevo". Ignorar rutinariamente los resultados rojos; Un día, saltándose el verdadero error.
  • No podar el paquete en absoluto. Permitir que las pruebas duplicadas se acumulen y ralenticen el paquete.
  • Dependencia entre pruebas. Las pruebas se basan en condiciones/secuencias comunes; fuente de incertidumbre.
  • Probar solo la pieza cambiada y omitir el paquete completo. Acceso directo previo al lanzamiento; Se escapan los efectos secundarios ocultos.
  • Depender de la dependencia externa. Pruebas basadas en la red/reloj/valor aleatorio real; naturalmente inestable.

En resumen

Las pruebas de regresión detectan cambios que rompen funciones que anteriormente funcionaban; Pero a medida que los paquetes crecen, la lentitud y las pruebas frágiles erosionan la confianza. Las causas fundamentales de las pruebas frágiles suelen ser el tiempo, la dependencia del orden, el estado compartido y las dependencias externas. La IA es una poderosa ayuda en el diagnóstico, la limpieza y la selección de pruebas; Pero suprimir la indecisión mediante un nuevo intento encubre errores reales. Encuentre la causa raíz, realice pruebas independientes y deterministas, elimine el paquete con regularidad y ejecute el paquete completo antes de su lanzamiento.

Tarea de aplicación

Elija una prueba de su propio proyecto que sepa que es frágil (o que parezca inestable). Extraiga candidatos de causa raíz y verifique líneas de evidencia en la prueba con la plantilla de “diagnóstico de prueba frágil”. Identifique la causa raíz e implemente una solución permanente sin volver a intentarlo. Luego seleccione 10 pruebas de su paquete y busque aquellas que se puedan combinar con la "limpieza de pruebas duplicadas". Informe cuántas inestabilidades de prueba resolvió desde su causa raíz y cuántos casos innecesarios eliminó de la suite.

lista de verificación

  • [ ] He diagnosticado la causa raíz de la prueba frágil; No suprimí el síntoma.
  • [] Consideré el reintento como un último recurso justificado, no como una cura.
  • [] Hice las pruebas independientes y deterministas (aisladas de dependencias externas).
  • [] Eliminé pruebas duplicadas/innecesarias del conjunto de regresión.
  • [] Elegí realizar la prueba según el cambio, pero ejecuté la versión preliminar del paquete completo.
  • [] Me tomé cada rojo en serio, en contra de la cultura de "atascarse de nuevo, pasar".