Ir al contenido

Selección de pruebas en Jest

Alguien crea una ejecución en Probara (los casos de una versión, de un plan de pruebas, los que fallaron ayer) y el pipeline ejecuta exactamente esas pruebas. Con runCasesOnly, el reporter lee los casos de la ejecución antes de que Jest empiece sus pruebas, Jest ejecuta solo las pruebas que pertenecen a alguno de ellos, y sus resultados van a esa ejecución, que queda abierta.

  1. Añade una vez el archivo de setup del reporter a la configuración de Jest. Omite las pruebas que no son de ningún caso de la ejecución; sin las variables de abajo no hace nada.

    jest.config.js
    module.exports = {
    reporters: ['default', ['@probara/jest-reporter', { projectId: 'SHOP' }]],
    setupFilesAfterEnv: ['@probara/jest-reporter/setup'],
    };
  2. En el job que ejecuta las pruebas de una ejecución, define PROBARA_RUN_CASES_ONLY=true y PROBARA_RUN_ULID con el ULID de la ejecución. En Probara, abre la ejecución, selecciona Acciones de la ejecución (el menú de la cabecera de la ejecución) y elige Copiar ULID de la ejecución; la misma opción está en el menú de cada ejecución de la lista de ejecuciones.

  3. Revisa la ejecución en Probara: sus casos tienen los resultados, y la ejecución queda abierta para quien la creó.

$ PROBARA_RUN_CASES_ONLY=true PROBARA_RUN_ULID=01J9Z3K4M5N6P7Q8R9S0T1V2W3 npx jest
[probara] Ran only the tests of run 01J9Z3K4M5N6P7Q8R9S0T1V2W3: 2 of 3 tests match its cases; 1 skipped and not reported
[probara] Sending 2 results of 2 tests (2 passed, 0 failed, 0 skipped, 0 blocked)
[probara] Recorded 2 results (0 new cases, 0 unmatched) in R-1 (open): https://app.probara.net/projects/SHOP/runs/R-1

En GitHub Actions, un workflow que se inicia a mano con el ULID de la ejecución como input:

on:
workflow_dispatch:
inputs:
run_ulid:
description: The ULID of the Probara run to run the tests of
required: true
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: 22
- run: npm ci
- name: Run the tests of a Probara run
run: npx jest
env:
PROBARA_API_TOKEN: ${{ secrets.PROBARA_API_TOKEN }}
PROBARA_RUN_CASES_ONLY: 'true'
PROBARA_RUN_ULID: ${{ inputs.run_ulid }}

Actívalo por job, con las variables: runCasesOnly: true en la configuración de Jest lo activa en todos los jobs, y un job sin ULID muestra entonces una advertencia y ejecuta todas las pruebas.

Una prueba pertenece a la ejecución cuando se cumple una de estas condiciones, que se comprueba para cada prueba antes de ejecutarla:

La pruebaEjemplo
Su clave de automatización es la de uno de los casos de la ejecuciónUn caso que creó el reporter o probara import junit
Su título o el de uno de sus describe nombra uno de los casos de la ejecucióntest('SHOP-12 adds an item'), describe('SHOP-12 cart')
  • probara.id() no cuenta: se ejecuta con la prueba, después de la selección. Nombra el caso en un título (vincular).
  • Las claves son las del reporter: con el mismo keyIncludesFile y el mismo rootDir que el informe que vinculó los casos. También cuentan los IDs en los títulos de los proyectos de projects.
  • Un caso de la ejecución sin prueba simplemente no recibe resultado: el registro solo cuenta las pruebas.

En el ejemplo de arriba, la ejecución tiene dos casos: SHOP-12, nombrado en el título de una prueba del carrito, y SHOP-30, cuya clave es la de la prueba de login. La tercera prueba no pertenece a ninguno, así que Jest la omite, y solo se envían las otras dos:

[
{ "caseDisplayId": "SHOP-12", "automationKey": "tests/cart.test.js > cart adds an item" },
{ "automationKey": "tests/login.test.js > login logs in with a valid password" }
]
PruebaSe ejecutaSe reporta
Pertenece a la ejecuciónSíSí, en la ejecución, con cada intento
Pertenece a la ejecución, pero es test.skip, test.todo o un describe omitidoNoSí, como omitida (un todo con la nota Todo)
No pertenece a ningún caso de la ejecuciónNoNo: el resumen de Jest la cuenta como omitida

Las pruebas se omiten cuando Jest ya cargó su archivo, desde un hook beforeAll raíz que añade el archivo de setup, así que un archivo sin ninguna prueba de la ejecución sigue ejecutando su ámbito de módulo y sus hooks beforeAll y afterAll raíz (los hooks de un describe sin pruebas de la ejecución se omiten con él). Cuando eso es costoso (una base de datos, un navegador), pasa también a Jest un filtro de rutas que deje fuera esos archivos:

