Unidad 5 / 12

Producción de pruebas y garantía de calidad

Ganancias:

  • Capacidad para producir pruebas unitarias, casos extremos y análisis de brechas de cobertura con IA
  • Capacidad para imprimir expectativas de prueba basadas en la especificación, no en el comportamiento actual del código.
  • Capacidad para comprobar si una prueba realmente protege mediante la inyección de errores.

Escribir pruebas es una de las tareas que genera más valor y que la mayoría de los desarrolladores posponen. Un buen conjunto de pruebas es una prueba de que el código funciona como se esperaba y un salvavidas para cambios futuros. El problema es que redactar exámenes es repetitivo y requiere mucho tiempo: exactamente el tipo de trabajo en el que brilla la IA. Pero hay un problema: la IA a menudo prueba el comportamiento existente del código, no el comportamiento que debería ser. Gestionar esta diferencia es la esencia de esta unidad.

En esta unidad, aprenderá sobre pruebas unitarias (pruebas que prueban una función sola, de forma aislada), pruebas de casos extremos y generación de datos de prueba con IA; cerrar las brechas en la cobertura de las pruebas; y por qué es peligroso confiar ciegamente en las pruebas de IA.

Los dos lados de las pruebas: arreglar el comportamiento versus verificar

Una prueba puede tener dos propósitos diferentes. La primera es la verificación: prueba que el código es correcto, que cumple con la especificación. La segunda es la protección de regresión: congela el comportamiento del código hoy, por lo que si alguien lo cambia accidentalmente mañana, la prueba se interrumpirá y notificará.

La IA es muy buena en esto último; Mira el código y genera casos que prueban "lo que está haciendo en este momento". Pero si el código es incorrecto desde el principio, la IA puede calificar ese comportamiento incorrecto como "correcto". Por lo tanto, debes revisar la afirmación de cada prueba que produce la IA: "El código devuelve 42 y la prueba espera 42" no significa que 42 sea la respuesta correcta.

Precaución: si la IA pasa la prueba, no significa que el código esté "funcionando"; simplemente significa "se comporta como espera la IA". Usted decide si la expectativa es correcta o no mirando las especificaciones.

Paso a paso: redacción de pruebas sólidas con IA

  1. Proporcione la especificación, no solo el código. Si agrega la información "Esta función debería hacer esto", la IA puede escribir la expectativa correcta; Probará el comportamiento actual si solo proporciona el código.
  2. Pregunte por casos extremos. Vacío, nulo, cero, negativo, demasiado grande, mal formato, concurrencia: reclame explícitamente fuera del camino feliz.
  3. Especifique el marco y el estilo de la prueba. "usar pytest", "patrón Organizar-Actuar-Afirmar", "dejar que cada prueba pruebe una cosa", etc.
  4. Verificar expectativas (afirmación). Compare con la especificación que cada afirmación verifica el valor correcto.
  5. Cerrar las brechas en el alcance. Proporcione pruebas existentes y pregunte "¿qué ramas y casos no se han probado?" hacerte preguntar; luego verifique las pruebas adicionales realizadas.

Tres mini estuches

Caso 1: Cobertura del 52% al 85%. La cobertura de prueba de un módulo de servicio fue del 52%. El equipo alimentó las pruebas existentes a la IA, le pidió que enumerara las ramas no probadas y generara pruebas para ellas. Con revisión humana, la cobertura aumentó al 85%; En el proceso, la IA descubrió un error real (una ruta que devolvía un código de error incorrecto) en una rama de error que nunca antes se había probado.

Caso 2: La trampa de la fijación de falsas expectativas. En realidad, una función de redondeo de dinero era incorrecta; En lugar de redondear 2,675 a 2,67, se redondeó 2,67 en lugar de 2,68. La IA miró el código y escribió afirmar round_money(2.675) == 2.67, congelando el error como "verdadero". Cuando el desarrollador leyó la especificación, corrigió las expectativas y detectó el error real. Probar la regla, no el código, marcó la diferencia.

Caso 3: explosión del estado de borde. Cuando se le solicita a la IA solo “casos extremos” para una función de rango de fechas; Produjo 8 casos, como inicio = fin, intervalo inverso, año bisiesto 29 de febrero, diferentes zonas horarias e intervalo nulo. Dos de ellos (espaciado inverso y año bisiesto) en realidad estaban causando el error. A menudo se omite considerar estos casos manualmente; La IA se convirtió aquí en un socio de “lluvia de ideas de casos extremos”.

Cuatro plantillas copiables

Generación de pruebas basada en especificaciones:

Rol: desarrollador que escribe pruebas. Marco: {{pytest/JUnit/Jest...}}. Qué DEBE HACER la función (especificación): {{rule}}Escribe pruebas para la siguiente función. Escriba las expectativas de acuerdo con la especificación, NO con el resultado actual del código. Camino feliz + agregue al menos 4 casos extremos. Deje que cada prueba pruebe una cosa, use un nombre descriptivo. {{función}}

Lluvia de ideas sobre casos extremos:

