Ir al contenido

Solución de problemas del reporter de Jest

Cada entrada parte de lo que ves, y después explica por qué y qué hacer. El reporter escribe en stderr en líneas [probara]; PROBARA_DEBUG=true añade cada petición. Sea cual sea el problema, el código de salida de Jest sigue siendo el de las pruebas. La última tabla enumera cada línea que registra el reporter.

Por qué. Sin un token y un proyecto, el reporter queda desactivado y en silencio, a propósito: las ejecuciones locales y los builds de forks no envían nada. Solo lo indica en debug:

$ PROBARA_DEBUG=true npx jest
[probara] Probara reporting is not configured: set PROBARA_API_TOKEN and PROBARA_PROJECT to enable it

Solución. Pasa el secreto PROBARA_API_TOKEN al paso que ejecuta jest, y define el proyecto (projectId o PROBARA_PROJECT). Comprueba que el reporter está en los reporters de la configuración que usa Jest: --reporters en la línea de comandos sustituye los reporters de la configuración, y una clave reporters dentro de uno de los projects de Jest se ignora (regístralo en el nivel superior).

El envío está desactivado: un problema de configuración

Sección titulada «El envío está desactivado: un problema de configuración»
$ PROBARA_RUN_ULID=R-12 npx jest
[probara] Probara reporting is off: PROBARA_RUN_ULID is not a ULID

Por qué. Un ajuste tiene un valor incorrecto, o solo está definido uno de los dos, el token o el proyecto. Cada problema se registra, nombrando la opción o la variable afectada (nunca su valor), y no se envía nada.

Solución. Corrige el ajuste que nombra la línea (opciones).

$ npx jest
[probara] Sending 3 results of 3 tests (3 passed, 0 failed, 0 skipped, 0 blocked)
[probara] 3 results were not sent: Probara answered 401 unauthorized: <message from Probara>. No run was created or updated

Por qué. 401: el token es incorrecto, está revocado o es de otro Probara (baseUrl). 403: el token no puede reportar en ese proyecto, o la organización está en el plan Free (el envío desde CI necesita un plan de pago).

Solución. Crea un token de aplicación nuevo desde la tarjeta Jest (primeros pasos) y actualiza el secreto; comprueba el ID del Proyecto; comprueba el plan de la organización.

La línea de error termina con The run R-4 was left open: <url> o, cuando ni siquiera el primer informe llegó, con No run was created or updated.

Por qué. Un informe falló tras sus reintentos (Probara inalcanzable, un informe rechazado): los informes siguientes no se envían, y una ejecución que ya tiene resultados queda abierta, para que nada parezca completo cuando no lo está. Una ejecución de una sesión watch y una ejecución reutilizada (run.ulid) quedan abiertas a propósito.

Solución. Define un archivo de resultados: lo que no se envió va ahí, con la ejecución a la que pertenece, y probara import results lo envía a esa ejecución y la cierra. Si no, cierra la ejecución a mano con npx @probara/cli run close --run-ulid <ulid>, y vuelve a ejecutar las pruebas.

Un job envía después de cerrarse su ejecución

Sección titulada «Un job envía después de cerrarse su ejecución»

En GitHub Actions los jobs de un mismo workflow comparten una ejecución, y un job final la cierra. Un job que envía después de ese cierre recibe 409 ci_run_closed (la ejecución ya estaba cerrada): el reporter registra el motivo, no envía nada más, y las pruebas conservan su código de salida.

Por qué. Un job que envía no está en el needs del job final, así que el job final cerró la ejecución antes de que ese job enviara. O un job en paralelo cerró la ejecución al terminar porque no tenía PROBARA_CLOSE_RUN: false, y los jobs posteriores reciben el mismo error.

Solución. Mantén cada job que envía en el needs del job final, y define PROBARA_CLOSE_RUN: false en cada job en paralelo. La sección jobs en paralelo tiene el workflow completo.

$ PROBARA_CREATE_MISSING_CASES=false npx jest --runInBand
[probara] Sending 3 results of 3 tests (3 passed, 0 failed, 0 skipped, 0 blocked)
[probara] Recorded 1 result (0 new cases, 2 unmatched) in R-1 (closed): https://app.probara.net/projects/SHOP/runs/R-1
[probara] 2 results were not recorded (case_not_found): tests/cart.test.js > cart removes an item; tests/login.test.js > login logs in with a valid password

Por qué. Un resultado nombra un caso que no existe (una errata en un ID, un caso de otro proyecto), o no coincide con ningún caso mientras createMissingCases está desactivado. Probara registra los demás e indica cuáles se omitieron, con el motivo.

