Unidad 6 / 12

Automatización de pruebas y garantía de calidad

Ganancias:

  • Capacidad para producir pruebas unitarias, de integración y de casos extremos con afirmaciones significativas con IA
  • Capacidad de extraer sistemáticamente cobertura de pruebas, valores límite y escenarios negativos con soporte de IA
  • Capacidad para verificar que las pruebas producidas por la IA realmente verifican el comportamiento y no se limitan a repetir el código existente.

Las pruebas son el mecanismo que demuestra que el software realmente se comporta según lo prometido. Un buen conjunto de pruebas le indica en segundos si un cambio altera algo y le da al ingeniero la libertad de actuar con confianza. La IA acelera la parte más tediosa y más omitida de la redacción de pruebas: generar una multitud de escenarios, puntos de interrupción y casos negativos. Pero aquí hay una trampa furtiva: la IA puede escribir pruebas que verifiquen el comportamiento actual (quizás defectuoso) del código, no su comportamiento supuesto; o puede producir pruebas vacías que siempre pasan, sin verificar nada. El valor de una prueba no está en si pasa, sino en si verifica lo correcto y se pone rojo cuando está mal.

En esta unidad, aprenderá cómo producir pruebas unitarias, de integración y de casos extremos con afirmaciones significativas; cómo extraer sistemáticamente la cobertura de las pruebas, los puntos de interrupción y los escenarios negativos; y veremos cómo se puede comprobar que las pruebas que produce la IA realmente validan el comportamiento.

Conceptos: Pruebas unitarias: prueba una única función/clase de forma aislada. Pruebas de integración: prueba que varias partes funcionan juntas correctamente. Assert: Declaración que comprueba que un resultado es igual a lo esperado; Este es el corazón de la prueba. Cobertura: qué parte del código se ejecuta mediante pruebas; Una alta cobertura no garantiza la calidad.

Producir pruebas significativas

Una buena prueba hace tres cosas claramente: establece un estado, realiza una acción y afirma el resultado. Al imprimir pruebas para la IA, especifique qué comportamiento desea verificar y qué escenarios debe cubrir; De lo contrario, se producen pruebas superficiales que siempre pasan.

  1. Definir el comportamiento a probar. “¿Qué se considera correcto?” Responde la pregunta con claridad.
  2. Pregunta por tipos de escenarios. Condición normal, límite, negativa y de error.
  3. Importar afirmación significativa. No sólo "arrojó un error", sino que "devolvió el valor correcto".
  4. Verifique la precisión de la prueba. ¿La prueba se pone roja cuando descifras el código conscientemente?

Mensaje de generación de prueba integral: "Escriba pruebas unitarias para la siguiente función 'aplicar descuento (monto, cupón)'. Tenga AL MENOS un escenario en las siguientes categorías: (1) cupón válido normal, (2) puntos de interrupción (monto 0, 100 % de descuento), (3) negativo (cupón no válido, monto negativo), (4) caso de error (cupón nulo). Afirme el valor esperado CONCRETO en cada prueba (no solo 'trabajado'). Nombra las pruebas como legibles. Código: [código]"

Mensaje de extracción de valores límite: "Realice un análisis de valores límite para las entradas de esta función. Para cada parámetro, extraiga los valores 'justo en el límite', 'justo debajo del límite', 'justo encima del límite' como una tabla. Luego, enumere los escenarios de prueba que cubren estos límites. No escriba código todavía, solo análisis y lista de escenarios. Función: [firma]"

Precaución: Una cobertura de prueba alta (por ejemplo, 90%) no prueba que el código sea correcto. La cobertura mide cuántas filas se ejecutaron; No es que esas líneas produzcan el resultado correcto. Una prueba sin una afirmación significativa aumenta la cobertura pero no garantiza nada. El contenido de la afirmación determina la calidad, no el número de afirmaciones.

Probar la prueba en sí: la lógica de la mutación

La forma más práctica de comprender si la prueba generada por IA realmente funciona es descifrar deliberadamente el código (lógica de prueba de mutaciones). Invierta una condición, haga un signo + -; Si ninguna prueba se pone roja, sus pruebas en realidad no mantienen ese comportamiento.

Mensaje de búsqueda de vulnerabilidad de prueba: "Dígame qué errores potenciales en este código NO PUEDEN detectar las siguientes pruebas. Sugiera 5 pequeñas mutaciones que podrían realizarse en el código (por ejemplo, >= en lugar de >, - en lugar de +) e indique para cada una si las pruebas existentes lo detectarían. Para aquellos que no lo detectaron, sugiera pruebas que deberían agregarse. Código: [código] Pruebas: [prueba]"

Aviso débil / Aviso fuerte

