# Pasos y adjuntos

> Qué partes de un paso de Cucumber se envían, cómo se muestran los pasos de Background y los hooks, y qué archivos adjunta un escenario con this.attach, this.log y this.link.

Cada paso que ejecuta un escenario es un paso de su resultado, en el orden que da el archivo `.feature`.

## Pasos

| Campo del paso | Qué contiene                                                                                                                                 |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `keyword`      | `Given`, `When`, `Then`, `And`, `But` o `*`, como están escritos. Un paso escrito en otro idioma no tiene palabra clave.                     |
| `action`       | El texto del paso. En una fila de un esquema de escenario, se rellenan los valores de esa fila.                                              |
| `status`       | [Su estado](https://docs.probara.net/es/developers/ci-integrations/cucumber/results-and-retries/#estados-de-los-pasos), según el resultado de Cucumber para el paso. |
| `durationMs`   | La duración del paso, en milisegundos.                                                                                                       |
| `error`        | El mensaje de un paso fallido: el texto de error de Cucumber. Un paso ambiguo sin mensaje indica por qué.                                    |
| `data`         | El contenido de un Doc String, o una Data Table como líneas de barras verticales, como `\| item \| price \|`.                                |

```gherkin
When the customer sends the receipt:
  """
  Thank you for the order.
  """
Then the receipt table is:
  | item | price |
  | book | 12    |
```

El `data` del primer paso es `Thank you for the order.`. El `data` del segundo paso es su tabla, como líneas de
barras verticales: `| item | price |` y después `| book | 12 |`.

## Background

Los pasos de Background de un escenario van bajo un paso `Background`, con sus propios pasos anidados en él. Su
estado es el resumen de sus pasos, y su duración es la suma de las suyas. Un Background de una Rule se aplica a
los escenarios de esa Rule, y se envía de la misma manera.

## Hooks

Los hooks (`Before` y `After`) no son pasos, así que no se envían. Un hook que falla hace fallar su escenario, y su
mensaje es el error del escenario, o `The hook failed` si no tiene ninguno. Su duración cuenta en la duración del
escenario.

## Pasos que no pasaron

- Un paso que falla, o que es ambiguo (más de una definición coincide con él), hace fallar su escenario.
- Un paso sin definición o pendiente no se ejecutó. Queda `skipped`, y también su escenario, salvo que algún paso haya fallado.
- Los pasos posteriores a un paso fallido no se ejecutaron, así que quedan `skipped`.

[Resultados y reintentos](https://docs.probara.net/es/developers/ci-integrations/cucumber/results-and-retries/#estados-de-los-escenarios)
explica las reglas completas.

## Adjuntos

Los archivos que un escenario adjunta con el World se suben a su resultado, como los demás reporters suben los suyos:

| Llamada en un paso o un hook                 | Se sube como                                                                            |
| -------------------------------------------- | --------------------------------------------------------------------------------------- |
| `this.attach(text, 'text/plain')`            | Un archivo de texto llamado `attachment.txt`                                            |
| `this.attach(buffer, 'image/png')`           | Una imagen llamada `attachment.png`                                                     |
| `this.attach(data, { mediaType, fileName })` | Un archivo llamado `fileName`, con una extensión según su tipo de medio si no tiene una |
| `this.log('a line')`                         | Un archivo de texto llamado `log.txt`, uno por llamada                                  |
| `this.link(url)`                             | Un archivo de texto llamado `link.txt`, con el enlace                                   |

```js
When('the page is shown', async function () {
  this.attach(await page.screenshot(), { mediaType: 'image/png', fileName: 'page.png' });
  this.log('the cart had one book');
});
```

- Un archivo adjuntado en un paso pertenece a ese paso, y se muestra con él. Un archivo adjuntado en un hook
  `Before` o `After` pertenece al resultado.
- `uploadAttachments: false` (`PROBARA_UPLOAD_ATTACHMENTS=false`) no sube ningún archivo.
- Se aplican los límites de todos los reporters. Un resultado envía como máximo 20 archivos, y las imágenes que
  Probara rechaza (PNG, JPEG o WebP de más de 10 MiB, o de más de 8192 píxeles por lado) se omiten con una
  advertencia. Consulta
  [los adjuntos en `@probara/core`](https://github.com/cynch-me/probara-sdk/blob/main/packages/core/README.md#attachments).
- Un archivo que no se puede subir no hace fallar la ejecución: el resumen lo cuenta como omitido o fallido.
- [`probara import cucumber`](https://docs.probara.net/es/developers/cli/#importar-resultados-de-cucumber) no envía adjuntos de un
  reporte. Para enviar los archivos que adjunta un escenario, usa el reporter.