Solución. Corrige el ID, crea el caso, o deja que el reporter cree los casos que faltan (el valor por defecto).

Por qué. Las claves de automatización cambiaron: se renombró o movió una prueba, un describe o un archivo, jest se ejecuta desde otro directorio que antes (las claves son relativas a él), o cambió keyIncludesFile (qué cambia una clave). Si vienes de probara import junit, el informe de jest-junit puede haberse escrito sin el atributo de archivo, o con otras plantillas.

Solución. Nombra los casos en los títulos (vincular), para que un cambio de nombre los conserve. Define rootDir cuando jest se ejecute desde directorios distintos. Antes de una refactorización, compara las claves; si vienes de la importación JUnit, consulta migrar desde la importación JUnit.

$ npx jest
[probara] Could not report tests/totals.test.js: Jest could not run it (Cannot find module '../src/totals' from 'tests/totals.test.js')

Por qué. Jest no pudo ejecutar el archivo (un error de sintaxis, una importación que lanza un error, un módulo que falta): no tiene pruebas que reportar. El motivo entre paréntesis es la primera línea del error de Jest.

Solución. Corrige el archivo; la salida del propio Jest, encima de las líneas [probara], muestra el error completo. Un hook afterAll que lanza un error es distinto: sus pruebas se reportan, con un resultado fallido más (estados).

Un helper advierte que solo funciona mientras corre una prueba

Sección titulada «Un helper advierte que solo funciona mientras corre una prueba»

Por qué. Se llamó a un helper probara.* fuera de una prueba: al principio de un archivo, en el cuerpo de un describe, en beforeAll o en afterAll. No se registra nada, y la prueba continúa.

Solución. Llámalo en la prueba, en beforeEach o en afterEach (dónde llamar a los helpers).

VesPor qué, y qué hacer
probara.* needs jest-circus, Jest's default test runner: ...La configuración define testRunner con otro runner (jest-jasmine2). Quítalo: jest-circus es el de Jest por defecto
Ninguna advertencia, y ni pasos, ni archivos, ni metadatos en un archivo de pruebaEl archivo simula fs (jest.mock('fs')), con el que escriben los helpers. Simula en su lugar los módulos que importa tu código
Ninguna advertencia, y nada en ningún archivoEl envío está desactivado (sin token, enabled: false): los helpers no hacen nada, y probara.step() sigue ejecutando su cuerpo
The probara.* helpers are off: could not create their channel: ...No se puede escribir en el directorio temporal del sistema. Apunta TMPDIR a una carpeta con permisos de escritura
tests/prices.test.js
const { probara } = require('@probara/jest-reporter');
test.each([1, 2])('rounds the total', (items) => {
probara.parameters({ items });
});
$ npx jest
[probara] Several tests of one file have the same full name and attempt: what the probara.* helpers said about them is left out (first seen in tests/prices.test.js › rounds the total; repeats are logged at debug)
[probara] Sending 2 results of 1 test (2 passed, 0 failed, 0 skipped, 0 blocked)
[probara] Recorded 2 results (1 new case, 0 unmatched) in R-1 (closed): https://app.probara.net/projects/SHOP/runs/R-1

Se envían ambas filas, en un solo caso, sin sus parámetros.

Por qué. El reporter asocia lo que dijeron los helpers a un intento por su archivo de prueba, su nombre completo (los títulos de los describe y el título, unidos por espacios) y su número de intento. Cuando eso no basta para distinguir dos intentos, omite sus detalles en lugar de atribuirlos a la prueba equivocada:

  • Dos pruebas de un archivo con el mismo nombre completo: un título de test.each sin marcador (como arriba), el mismo título dos veces, o a b › c junto a a › b c.
  • Un archivo que dos proyectos de Jest ejecutaron al mismo tiempo: el registro dice Several Jest projects ran this file at once (proyectos de Jest).
  • Una prueba test.concurrent reintentada en Jest 30.0 a 30.4: las llamadas de sus reintentos van a su primer intento.

Solución. Da a cada prueba de un archivo su propio nombre (marcadores de test.each: %s, $name), da a los proyectos de Jest sus propios archivos, o actualiza Jest a 30.5.

Por qué. Con runCasesOnly, el reporter no pudo saber qué pruebas pertenecen a la ejecución, así que todas las pruebas se ejecutaron y se reportaron, en lugar de ninguna. Una advertencia dice por qué: no hay PROBARA_RUN_ULID, los casos de la ejecución no se pudieron leer (un ULID incorrecto, un token de otra organización), falta el archivo de setup en la configuración de Jest (o en uno de sus projects), o no pudo omitir pruebas en un archivo (otro testRunner).