Enumere los casos de borde/fallo que se deben probar al probar esta función (nulo, nulo, puntos de interrupción, formato incorrecto, concurrencia, error externo). Para cada caso: entrada, comportamiento esperado. NO escriba código todavía, solo enumere.{{function}}

Análisis de brechas de cobertura:

A continuación se muestran las funciones y pruebas disponibles. ¿Qué ramas, condiciones y casos no han sido probados? Enumere las deficiencias y escriba nuevas pruebas solo para las deficiencias. No repitas los existentes. Función:{{función}}Pruebas:{{existing_tests}}

Datos de prueba/generación de objetos simulados:

Genere datos de prueba realistas para pruebas de {{función/servicio}}: muestras válidas, muestras de borde y muestras no válidas por separado. Sugiera un comportamiento simulado simple para la dependencia externa {{X}}. Utilizar datos/PII verdaderamente confidenciales; Generar datos falsos.

Aviso débil / Aviso fuerte

Débil: "Escribe una prueba para esta función".
Fuerte: "con pytest. Función apply_discount(total, porcentaje) - regla: el descuento debe ser del 0% al 30%, fuera de los límites debe arrojar ValueError, el resultado debe redondearse a 2 decimales. Escriba las expectativas según esta REGLA (no por código). Camino feliz + estos casos extremos: 0%, 30%, 31% (error), negativo, total=0. [código]"

Da la regla de liberación estricta y dice "escriba la expectativa de acuerdo con la regla, no con el código"; Esta única frase cierra la trampa de que la IA solucione el mal comportamiento.

Tipo de prueba

Contribución de la IA

control humano

Pruebas unitarias de camino feliz

esqueleto rápido

¿Es correcta la expectativa?

Casos extremos

Amplia lluvia de ideas

Eliminar lo irrelevante

Relleno de brechas de alcance

Encuentra ramas omitidas

Confirmar importancia

Datos de prueba/simulacro

Produce una muestra realista

Sin PII, control de realismo

Las pruebas gestionan la calidad, no la garantizan

Una alta cobertura de la prueba da confianza, pero también puede ser engañosa: una cobertura del 100 por ciento significa "todas las líneas se ejecutaron", no "todas las líneas son correctas". Es fácil aumentar la cobertura con IA; El valor real está en escribir expectativas significativas. El valor de una prueba es su capacidad para descifrar y alertarle cuando el código se descifra. Es por eso que las pruebas generadas por IA se basan en la pregunta "¿realmente el código se rompe cuando cambia?" Pruébelo con la pregunta; Romper una línea deliberadamente y ver la prueba romperse (idea de mutación) es una prueba de que la prueba funcionó.

Consejo: para ver si una prueba que escribe la IA funciona, cree un pequeño error en el código (por ejemplo, cambie un + por un -) y vea si la prueba falla. Si no se rompe, esa prueba no te protege.

Errores comunes

  • Pidiendo una prueba sin dar la regla. El modelo congela el comportamiento actual; corrige el error como "verdadero".
  • Aceptar expectativas sin leerlas. Las pruebas son engañosas si no se verifica que las afirmaciones estén verificando el valor correcto.
  • Simplemente probando el camino feliz. Los errores reales viven en los márgenes; Solicite explícitamente los casos extremos.
  • Confundir el alcance con el propósito. Un porcentaje elevado no es garantía de un comportamiento correcto.
  • Hacer datos reales/ocultos como datos de prueba. Los datos o secretos del cliente no deben entrar en pruebas ni almacenamiento; Generar datos sintéticos.

En resumen

La IA elimina gran parte de la carga repetitiva de escribir pruebas: produce esqueletos rápidos, grandes listas de casos extremos y análisis de brechas de cobertura. Pero el punto más crítico son las expectativas: la IA tiende a probar el comportamiento actual del código, mientras que las pruebas deben escribirse de acuerdo con la especificación. Dé la regla, verifique las expectativas, aplique casos extremos y pruebe si las pruebas realmente protegen al inyectar un error. La cobertura de la prueba es una herramienta, no un objetivo.

Tarea de aplicación

Seleccione una función y primero imprima una prueba a la IA simplemente dando su código; Tenga en cuenta las expectativas. Luego imprima la prueba nuevamente, dando la especificación (comportamiento requerido) para la misma función. Compare las expectativas de los dos conjuntos de prueba: ¿hay alguna diferencia, cuál revela un error real? Finalmente, verifique que una de las pruebas generadas funcionó agregando un error intencional al código y viendo la interrupción de la prueba.

lista de verificación

  • [ ] Distingo si la prueba es para corregir o verificar el comportamiento.
  • [] Cuando solicito una prueba, doy la regla (especificación) que debería estar vigente, no el código.
  • [] Comparo cada afirmación generada con la especificación.
  • [] Solicito explícitamente casos extremos y de falla.
  • [] Veo la cobertura porcentual como una herramienta, no como un objetivo.
  • [] Pruebo si una prueba realmente protege mediante la inyección de errores.