DÉBIL: "Escribe una prueba para esta función". (Resultado: generalmente un escenario feliz, afirmación débil; omite errores.) FUERTE: "Escriba una prueba para esta función 'contraseñaStrong'. Regla: se requieren al menos 8 caracteres, 1 letra mayúscula, 1 dígito. Cubra los siguientes escenarios como pruebas SEPARADAS: exactamente 8 caracteres (límite), 7 caracteres (por debajo del límite), sin letras mayúsculas, sin dígitos, cadena vacía, solo espacios, demasiado largos (1000 caracteres) Afirme explícitamente el valor verdadero/falso esperado en cada prueba y nombrar la prueba de acuerdo con lo que verifica."

Un potente mensaje proporciona reglas y escenarios con límites completos. Los pares de límites como "exactamente 8/7 caracteres" son los lugares más comunes para cometer errores (confundiendo > con >=). Un aviso débil sobrepasa estos límites y lleva el error a producción.

Tipos de pruebas y dónde utilizarlas

Tipo de prueba

¿Qué confirma?

Contribución de la IA

Atención

unidad

Función/clase única

Genera múltiples escenarios rápidamente

Se requiere afirmación significativa

integración

Partes trabajando juntas

Escenario y borrador de datos simulados

Verdadero comportamiento adictivo

finalizar/aceptar

Todo el flujo de usuarios

Lista de pasos y expectativas

propenso a la fragilidad

regresión

El antiguo error no regresa

Pruebas específicas de fallas

Debe agregarse a cada solución

Mini casos

Caso 1: La prueba que siempre pasa. La IA escribe 12 pruebas en una función y todas pasan. El ingeniero sospecha y distorsiona deliberadamente el valor de retorno de la función; Sólo 3 de las pruebas se vuelven rojas. Las otras 9 pruebas no contienen afirmaciones significativas. Las pruebas se ven reforzadas por la búsqueda de mutaciones; La protección real se obtiene en 9 escenarios.

Caso 2: error de límites. Una función de verificación de edad debería decir "18 años o más es válido", pero se escribe >18, lo que significa que se rechaza la edad de 18 años. El error aparece inmediatamente en las pruebas porque la IA genera el escenario "exactamente 18" a través del análisis de puntos de interrupción. Una prueba de límite único evita quejas de usuarios reales.

Caso 3: Arreglar el comportamiento actual. Cuando se le dice a la IA que "escriba una prueba basada en este código", produce una prueba que acepta como "correcto" un error de redondeo que ya existe en el código. Cuando el ingeniero imprime la prueba según el requisito (valor correcto esperado) y no el código, la prueba se vuelve roja y se produce el error real. Las pruebas deben derivarse de las expectativas, no del código.

Errores comunes

  • Afirmar sin sentido. "No arrojó un error" no es suficiente; Se debe verificar el valor correcto.
  • Confundir alcance con calidad. Una cobertura alta no es garantía de resultados precisos.
  • Impresión de la prueba por código. Corrige el error actual a "verdadero"; Las pruebas deben derivar de las expectativas.
  • Saltarse valores límite. Confundir > con >= es el error más común; Se deben probar los pares de límites.
  • No auditar la prueba en sí. Una prueba que no se pone roja cuando se descifra el código no proporciona protección.

En resumen

Un buen conjunto de pruebas es la clave para realizar cambios con confianza. La IA genera rápidamente multitud de escenarios, límites y situaciones negativas; Pero si deriva pruebas del código en lugar de requisitos, puede corregir errores existentes o escribir pruebas sin sentido que siempre pasan. Afirme el valor esperado concreto en cada prueba, incluya pares enlazados y verifique que sus pruebas realmente protejan al descifrar deliberadamente el código. El contenido de la afirmación, no el número de ámbitos, determina la calidad.

Tarea de aplicación

Seleccione una función y haga que genere pruebas en cuatro categorías (normal, límite, negativo, error) con un mensaje de generación de pruebas integral; Haga que se afirme el valor esperado concreto en cada prueba. Luego ejecute el mensaje de búsqueda de vulnerabilidades de prueba, sugiera 5 pequeñas mutaciones en el código y ejecute las pruebas para verificar cuáles detectan. Agregue una nueva prueba para al menos una mutación que no fue detectada y muestre que ahora está en números rojos.

lista de verificación

  • [] Imprimí las pruebas en función del comportamiento esperado/correcto, no del código.
  • [] Cubrí escenarios normales, límite, negativos y de error.
  • [] Afirmé el valor esperado concreto en cada prueba.
  • [] Probé pares de bordes (justo arriba-abajo / justo arriba-abajo).
  • [] Al descifrar deliberadamente el código, confirmé que las pruebas se pusieron rojas.
  • [] Agregué una nueva prueba para mutaciones no detectadas.