Unidad 6 / 11

Generación de Pruebas con Inteligencia Artificial: Pruebas Unitarias, de Interfaz y de Automatización

Ganancias:

  • Capacidad para producir pruebas unitarias, de integración y de UI con inteligencia artificial de acuerdo con la pirámide de pruebas y cubrir situaciones límite y de error, así como escenarios felices.
  • Capacidad para eliminar pruebas vacías/inútiles y cobertura inflada comprobando que cada prueba generada realmente valida un comportamiento.
  • Garantizar que la prueba detecte el error y evite que lo solucione diciéndole a la IA qué debe hacer el código.

Escribir código es la mitad del trabajo; Demostrar que el código funciona correctamente es la otra mitad. Las aplicaciones móviles encuentran cientos de dispositivos, tamaños de pantalla, versiones de sistemas operativos y comportamientos de usuario diferentes. Es imposible probarlos todos manualmente; Es por eso que las pruebas automatizadas (código de prueba, pruebas que se ejecutan sin un clic humano) son la columna vertebral de la calidad móvil. La IA es increíblemente eficiente a la hora de escribir pruebas porque escribir pruebas es exactamente el tipo de trabajo de patrones que le gusta: validar un comportamiento específico para entradas específicas. En esta unidad, aprenderemos cómo acelerar las pruebas unitarias, las pruebas de interfaz y la automatización con IA, pero garantizando la calidad de la prueba a través de ojos humanos.

Pirámide de pruebas: qué probar y cuánto

Una estrategia de prueba saludable se parece a una pirámide. La base incluye una gran cantidad de pruebas unitarias (pruebas rápidas que prueban una sola función o clase de forma aislada); son rápidos y baratos. En el medio hay menos pruebas de integración (probar cómo funcionan varias partes juntas). En la parte superior hay pruebas mínimas de interfaz de usuario/de un extremo a otro (las pruebas se realizan haciendo clic en la pantalla como lo hace el usuario); son realistas pero lentos y frágiles. La IA ayuda en cada capa, pero el mayor valor está en la base: producir rápidamente pruebas unitarias de lógica empresarial.

Tipo de prueba

Alcance

velocidad

Eficiencia de la IA

prueba unitaria

Función/clase única

muy rapido

muy alto

integración

capa intermedia

medio

alto

UI / de extremo a extremo

Toda la transmisión en pantalla

lento

Medio (frágil)

Consejo: cuando le diga a la IA que "genere pruebas para esta función", solicite explícitamente casos extremos: entrada vacía, nulo, número negativo, valor muy grande, error de red. La IA produce fácilmente un camino feliz; Los verdaderos errores se esconden en las fronteras y saltan a la vista si no los quieres ahí.

Pasos para escribir pruebas con IA

  1. Definir el comportamiento a probar. "Esta función debería dar esta salida a esta entrada".
  2. Especifique el marco. JUnit + MockK en Android, XCTest en iOS, Espresso (Android) o XCUITest (iOS) para UI.
  3. Consultar por estados límite. Escenario feliz + error + puntos de interrupción.
  4. Gestionar objetos simulados. Las dependencias externas, como la red y la base de datos, se emulan para realizar pruebas (simulación: simulación controlada en lugar del servicio real).
  5. Ejecute la prueba y verifique. ¿Pasa la prueba? ¿Confirma algo verdaderamente significativo?

El quinto paso es fundamental. La IA a veces produce pruebas inútiles que “siempre pasan”; por ejemplo, una prueba que no verifica nada o comprueba sus propios datos falsos. Una prueba aprobada y una prueba valiosa son cosas diferentes.

Precaución: El hecho de que la IA pueda producir no significa que la prueba sea correcta. A veces, la IA acepta el comportamiento actual (quizás defectuoso) del código como "correcto" y escribe pruebas en consecuencia. Estas pruebas corrigen el error en lugar de detectarlo. Usted determina lo que espera la prueba; Dígale a la IA qué debe hacer, no qué hace el código.

Medida de cobertura de la prueba y falacia

La cobertura de las pruebas (qué porcentaje de código se ejecuta mediante pruebas) es una métrica útil pero engañosa. Una cobertura del 90% indica que se ha ejecutado el 90% del código; pero no se ha comprobado que esas líneas funcionen correctamente. Una prueba que recorre una línea y no verifica el resultado infla el alcance pero no brinda seguridad. El objetivo no son cifras elevadas, sino una validación significativa. Puede ampliar rápidamente la escala con IA, pero asegúrese de que cada prueba realmente pruebe un comportamiento.

tres mini casos

Caso 1: Situación fronteriza detectada. Se pidió a AI que realizara pruebas para una función de transferencia de dinero en una aplicación bancaria, y específicamente se agregaron escenarios de "cantidad negativa" y "más que saldo". La prueba reveló que la transferencia no fue bloqueada con un monto negativo; esto sería una vulnerabilidad de seguridad importante en la producción. Cerrado agregando un control de una línea. Lección: las pruebas de límites son las más valiosas.