Solución. Sigue la advertencia (cuando no puede seleccionar). Si en cambio se omitieron todas las pruebas, ninguna pertenece a la ejecución: comprueba el ULID, y que las pruebas nombren los casos de la ejecución o tengan sus claves.

Por qué. Falta el archivo de setup (una advertencia lo indica), o la salida es de un tipo que no captura: process.stdout.write, console.table y similares, pruebas test.concurrent, un afterEach de nivel superior del archivo de prueba, un método de consola que la prueba simuló, o salida fuera de una prueba (salida de consola).

Solución. Añade setupFilesAfterEnv: ['@probara/jest-reporter/setup'] a la configuración (a cada proyecto de Jest), y escribe con console.log, info, debug, warn o error dentro de la prueba, de un beforeEach o del afterEach de un bloque describe.

Por qué. El registro nombra cada archivo que omitió y por qué: más de 32 MiB, una imagen de más de 10 MiB o de 8192 px, un tipo de contenido rechazado, más de 20 archivos en un resultado, o un archivo que probara.attach() no pudo leer cuando se llamó (límites). Un archivo adjuntado dentro de un paso va a ese paso, no al resultado.

Solución. Adjunta un archivo que exista cuando llamas a probara.attach() (se copia en el momento), mantén los archivos dentro de los límites, y adjunta menos archivos por resultado.

Probara responde 429 (demasiadas peticiones)

Sección titulada «Probara responde 429 (demasiadas peticiones)»

Por qué. El límite de peticiones de la organización (60 peticiones por minuto en Free, 1.200 en Pro y 3.000 en Enterprise) lo comparten todos los tokens y pipelines. Los adjuntos cuestan dos peticiones por resultado (límite de peticiones).

Solución. El reporter espera y reintenta por su cuenta. En baterías grandes, adjunta menos, reduce attachmentConcurrency o reparte en el tiempo los pipelines con sharding.

El reporter solo escribe en stderr, con cada línea precedida de [probara]; el resto de la terminal pertenece a los reporters del propio Jest (default, summary…). Una ejecución que reporta registra dos líneas:

$ npx jest
[probara] Sending 3 results of 3 tests (3 passed, 0 failed, 0 skipped, 0 blocked)
[probara] Recorded 3 results (2 new cases, 0 unmatched) in R-1 (closed): https://app.probara.net/projects/SHOP/runs/R-1
LíneaQué dice
Sending N results of M tests (...)Antes de enviar nada: un resultado por intento y caso, por estado después de statusMapping, y lo que se dejó fuera
Recorded N results (...) in R-1Por ejecución: lo que registró Probara, los casos que creó, los resultados que no pudo asociar, y el enlace
N results were not recorded (...)Los resultados no asociados, por motivo, con sus casos o claves
Attached N files to results (...)Subidas: adjuntados, omitidos y fallidos
N results were not sent: ...Un informe fallido: el motivo, y la ejecución que quedó abierta
Wrote ... to <file>Lo que fue al archivo de resultados
Ran only the tests of run <ULID>: ...Selección de pruebas: cuántas pruebas coincidieron con los casos de la ejecución, y cuántas se omitieron y quedaron fuera
Watch mode: every re-run reports into R-1 of SHOP, ...Modo watch: la única ejecución de la sesión, que queda abierta, y el comando que la cierra
Could not report <file>: Jest could not run it (...)Un archivo de prueba que no se pudo cargar: no tiene pruebas que reportar
Probara reporting is off: ...Un problema de configuración: no se envía nada

Una advertencia que se repite en cada prueba (una llamada probara.* mal formada, un adjunto omitido, un archivo de prueba sin el archivo de setup) se registra la primera vez, indicando dónde se vio primero, con (first seen in <file or test>; repeats are logged at debug), y en debug a partir de entonces. El token nunca aparece en ninguna línea, aunque la respuesta de Probara lo repita.

debug: true (PROBARA_DEBUG=true) añade una línea por cada petición (método, ruta, estado, tiempo) y cada reintento, las repeticiones de las advertencias, e indica por qué el envío está desactivado cuando lo está:

Ventana de terminal
PROBARA_DEBUG=true npx jest

Mantenlo desactivado en las ejecuciones normales: es muy detallado, aunque nunca registra el token ni los cuerpos.

El reporter no tiene un modo de simulación propio, pero un archivo de resultados cumple esa función: ejecuta las pruebas con el envío desactivado y un archivo de resultados, y deja que la CLI muestre lo que enviaría. No llega nada a Probara, y no hace falta token:

