# Reporter de Cypress

> Envía a Probara cada resultado de tus pruebas de Cypress desde cualquier CI con @probara/cypress-reporter — instalación, registro del reporter, su plugin y su archivo de soporte, y lo que ves en tus ejecuciones.

`@probara/cypress-reporter` es un reporter de [Cypress](https://www.cypress.io) que envía a Probara
cada resultado de un `cypress run`: cada intento con su estado, su duración y su error, vinculado a
su caso de prueba, con la captura de pantalla de cada fallo y los pasos, los adjuntos y los enlaces
que añaden tus pruebas. Los casos que faltan se crean, y la ejecución se cierra cuando todo ha
llegado.

Es de código abierto, está publicado en
[npm](https://www.npmjs.com/package/@probara/cypress-reporter) en la versión `0.1.0` y vive en el
[repositorio probara-sdk](https://github.com/cynch-me/probara-sdk/tree/main/packages/cypress-reporter).
Hasta la 1.0, una versión menor puede traer cambios incompatibles: fija la versión
([actualizar el reporter](https://docs.probara.net/es/developers/ci-integrations/cypress/migrating/#actualizar-el-reporter)).

## Qué obtienes

- **Un resultado por intento**, incluidos los `retries` de Cypress, con el veredicto del propio
  Cypress: `it.skip` y `this.skip()` se envían como omitidos, y también cada prueba que un hook
  fallido impidió ejecutar.
- **Las mismas claves de automatización que `probara import junit`** sobre el JUnit XML del reporter
  `junit` de Cypress o de cypress-junit, así que al dejar la importación JUnit conservas cada caso y
  su historial.
- **Capturas de pantalla adjuntas al intento exacto** para el que Cypress las tomó, y el vídeo de
  una spec en sus resultados fallidos con `attachVideos`.
- **Vinculación** por un ID de caso en el título de una prueba o de un `describe`
  (`SHOP-12 adds an item`) o con `probara.id()`, y el navegador como parámetro `browser` de cada
  resultado, nunca en la clave.
- **Helpers de prueba** que se ejecutan donde se ejecuta la spec: `probara.step()`,
  `probara.attach()`, `probara.link()`, `probara.issue()`, `probara.parameters()`, y el título, la
  suite, las etiquetas y los campos de un caso nuevo.
- **Salida de consola** de cada prueba como adjuntos, y **selección de pruebas**: ejecuta solo las
  pruebas de una ejecución creada en Probara.
- **Ejecuciones** con nombre, entorno, hito, plan de pruebas, configuraciones y etiquetas; una sola
  ejecución para todas las máquinas de un pipeline repartido.
- **Nunca rompe tu ejecución de pruebas.** Un problema al reportar se registra, nunca se lanza, y
  `cypress run` sigue terminando con el número de sus propias pruebas fallidas. Lo que no se pudo
  enviar puede guardarse en un archivo y enviarse más tarde.

## Antes de empezar

| Necesitas                                                    | Por qué                                                                                                                         |
| ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------- |
| Node.js 22.12 o posterior                                    | El rango `engines` del paquete, para el Node.js que arranca `cypress`.                                                          |
| Cypress 15.10.0 o posterior                                  | El rango de peer: 15.10.0 es el primer Cypress con `Cypress.expose()`, que entrega al navegador sus ajustes. Probado en 16.1.1. |
| `cypress run`                                                | Cypress solo construye un reporter en `cypress run`: `cypress open` no reporta nada.                                            |
| Un plan de pago (**Pro** o **Enterprise**, o una prueba Pro) | El envío de resultados desde CI no forma parte del plan Free. En Free, Probara responde `403 forbidden`.                        |
| Un **propietario** o **administrador** de Probara            | Solo los propietarios y administradores crean y revocan tokens de aplicación.                                                   |
| El **ID del Proyecto** al que enviar los resultados          | Por ejemplo `SHOP`: una letra mayúscula y después mayúsculas o dígitos.                                                         |

## 1. Crea un token de aplicación

El reporter se autentica con un
[token de aplicación](https://docs.probara.net/es/developers/authentication/#tokens-de-aplicación): un token que pertenece a
tu organización, no a una persona. No ocupa ningún puesto y sigue funcionando cuando la persona que
lo creó se va.

1. En Probara, abre **Workspace › Integraciones** y selecciona la tarjeta **Cypress**.
2. Abre la pestaña **Tokens de acceso** y selecciona **Crear un token de aplicación**.
3. Escribe un **Nombre del token** con el nombre de lo que lo usa (el repositorio o el pipeline) y
   selecciona **Crear token**.
4. Selecciona **Copiar token** en **Copia tu nuevo token**. Solo se muestra una vez: guárdalo en ese
   momento como un secreto de CI llamado `PROBARA_API_TOKEN`.

La [guía de la integración con Cypress](https://docs.probara.net/es/guides/integrations/cypress/) cubre la tarjeta, cómo
gestionar y revocar los tokens, y qué muestra Probara en las ejecuciones que crea un token de
aplicación.

## 2. Instala el reporter

```bash
npm install --save-dev @probara/cypress-reporter
```

## 3. Registra el reporter y su plugin

Define el reporter como el reporter de `e2e`, con tu ID del Proyecto, y devuelve su plugin desde
`setupNodeEvents`:

```js
// cypress.config.js
const { defineConfig } = require('cypress');
const { probaraNodeEvents } = require('@probara/cypress-reporter/setup');

module.exports = defineConfig({
  e2e: {
    reporter: '@probara/cypress-reporter',
    reporterOptions: { projectId: 'SHOP' },
    setupNodeEvents(on, config) {
      return probaraNodeEvents(on, config);
    },
  },
});
```

El reporter convierte los eventos de prueba de Cypress en resultados. El plugin es dueño de la
ejecución de Probara (una para todo el `cypress run`, cerrada al final), recoge las capturas y el
vídeo, y transporta lo que dicen los helpers `probara.*`. Lee los mismos `reporterOptions`, así que
no necesita ajustes propios. Si `setupNodeEvents` ya registra otros plugins, consulta
[con otros plugins](https://docs.probara.net/es/developers/ci-integrations/cypress/configuration/#con-otros-plugins).

Puedes omitir `projectId` y definir `PROBARA_PROJECT` en el entorno. El token nunca va en la
configuración: la configuración se sube al repositorio, y el reporter lee el token de
`PROBARA_API_TOKEN`.

Cypress ejecuta un solo reporter: con este, dejan de imprimirse las líneas por prueba de su reporter
`spec` por defecto, aunque las tablas propias de Cypress de cada spec y de la ejecución siguen
apareciendo. Para conservar también las líneas de `spec`, declara ambos reporters en
[`cypress-multi-reporters`](https://docs.probara.net/es/developers/ci-integrations/cypress/configuration/#con-cypress-multi-reporters).

## 4. Carga el archivo de soporte

Importa el archivo de soporte una vez, en el archivo de soporte de Cypress:

```js
// cypress/support/e2e.js
import '@probara/cypress-reporter/support';
```

Se ejecuta en el navegador, junto a tus specs, y activa los helpers `probara.*` (un global: las
specs los llaman sin importar nada),
[`captureOutput`](https://docs.probara.net/es/developers/ci-integrations/cypress/steps-and-attachments/#salida-de-consola) y
la [selección de pruebas](https://docs.probara.net/es/developers/ci-integrations/cypress/run-selection/).

## 5. Ejecuta tus pruebas con el token

Pasa el secreto al paso que ejecuta `cypress run`. En GitHub Actions:

```yaml
- name: Run Cypress tests
  run: npx cypress run
  env:
    PROBARA_API_TOKEN: ${{ secrets.PROBARA_API_TOKEN }}
```

No hay un paso de subida aparte: el plugin envía los resultados cuando termina la ejecución.
[Proveedores de CI](https://docs.probara.net/es/developers/ci-integrations/cypress/ci-providers/) tiene pipelines completos
para GitHub Actions, GitLab CI, Jenkins, CircleCI, Azure Pipelines, Bitbucket Pipelines y Buildkite.

## Qué ves

Sin un token y un proyecto, el reporter queda desactivado y en silencio, así que las ejecuciones
locales no envían nada. En CI escribe en stdout, en líneas `[probara]` entre la salida propia de
Cypress, y termina con el enlace a la ejecución:

```text
$ npx cypress run --spec cypress/e2e/cart.cy.js
[probara] Sending 5 results of 4 tests (3 passed, 2 failed, 0 skipped, 0 blocked)
[probara] Recorded 5 results (2 new cases, 0 unmatched) in R-1 (closed): https://app.probara.net/projects/SHOP/runs/R-1
```

En Probara, la ejecución aparece en la lista de ejecuciones del proyecto como una ejecución
automatizada, con el nombre del build de CI (por ejemplo `Cypress #42`), su rama, su commit y la URL
del build. Muestra la aplicación **Cypress** y el nombre del token (por ejemplo
**Cypress · shop-e2e**) en lugar de una persona.

## Cada registro, y qué activa

| Qué está registrado                       | Qué obtienes                                                                                                                                 |
| ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| Reporter, plugin y archivo de soporte     | Todo: una ejecución para todo el `cypress run`, cerrada al final, las capturas de los intentos fallidos, el vídeo y los helpers              |
| Reporter y plugin, sin archivo de soporte | Resultados, capturas y vídeo. Cada llamada `probara.*` no hace nada, `captureOutput` no captura nada y la selección de pruebas no omite nada |
| Solo el reporter, sin plugin              | Se envía cada resultado, pero en **una ejecución por spec**, sin capturas, sin vídeo y sin helpers. Una advertencia dice qué falta           |
| Solo el plugin, sin reporter              | No se reporta nada: Cypress nunca construye el reporter                                                                                      |

## Cómo se traduce Cypress a Probara

| Cypress                                                                   | En Probara                                                                                            |
| ------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| Una prueba                                                                | Un caso de prueba, encontrado por su clave de automatización o vinculado por un ID de caso            |
| Cada intento (también los `retries` de Cypress)                           | Un resultado en la ejecución, con su estado, su duración, su hora de inicio y su error                |
| `it.skip`, `this.skip()`, una prueba que un hook fallido impidió ejecutar | Un resultado omitido                                                                                  |
| Un `beforeEach` o `before` que falla                                      | Un resultado fallido con el nombre que le da Cypress, más las pruebas que detuvo                      |
| Llamadas a `probara.step()`                                               | Los pasos del resultado, anidados, con su estado, su duración y su error                              |
| `probara.attach()`, `captureOutput`, la captura de un fallo               | Archivos del resultado, o del paso en el que se adjuntaron                                            |
| `probara.link()`, `probara.issue()`                                       | Enlaces del resultado                                                                                 |
| Otras llamadas `probara.*` en la prueba                                   | El título, la suite, las etiquetas, los campos y los pasos de un caso nuevo; parámetros del resultado |
| Una spec que Cypress no puede analizar, o que lanza un error al cargarse  | Un resultado fallido, con el nombre que le da Cypress, para que nunca aparezca en verde               |
| El comando `cypress run`                                                  | Una ejecución automatizada, con el nombre del build de CI, cerrada al final                           |

## Los mismos casos que la importación JUnit

El reporter da a cada prueba la clave de automatización que le da `probara import junit` sobre el
informe del reporter `junit` integrado en Cypress o de
[cypress-junit](https://www.npmjs.com/package/cypress-junit) escrito con sus opciones por defecto: el
archivo de la spec relativo a la raíz del proyecto, después `>` entre espacios, y después los
títulos de los `describe` y el título del `it` unidos por espacios, sin los IDs de caso. Para estas
dos specs:

```js
// cypress/e2e/cart.cy.js
describe('Cart', () => {
  it('SHOP-12 adds an item', () => {
    cy.get('.add').click();
  });

  it('removes an item', () => {
    cy.get('.remove').click();
  });
});
```

```js
// cypress/e2e/login.cy.js
describe('Login', () => {
  it('logs in with a valid password', () => {
    cy.get('#submit').click();
  });
});
```

el reporter envía:

```json
[
  {
    "automationKey": "cypress/e2e/cart.cy.js > Cart adds an item",
    "caseDisplayId": "SHOP-12",
    "status": "passed"
  },
  { "automationKey": "cypress/e2e/cart.cy.js > Cart removes an item", "status": "passed" },
  {
    "automationKey": "cypress/e2e/login.cy.js > Login logs in with a valid password",
    "status": "passed"
  }
]
```

Si tus informes JUnit se escribieron sin el atributo `file` de su suite raíz, define
`keyIncludesFile: false`: las claves omiten entonces el archivo de la spec, como esos informes. En
ambos casos, una prueba conserva su caso y su historial al cambiar
([migrar desde la importación JUnit](https://docs.probara.net/es/developers/ci-integrations/cypress/migrating/#desde-la-importación-junit)).

## Reportar nunca rompe tu ejecución de pruebas

El reporter nunca lanza errores dentro de Cypress ni cambia su código de salida: una prueba fallida
hace fallar el comando, un problema al reportar no. Cada problema (un ajuste incorrecto, Probara
inalcanzable, un token rechazado) se registra, nunca con el token, y las pruebas conservan su
resultado. Las llamadas `probara.*` tampoco hacen fallar una prueba: una llamada que Probara no
puede usar se omite con una advertencia. No hay ninguna opción para hacer fallar el comando por un
error al reportar; para conservar lo que no se pudo enviar, define un
[archivo de resultados](https://docs.probara.net/es/developers/ci-integrations/cypress/results-and-retries/#archivo-de-resultados).

## Referencia

| Página                                                                                 | Qué cubre                                                                                               |
| -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| [Configuración](https://docs.probara.net/es/developers/ci-integrations/cypress/configuration/)                 | Los tres registros, cada opción, su variable, su tipo y su valor por defecto; red; modo interactivo     |
| [Vincular pruebas con casos](https://docs.probara.net/es/developers/ci-integrations/cypress/linking/)          | IDs de caso en títulos y describes, `probara.id()`, claves de automatización, `it.only`                 |
| [Metadatos y enlaces](https://docs.probara.net/es/developers/ci-integrations/cypress/metadata/)                | Título, suite, comentario, etiquetas, campos, parámetros, ignorar un intento; enlaces e incidencias     |
| [Pasos y adjuntos](https://docs.probara.net/es/developers/ci-integrations/cypress/steps-and-attachments/)      | `probara.step()`, `probara.attach()`, capturas, el vídeo, salida de consola, límites                    |
| [Resultados y reintentos](https://docs.probara.net/es/developers/ci-integrations/cypress/results-and-retries/) | Opciones de la ejecución, estados, hooks y specs rotas, reintentos, archivo de resultados, asignaciones |
| [Selección de pruebas](https://docs.probara.net/es/developers/ci-integrations/cypress/run-selection/)          | `runCasesOnly`: ejecutar solo las pruebas de una ejecución de Probara                                   |
| [Sharding y proyectos](https://docs.probara.net/es/developers/ci-integrations/cypress/sharding/)               | Una ejecución para todas las máquinas; varios proyectos de Probara                                      |
| [Proveedores de CI](https://docs.probara.net/es/developers/ci-integrations/cypress/ci-providers/)              | GitHub Actions, GitLab CI, Jenkins, CircleCI, Azure Pipelines, Bitbucket Pipelines, Buildkite           |
| [Solución de problemas](https://docs.probara.net/es/developers/ci-integrations/cypress/troubleshooting/)       | Problemas y soluciones, cada línea que registra el reporter, depuración                                 |
| [Migración](https://docs.probara.net/es/developers/ci-integrations/cypress/migrating/)                         | Desde la importación JUnit, Qase, Allure Cypress y `trcli` de TestRail; actualizaciones                 |

Relacionado: [Resumen de integraciones de CI](https://docs.probara.net/es/developers/ci-integrations/) ·
[Reporter de Jest](https://docs.probara.net/es/developers/ci-integrations/jest/) ·
[Reporter de Playwright](https://docs.probara.net/es/developers/ci-integrations/playwright/) ·
[Reporter de Vitest](https://docs.probara.net/es/developers/ci-integrations/vitest/) · [CLI](https://docs.probara.net/es/developers/cli/) ·
[Guía de la integración con Cypress](https://docs.probara.net/es/guides/integrations/cypress/) ·
[Código fuente en GitHub](https://github.com/cynch-me/probara-sdk/tree/main/packages/cypress-reporter)