Caso 2: prueba falsa. Un equipo se sintió aliviado al aumentar la cobertura al 85% con 40 pruebas unitarias producidas por IA. Durante la inspección, se vio que la mayoría de las pruebas en realidad no verificaron ningún resultado, simplemente llamaron a la función y escribieron afirmar Verdadero (verdadero). La cobertura era alta pero la protección nula. Las pruebas fueron revisadas y reescritas con validaciones reales. Lección: las cifras de cobertura pueden mentir.

Caso 3: Se aceleraron las pruebas de IU. Un equipo de comercio electrónico escribió un script XCUITest del flujo de agregar al carrito con IA en 20 minutos; Si estuviera escrito a mano, tardaría medio día. Identificadores de elementos de pantalla adivinados por IA; El equipo los comparó con el código real y los arregló. La velocidad del borrador es real, pero la verificación del identificador es un trabajo humano.

Aviso débil / Aviso fuerte

Mensaje débil: "Escribe una prueba para esta función".

Mensaje potente: "Produzca pruebas unitarias para esta función de Kotlin con JUnit5 + MockK. Función: transferencia de dinero (cantidad, origen, destino). Comportamientos para probar (lo que debe HACER el código): - La transferencia válida debe ser exitosa - Se debe rechazar la cantidad negativa o cero - Se debe rechazar la cantidad mayor que el saldo - El error de red debe generar la excepción apropiada Cada prueba debe verificar solo una cosa, sus nombres deben ser descriptivos, burlarse del servicio externo. No escriba una afirmación vacía".

Plantillas copiables

Plantilla de prueba unitaria: "Genere pruebas unitarias [JUnit/XCTest] para esta función para [idioma]. Comportamiento esperado: [qué hacer]. Incluye: escenario feliz, entrada nula, puntos de interrupción, caso de error. Deje que cada prueba verifique un comportamiento único; use aserciones significativas; simulacro. [código]".

Plantilla de prueba de interfaz de usuario: "Escriba una prueba de interfaz de usuario del siguiente flujo con [Espresso/XCUITest]: [flujo de usuario paso a paso]. Seleccione elementos de la pantalla con identificación de accesibilidad, use identificación en lugar de texto. Agregue estrategia de espera. Recuérdeme hacer coincidir los identificadores de elementos con el código real".

Plantilla de auditoría de prueba: "Examine estas pruebas: 1) ¿Realmente verifican un resultado/comportamiento o son nulas? 2) ¿Cubren casos límite? 3) ¿Corregen errores en el código o esperan un comportamiento correcto? Marque y fortalezca las pruebas débiles. [pruebas]"

Plantilla de optimización de cobertura: "Identifique partes no probadas de esta clase y sugiera pruebas significativas. Priorice las rutas con riesgo real, no solo la cantidad de coberturas. [código]"

Errores comunes

  • Simplemente probando el feliz escenario. Los errores se almacenan en estados límite; Pídelos abiertamente.
  • Aceptar una prueba vacía/inútil. Las pruebas del tipo afirmarTrue(verdadero) inflan el alcance y no brindan protección.
  • Hacer que la IA verifique qué está haciendo el código. Las pruebas deben esperar lo que debería hacer el código; de lo contrario, soluciona el error.
  • Confundir el número de alcance con el propósito. Una cobertura del 90% no significa una precisión del 90%.
  • Vinculación a texto en pruebas de UI. La prueba se interrumpe cuando cambia el texto; Utilice un identificador estable (id).
  • Configurar simulacros incorrectamente. La "prueba unitaria" que llama al servicio real será lenta y frágil.

En resumen

Las pruebas son la columna vertebral de la calidad móvil y la IA es muy eficiente en esta área, especialmente en las pruebas unitarias. Siga la pirámide de pruebas: muchas unidades, integración media, pocas pruebas de UI. Solicite explícitamente a la IA el escenario feliz, así como los casos límite y las rutas de error. Asegúrese de que cada prueba generada realmente valide un comportamiento; Las pruebas vacías y la cobertura inflada son engañosas. Lo más importante es decirle a la IA qué debe hacer el código, no qué hace, para que la prueba detecte el error, no lo solucione.

Tarea de aplicación

Solicite pruebas a la IA utilizando la "plantilla de prueba unitaria" para una función de lógica empresarial (por ejemplo, cálculo de descuento o validación de formulario) y especifique explícitamente casos límite (nulo, negativo, demasiado grande). Ejecute las pruebas generadas y luego audite las mismas pruebas con la "Plantilla de auditoría de pruebas". Encuentre al menos una prueba débil, fortalézcala y pruebe si las pruebas detectan un error real de la función (agregando un pequeño error).

lista de verificación

  • [] Seleccioné la capa apropiada para la pirámide de prueba (unidad de prioridad)
  • [] Quería casos de límite y error además del escenario feliz
  • [] Verifiqué que cada prueba contiene una afirmación significativa
  • [] Le dije a la IA lo que debería hacer el código, no lo que hace.
  • [ ] Me centré en las rutas de riesgo reales, no en el número de coberturas.
  • [] Utilicé un identificador estable en las pruebas de UI, no me vinculé al texto