Ventana de terminal
PROBARA_RUN_CASES_ONLY=true PROBARA_RUN_ULID=01J9Z3K4M5N6P7Q8R9S0T1V2W3 npx jest tests/cart

La selección nunca rompe la ejecución de pruebas: cuando no puede saber qué pruebas pertenecen a la ejecución, todas las pruebas se ejecutan y se reportan, con una advertencia.

Qué pasaLa advertencia
No hay run.ulid ni PROBARA_RUN_ULIDrunCasesOnly needs the run whose tests to run: set run.ulid or PROBARA_RUN_ULID. Every test runs and is reported
Los casos de la ejecución no se pueden leer (404, 403…)runCasesOnly: could not read the cases of the run <ULID> (<why>). Every test runs and is reported
Un archivo de prueba se ejecutó sin el archivo de setuprunCasesOnly needs the setup file: add setupFilesAfterEnv: [...] to the Jest config. Every test of a file without it runs and is reported
El archivo de setup no pudo omitir pruebas en un archivorunCasesOnly: the setup file could not skip the tests of a file that match no case of the run (<why>). ...
Ninguna prueba coincide con ningún caso de la ejecuciónNo test matches the cases of the run <ULID>: every test was skipped, and none is reported

Los casos no se pueden leer, por ejemplo, cuando el token no puede leer esa ejecución:

$ PROBARA_RUN_CASES_ONLY=true PROBARA_RUN_ULID=01J9Z3K4M5N6P7Q8R9S0T1V2W3 npx jest
[probara] runCasesOnly: could not read the cases of the run 01J9Z3K4M5N6P7Q8R9S0T1V2W3 (Probara answered 403 forbidden: <message from Probara>). Every test runs and is reported
[probara] Sending 3 results of 3 tests (3 passed, 0 failed, 0 skipped, 0 blocked)
[probara] Recorded 3 results (1 new case, 0 unmatched) in R-1 (open): https://app.probara.net/projects/SHOP/runs/R-1

Una configuración sin el archivo de setup:

$ PROBARA_RUN_CASES_ONLY=true PROBARA_RUN_ULID=01J9Z3K4M5N6P7Q8R9S0T1V2W3 npx jest
[probara] runCasesOnly needs the setup file: add setupFilesAfterEnv: ['@probara/jest-reporter/setup'] to the Jest config. Every test of a file without it runs and is reported (first seen in tests/cart.test.js; repeats are logged at debug)
[probara] Sending 2 results of 2 tests (2 passed, 0 failed, 0 skipped, 0 blocked)
[probara] Recorded 2 results (1 new case, 0 unmatched) in R-1 (open): https://app.probara.net/projects/SHOP/runs/R-1

Una ejecución cuyos casos no nombra ni encuentra ninguna prueba:

$ PROBARA_RUN_CASES_ONLY=true PROBARA_RUN_ULID=01J9Z3K4M5N6P7Q8R9S0T1V2W3 npx jest
[probara] No test matches the cases of the run 01J9Z3K4M5N6P7Q8R9S0T1V2W3: every test was skipped, and none is reported

En ese caso no se envía nada, y la ejecución queda como estaba: comprueba que el ULID es el de la ejecución que querías.

El archivo de setup no puede omitir pruebas en un archivo cuando el archivo se ejecuta con otro test runner distinto de jest-circus (testRunner: 'jest-jasmine2'), o cuando su selección falló. Ese archivo ejecuta y reporta todas sus pruebas, y la línea Ran only lo deja fuera de su recuento.

  • injectGlobals: false funciona: el archivo de setup toma los hooks de Jest de @jest/globals.
  • projects de Jest: pasa el archivo de setup a cada proyecto. Una prueba cuyo título contiene {displayName} se ejecuta en todos los proyectos (el archivo de setup no puede conocer el nombre del proyecto), y solo se reporta donde su nombre, con el del proyecto, pertenece a la ejecución; la línea Ran only cuenta las demás aparte, como ran and not reported.
  • Shards (--shard): cada shard lee los casos de la ejecución y ejecuta su parte de las pruebas seleccionadas.
  • Modo watch: los casos de la ejecución se vuelven a leer antes de cada repetición.
  • Una petición más: leer los casos es una petición antes de que empiecen las pruebas, 200 casos por página (red). Es la única lectura que puede hacer un token de aplicación: el endpoint de claves de casos de una ejecución.

Relacionado: Configuración · Una ejecución existente · Solución de problemas · Fuente: run-selection.md