$ PROBARA_ENABLED=false PROBARA_PROJECT=SHOP PROBARA_RESULTS_FILE=probara-results.json npx jest --runInBand
[probara] Wrote 3 results to /work/shop/probara-results.json: send them with probara import results /work/shop/probara-results.json
$ npx @probara/cli import results probara-results.json --dry-run
passed SHOP-12 tests/cart.test.js > cart adds an item
passed - tests/cart.test.js > cart removes an item
passed - tests/login.test.js > login logs in with a valid password
Total: 3 results from 1 file (3 passed, 0 failed, 0 skipped, 0 blocked)

El primer comando escribe en stderr; la simulación imprime en stdout, una línea por resultado, en el orden en que se escribieron los resultados (--runInBand lo mantiene igual entre ejecuciones): el estado, el caso (- si no se nombra ninguno) y la clave de automatización. --dry-run nunca toca el archivo; bórralo después, o impórtalo de verdad (un archivo que queda ahí hace que la siguiente ejecución escriba probara-results-2.json). --json imprime en su lugar el documento completo, cada entrada tal como la recibiría Probara (probara import results).

Úsalo para comparar claves antes de una refactorización, una actualización o un cambio de keyIncludesFile: escribe un archivo por ejecución, y compara las dos simulaciones con diff. Da a cada ejecución su propio nombre de archivo y empieza sin ellos: si ya hay un archivo en la ruta, una ejecución escribe en un hermano (before-2.json) y la simulación de before.json mostraría una ejecución anterior, ocultando la diferencia.

Ventana de terminal
rm -f before.json after.json
PROBARA_ENABLED=false PROBARA_PROJECT=SHOP PROBARA_RESULTS_FILE=before.json npx jest
# Change the code, or upgrade the reporter, then:
PROBARA_ENABLED=false PROBARA_PROJECT=SHOP PROBARA_RESULTS_FILE=after.json npx jest
npx @probara/cli import results before.json --dry-run > before.txt
npx @probara/cli import results after.json --dry-run > after.txt
diff before.txt after.txt

Cualquier línea que cambió es una prueba cuya clave o cuyo vínculo con un caso cambió: recibiría un caso nuevo.

Las líneas propias del reporter, además de las de la biblioteca de reporte que comparte con el reporter de Playwright y la CLI (Sending, Recorded, not sent, Wrote, Attached, Probara warned):

LíneaNivelDónde mirar
Ignored the unknown option "<name>" of @probara/jest-reporterwarnOpciones desconocidas: una errata
Probara reporting is off: the reporter could not start: <reason>errorRepórtalo: el reporter nunca lanza errores dentro de Jest, y dice por qué se detuvo
Could not report <file>: Jest could not run it (<reason>)warnUn archivo de prueba no se reporta
captureOutput needs the setup file: ...warncaptureOutput no adjunta nada
runCasesOnly needs the setup file: ...warnLa selección ejecutó todas las pruebas
runCasesOnly needs the run whose tests to run: ...warnLa selección ejecutó todas las pruebas
runCasesOnly: could not read the cases of the run <ULID> (<reason>). ...warnLa selección ejecutó todas las pruebas
runCasesOnly: the setup file could not skip the tests of a file ... (<reason>). ...warnLa selección ejecutó todas las pruebas
Ran only the tests of run <ULID>: <k> of <m> tests match its cases; ...infoSelección de pruebas
No test matches the cases of the run <ULID>: ...warnLa selección ejecutó todas las pruebas
Watch mode: every re-run reports into <run> of <project>, which stays open: ...infoModo watch
The run <run> of <project> was closed: ... (o deleted)infoCuando se cierra la ejecución durante la sesión
Several Jest projects ran this file at once: ...warnUna prueba perdió sus pasos o archivos
Several tests of one file have the same full name and attempt: ...warnUna prueba perdió sus pasos o archivos
The probara.* helpers are off: could not create their channel: <reason>errorLos helpers no registran nada
probara.<helper>() only works while a test runs (...)warnDónde llamar a los helpers
probara.* needs jest-circus, Jest's default test runner: ...warnLos helpers no registran nada
probara.<helper>() takes ..., probara.attach() could not attach "<name>": <reason>warnUn argumento incorrecto; la llamada se ignora (metadatos)
Dropped the issues of probara.issue(): no issueUrlTemplate turns their ids into linkswarnEnlaces e incidencias
Could not report an attempt of "<test>": <reason>, Could not follow ..., Could not finish reporting: ...errorRepórtalo: un intento que el reporter no pudo leer se pierde, y la ejecución continúa

Reporta un problema en github.com/cynch-me/probara-sdk/issues, con las líneas [probara] de una ejecución con PROBARA_DEBUG=true.

Relacionado: Configuración · Red · Archivo de resultados · Fuente: troubleshooting.md, debugging.md