Veinte pruebas en verde
Pides a un asistente pruebas para una función y te devuelve veinte, todas en verde. Parece un buen día. Pero una prueba en verde solo dice que el código no la contradijo. No dice que la prueba sirva para algo.
Aquí aprendes a pedir pruebas y a comprobar que cada una puede fallar.
Al final de esta lección
Nota
Puedo pedir pruebas a un asistente y juzgar si de verdad comprueban algo.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Especificación | la regla escrita de lo que debe hacer el código | |
| Caso límite | un valor justo en el borde de una regla | 3 artículos |
| Versión rota | una copia del código con un fallo puesto a propósito | |
| Prueba que no puede fallar | una prueba que pasa sea cual sea el código | |
| Prueba espejo | una prueba que calcula lo esperado con la fórmula del código |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Pide las pruebas con la regla
Un asistente que solo ve el código escribe pruebas que el código cumple. Si el código tiene un fallo, las pruebas lo copian. Dale también la especificación: la regla escrita de lo que debe hacer.
Pide casos concretos: un valor justo antes del borde, uno en el borde y uno después. Pide que cada valor esperado salga de la regla, no de ejecutar la función.
Una petición posible
Esta es una petición posible, no la única. «Escribe pruebas para discount(total, items). Regla: con 3 artículos o más, el total baja un 10 %, en céntimos y redondeado. Quiero los casos 2, 3 y 0 artículos. Calcula cada valor esperado a mano desde la regla.»
Cuando lleguen las pruebas, no mires primero si pasan. Mira de dónde sale cada valor esperado.
Una prueba que no falla no prueba nada
Una prueba sirve si falla cuando el código está mal. Para comprobarlo, haz una versión rota: una copia con un fallo puesto a propósito, como un > donde iba >=. Pasa las pruebas por las dos versiones.
Una prueba que pasa en las dos no puede fallar. Una prueba espejo calcula lo esperado con la fórmula del código, así que siempre coincide con él.
Un ejemplo escrito a mano
Los cuatro ejemplos de abajo los escribimos nosotros, a mano. No son de ningún asistente. Sirven para ver qué pasa cuando una prueba es buena y cuando no lo es.
Los botones escriben archivos en la carpeta demo-tests de tu proyecto. No tocan el programa de la caja.
Crear la carpeta de la demostración
docker exec -w /home/node/project agent mkdir -p demo-testsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribir el código bueno
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Regla: con 3 artículos o más, el total baja un 10 %.' 'function discount(total, items) {' ' if (items >= 3) return Math.round(total * 0.9);' ' return total;' '}' 'module.exports = { discount };' > demo-tests/descuento.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribir la versión rota
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// La misma función con un fallo puesto a propósito: > en lugar de >=.' 'function discount(total, items) {' ' if (items > 3) return Math.round(total * 0.9);' ' return total;' '}' 'module.exports = { discount };' > demo-tests/roto.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribir las cuatro pruebas
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { discount } = require(\"./\" + process.argv[2]);' '' 'const tests = [' ' [\"2 artículos no tienen descuento\", discount(1000, 2) === 1000],' ' [\"3 artículos bajan un 10 %\", discount(1000, 3) === 900],' ' [\"el resultado es un número\", typeof discount(1000, 5) === \"number\"],' ' [\"5 artículos dan lo que da el código\", discount(1000, 5) === Math.round(1000 * 0.9)],' '];' 'for (const test of tests) {' ' console.log((test[1] ? \"pasa \" : \"FALLA \") + test[0]);' '}' > demo-tests/pruebas.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pasar las pruebas por el código bueno
docker exec -w /home/node/project agent node demo-tests/pruebas.js descuentoSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pasar las pruebas por la versión rota
docker exec -w /home/node/project agent node demo-tests/pruebas.js rotoSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo resuelto: cuatro pruebas, dos códigos
| Prueba | Código bueno | Versión rota | Puede fallar |
|---|---|---|---|
| 2 artículos no tienen descuento | pasa | pasa | Poco: el fallo está en 3 |
| 3 artículos bajan un 10 % | pasa | FALLA | Sí, es la que sirve |
| el resultado es un número | pasa | pasa | No: pasa con cualquier número |
| 5 artículos dan lo que da el código | pasa | pasa | No: es una prueba espejo |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente cree que cuantas más pruebas en verde, mejor está el código. Con la versión rota pasaron tres de cuatro, y dos de esas tres no habrían fallado con ningún código. Cuenta las pruebas que pueden fallar, no las que pasan.
Para ir más lejos: tu propio cambio
En el laboratorio, elige un cambio que no sea el defecto de la caja, que es la tarea del laboratorio. Por ejemplo, una regla nueva: dos manzanas salen con un 5 % de descuento.
Escribe la regla con una frase. Pide pruebas al agente con esa frase. Haz una versión rota y pasa las pruebas por las dos. Anota cuáles no pudieron fallar.