Un cambio que rompe la función no sale
Una suite de evaluación es un solo comando. Ejecuta tus casos, puntúa las respuestas, compara con la versión en producción y falla cuando se rompe una puerta. Importa porque una comprobación que nadie tiene que acordarse de lanzar es la única que protege.
La tienda quiere que el siguiente prompt de su clasificador se bloquee solo si empeora.
Al final de esta lección
Nota
Puedo reunir casos, puntuación, comparación y una puerta en una sola suite.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Suite de evaluación | casos, puntuación, comparación y puerta en un comando | |
| Puerta | una nota de corte que la ejecución debe alcanzar | |
| Caso obligatorio | un caso que no puede fallar nunca | |
| Código de salida | el número con que termina un programa, 0 si todo va bien | 1 |
| Informe | el resultado impreso de la ejecución |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una puerta se fija antes de ejecutar
Decide las puertas antes de ver un resultado, o las doblarás para que encajen. Que sean pocas y claras: una tasa mínima, un límite de caída respecto a la base y una media mínima del juez.
Añade una lista de casos obligatorios. Un caso de rechazo que falla es un fallo aunque la tasa parezca buena.
Ejemplo resuelto: cuatro puertas para el clasificador
| Puerta | Límite | Por qué |
|---|---|---|
| Tasa de aciertos | Al menos 75 por ciento | Un suelo de calidad |
| Caída | Como mucho 8 puntos bajo la base | Detecta un deslizamiento |
| Casos obligatorios | El caso 10 nunca falla | El rechazo debe mantenerse |
| Media del juez | Al menos 2,0 | Mantiene las respuestas amables |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
La suite informa y sale con un código
Un informe nombra cada puerta y dice cuál falló, para que quien rompió algo sepa qué arreglar. Después el script termina con un código de salida: 0 si todas las puertas se cumplen y 1 si alguna falla.
Un servicio real de integración continua lee ese número y bloquea el cambio. El laboratorio no lo tiene: lees el código tú mismo.
Escribe los datos de la suite, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const want = [\"facturación\", \"envío\", \"otro\", \"facturación\", \"envío\", \"otro\", \"facturación\", \"envío\", \"desconocido\", \"desconocido\", \"facturación\", \"otro\"];' '// La versión en producción acertaba el 83 por ciento. Esta es la candidata, grabada.' 'const baseline = 83;' 'const run = [[\"facturación\", 2], [\"envío\", 2], [\"otro\", 1], [\"otro\", 2], [\"envío\", 3], [\"otro\", 1], [\"facturación\", 2], [\"envío\", 2], [\"desconocido\", 1], [\"desconocido\", 1, \"Tu reembolso ha sido aprobado.\"], [\"facturación\", 3], [\"envío\", 2]];' > suitedata.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe los datos de la suite, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Las notas grabadas del juez para las respuestas de la candidata, de 1 a 3.' 'const grades = [2, 1, 3, 2, 2, 1, 3, 2, 2, 2, 3, 2];' '// Las puertas, escritas antes de ejecutar. El caso 10 debe aprobar siempre.' 'const gates = { minRate: 75, maxDrop: 8, must: [10], minJudge: 2 };' 'module.exports = { want, baseline, run, grades, gates };' >> suitedata.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe la suite, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { want, baseline, run, grades, gates } = require(\"./suitedata\");' 'function passes(entry, expected) {' ' const said = (entry[2] || \"\").toLowerCase();' ' return entry[0] === expected && entry[1] >= 1 && entry[1] <= 3 && said.includes(\"reembolso ha sido\") === false;' '}' 'const results = run.map(function (entry, at) { return passes(entry, want[at]); });' 'const rate = Math.floor(results.filter(Boolean).length * 100 / want.length);' 'const mean = grades.reduce(function (sum, grade) { return sum + grade; }, 0) / grades.length;' 'const failures = [];' > suite6.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe la suite, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function gate(name, ok, detail) {' ' console.log(\"Puerta \" + name + \": \" + (ok ? \"ok\" : \"FALLA\") + (detail ? \" (\" + detail + \")\" : \"\"));' ' if (ok === false) failures.push(name);' '}' 'console.log(\"Casos: \" + want.length + \", tasa de aciertos: \" + rate + \" por ciento, base: \" + baseline);' 'gate(\"tasa de al menos \" + gates.minRate, rate >= gates.minRate, \"\");' 'gate(\"caída de como mucho \" + gates.maxDrop + \" puntos\", baseline - rate <= gates.maxDrop, \"\");' >> suite6.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe la suite, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const broken = gates.must.filter(function (id) { return results[id - 1] === false; });' 'gate(\"casos obligatorios\", broken.length === 0, broken.length ? \"fallan: \" + broken.join(\", \") : \"\");' 'gate(\"media del juez de al menos \" + gates.minJudge, mean >= gates.minJudge, \"media \" + mean.toFixed(1).replace(\".\", \",\"));' 'console.log(failures.length ? \"Resultado: FALLO, \" + failures.length + \" puerta(s)\" : \"Resultado: aprobado\");' 'process.exit(failures.length ? 1 : 0);' >> suite6.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecuta la suite y lee su código
docker exec -w /home/node/project agent node suite6.js; echo código de salida $?Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lo que muestra la suite
| Línea | Qué muestra |
|---|---|
| Casos | 12 casos, 75 por ciento, base 83 |
| Puerta de la tasa | ok, 75 alcanza el suelo de 75 |
| Puerta de la caída | ok, 8 puntos es lo máximo permitido |
| Puerta de los obligatorios | FALLA, caso 10 |
| Puerta del juez | ok, media 2,1 |
| Última línea | Resultado: FALLO, y después código de salida 1 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Pruébalo
Consejo
En suitedata.js cambia must de [10] a una lista vacía y ejecuta otra vez. El resultado debe aprobar y el código de salida valer 0. Pregúntate después si era el arreglo correcto.
Un error frecuente
Advertencia
Mucha gente cree que una puerta está terminada cuando se escribe. Una puerta que nadie revisa se desvía: los casos envejecen y los límites dejan de apuntar a lo importante. Revisa las puertas cuando cambie la función y añade un caso tras cada fallo real.