# Ejecuciones de prueba

> Fuente: https://astrallab.dev/es/docs/test-runs

Una ejecución de prueba convierte un script en evidencias. El agente envuelve un flujo en `astral.test`, lo divide en pasos, indica qué debería cumplirse, y Astral registra lo que ocurrió.

Las ejecuciones de prueba usan la herramienta `run_script`, que ejecuta JavaScript escrito por el agente en un sandbox que llama a las demás herramientas. El grupo `script` está desactivado por defecto; el grupo `tests` está activado por defecto, pero solo surte efecto mientras `script` esté activado. Consulta [el grupo script](https://astrallab.dev/es/docs/tools.md#group-script).

## Un ejemplo

```js
return await astral.test('Login demo', async () => {
  await astral.step('Open the store', () => astral.navigate({url: 'http://localhost:3000/'}));
  await astral.step('Sign in', async () => {
    await astral.type({locator: {role: 'textbox', name: 'Username'}, text: 'demo'});
    await astral.type({locator: {role: 'textbox', name: 'Password'}, text: 'demo', submit: true});
    await astral.expect.visible({role: 'button', name: 'Sign out'});
    await astral.expect.noErrors();
  });
  await astral.step('Pay', async () => {
    await astral.click({locator: {role: 'button', name: 'Pay'}});
    await astral.expect.request({urlContains: '/api/', method: 'POST', status: '2xx'});
  });
}, {continueOnFailure: true, record: 'actions'});
```

Pasa a `run_script` un `timeoutMs` de 60000 a 120000 para una prueba: las evidencias llevan tiempo.

## astral.test y astral.step

Opciones de `astral.test(name, fn, options)`: `tabId`, `continueOnFailure` (por defecto false) y `record`. No lanza una excepción cuando falla un paso: comprueba el `status` del resultado, que además incluye los totales, un `summary` en Markdown y las rutas del informe.

`astral.step(name, fn)` agrupa acciones. Al terminar, y siempre que falla, Astral guarda una captura, la URL y el título, las peticiones hechas durante el paso (las que fallan, con cabeceras y cuerpos censurados), errores y avisos de la consola, y los nuevos grupos de errores. Un paso falla cuando su función lanza una excepción o falla una expectativa dentro de él. Sin `continueOnFailure`, la prueba se detiene en el primer paso fallido.

`run_script` también acepta `test: {name, continueOnFailure, ...}` para tratar todo el script como una sola prueba.

## Expectativas

| Llamada | Se cumple cuando |
| --- | --- |
| `expect.visible(locator)` | El elemento es visible; espera hasta `timeoutMs` (por defecto 5000). |
| `expect.hidden(locator)` | El elemento no es visible. |
| `expect.text(locator, 'contains')` / `expect.text('text')` | El elemento contiene el texto, o el texto aparece en cualquier parte de la página. |
| `expect.url('/dashboard')` / `expect.url(/regex/)` | La URL de la pestaña coincide. |
| `expect.request({urlContains, method, status})` | Se hizo una petición coincidente desde que empezó el paso. `status` es un número, `'2xx'` o `'error'`. |
| `expect.noErrors({kinds, waitMs, ignoreStatus, ignore})` | No apareció ningún grupo de errores nuevo desde que empezó el paso. Ignora estados como 401 o mensajes por subcadena. |
| `expect.layout({rules, ignore})` | El layout responsive de la página no tiene errores en el viewport de la ejecución. Consulta [la comprobación de layout](https://astrallab.dev/es/docs/saved-tests.md#layout). |

Un localizador es `{role, name, text, nth, exact}`, una referencia de instantánea como `"e12"`, o un texto. Una expectativa fallida lanza un error de aserción con lo que se esperaba y lo que se encontró, y el informe lo muestra. `astral.screenshot({name, fullPage})` dentro de una prueba añade una captura con nombre al paso actual.

## Modos de grabación

| Modo | Qué se captura |
| --- | --- |
| `'off'` | Capturas solo de los fallos. |
| `'steps'` (por defecto) | Una captura al final de cada paso. |
| `'actions'` | Además, una después de cada clic, escritura, selección, pulsación de tecla y navegación, tomada mientras un marcador señala el objetivo: un recuadro, una onda en el punto del clic y un rótulo como _click "Sign in"_. |
| `'video'` | Además, fotogramas de la pestaña a 4 por segundo (hasta 5 minutos o 200 MB), guardados como un `recording.png` animado, y `recording.mp4` donde Astral puede codificarlo (macOS), con un reproductor de fotogramas en el informe. |

Los marcadores se dibujan en todos los modos excepto `'off'`, desaparecen a los 2,5 segundos y al terminar la ejecución, y nunca capturan clics. El texto escrito en un campo de contraseña, de código de un solo uso o de tarjeta nunca se guarda: los rótulos muestran •••••• y el valor se enmascara en el resto del informe. Consulta [Plataformas](https://astrallab.dev/es/docs/platforms.md) para saber qué sistemas admiten vídeo.

## Qué deja una ejecución

Cada ejecución escribe una carpeta en el directorio de datos de Astral que contiene:

- `report.html`: un informe legible con un resumen, una tarjeta por paso con sus capturas, la aserción fallida, las peticiones fallidas, errores de consola, errores de página agrupados, una línea de tiempo de acciones y una sección de rendimiento.
- `report.json`: los mismos datos, más un resumen en Markdown pensado para pegarlo en una incidencia.
- Las capturas como archivos PNG, y la grabación si la pediste.

Se conservan las 50 ejecuciones más recientes (configurable en Ajustes → Desarrollador, donde también se pueden desactivar las ejecuciones de prueba). El agente vuelve a leer las ejecuciones con `test_runs_list` y `test_run_get`.

## Evidencias para tickets

El resumen en Markdown está pensado para pegarlo en una incidencia, junto a las capturas y el informe. Si tu agente está conectado a tu herramienta de tickets, puede publicar esas evidencias allí por ti. Astral en sí no se integra con ninguna herramienta de tickets: escribe las evidencias y deja la publicación en tus manos o en las de tu agente.

Los nombres de las pruebas, los pasos, los nombres de las capturas y todo lo que Astral escribe sobre una ejecución están en inglés, sea cual sea el idioma que uses tú, el ticket o la página. Solo los localizadores conservan el texto propio de la página.
