# Testläufe

> Quelle: https://astrallab.dev/de/docs/test-runs

Ein Testlauf macht aus einem Skript Nachweise. Der Agent verpackt einen Ablauf in `astral.test`, teilt ihn in Schritte auf, legt fest, was gelten soll, und Astral zeichnet auf, was passiert ist.

Testläufe verwenden das Tool `run_script`, das vom Agenten geschriebenes JavaScript in einer Sandbox ausführt, die die anderen Tools aufruft. Die Gruppe `script` ist standardmäßig aus; die Gruppe `tests` ist standardmäßig an, wirkt aber nur, solange `script` an ist. Siehe [die Gruppe script](https://astrallab.dev/de/docs/tools.md#group-script).

## Ein Beispiel

```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'});
```

Geben Sie `run_script` für einen Test ein `timeoutMs` von 60000 bis 120000: Nachweise brauchen Zeit.

## astral.test und astral.step

Optionen von `astral.test(name, fn, options)`: `tabId`, `continueOnFailure` (Standard false) und `record`. Es wirft keine Ausnahme, wenn ein Schritt fehlschlägt: Prüfen Sie den `status` im Ergebnis, das auch die Summen, eine Markdown-`summary` und die Pfade des Berichts enthält.

`astral.step(name, fn)` gruppiert Aktionen. An seinem Ende, und bei einem Fehler immer, speichert Astral einen Screenshot, URL und Titel, die während des Schritts gestellten Anfragen (fehlgeschlagene mit geschwärzten Headern und Bodys), Konsolenfehler und -warnungen sowie alle neuen Fehlergruppen. Ein Schritt schlägt fehl, wenn seine Funktion eine Ausnahme wirft oder eine Erwartung darin fehlschlägt. Ohne `continueOnFailure` stoppt der Test beim ersten fehlgeschlagenen Schritt.

`run_script` akzeptiert auch `test: {name, continueOnFailure, ...}`, um das gesamte Skript als einen Test zu behandeln.

## Erwartungen

| Aufruf | Bestanden, wenn |
| --- | --- |
| `expect.visible(locator)` | Das Element sichtbar ist; es wird bis zu `timeoutMs` gewartet (Standard 5000). |
| `expect.hidden(locator)` | Das Element nicht sichtbar ist. |
| `expect.text(locator, 'contains')` / `expect.text('text')` | Das Element den Text enthält oder der Text irgendwo auf der Seite erscheint. |
| `expect.url('/dashboard')` / `expect.url(/regex/)` | Die URL des Tabs übereinstimmt. |
| `expect.request({urlContains, method, status})` | Seit Beginn des Schritts eine passende Anfrage gestellt wurde. `status` ist eine Zahl, `'2xx'` oder `'error'`. |
| `expect.noErrors({kinds, waitMs, ignoreStatus, ignore})` | Seit Beginn des Schritts keine neue Fehlergruppe aufgetreten ist. Statuswerte wie 401 oder Meldungen lassen sich per Teilstring ignorieren. |
| `expect.layout({rules, ignore})` | Das responsive Layout der Seite im Viewport des Laufs keine Fehler hat. Siehe [die Layout-Prüfung](https://astrallab.dev/de/docs/saved-tests.md#layout). |

Ein Locator ist `{role, name, text, nth, exact}`, eine Snapshot-Referenz wie `"e12"` oder ein Text. Eine fehlgeschlagene Erwartung wirft einen Assertion-Fehler mit dem, was erwartet wurde und was gefunden wurde, und der Bericht zeigt ihn an. `astral.screenshot({name, fullPage})` innerhalb eines Tests fügt dem aktuellen Schritt einen benannten Screenshot hinzu.

## Aufzeichnungsmodi

| Modus | Was erfasst wird |
| --- | --- |
| `'off'` | Screenshots nur von Fehlern. |
| `'steps'` (Standard) | Ein Screenshot am Ende jedes Schritts. |
| `'actions'` | Zusätzlich einer nach jedem Klick, jeder Eingabe, Auswahl, Tastenbetätigung und Navigation, aufgenommen, während eine Markierung das Ziel zeigt: ein Rahmen, eine Welle am Klickpunkt und eine Beschriftung wie _click "Sign in"_. |
| `'video'` | Zusätzlich Frames des Tabs mit 4 pro Sekunde (bis zu 5 Minuten oder 200 MB), gespeichert als animiertes `recording.png` und als `recording.mp4`, wo Astral eines kodieren kann (macOS), mit einem Frame-Player im Bericht. |

Markierungen werden in jedem Modus außer `'off'` gezeichnet, verschwinden nach 2,5 Sekunden und am Ende des Laufs und fangen nie Klicks ab. Text, der in ein Passwort-, Einmalcode- oder Kartenfeld getippt wird, wird nie geschrieben: Beschriftungen zeigen •••••• und der Wert wird im restlichen Bericht überall maskiert. Zur Video-Unterstützung siehe [Plattformen](https://astrallab.dev/de/docs/platforms.md).

## Was ein Lauf hinterlässt

Jeder Lauf schreibt einen Ordner in das Datenverzeichnis von Astral mit folgendem Inhalt:

- `report.html`: ein lesbarer Bericht mit einer Zusammenfassung, einer Karte pro Schritt mit seinen Screenshots, der fehlgeschlagenen Assertion, fehlgeschlagenen Anfragen, Konsolenfehlern, gruppierten Seitenfehlern, einer Zeitleiste der Aktionen und einem Leistungsabschnitt.
- `report.json`: dieselben Daten plus eine Markdown-Zusammenfassung, die zum Einfügen in ein Issue gedacht ist.
- Die Screenshots als PNG-Dateien und die Aufzeichnung, falls Sie eine angefordert haben.

Die neuesten 50 Läufe werden aufbewahrt (einstellbar unter Settings → Developer, wo sich Testläufe auch ausschalten lassen). Der Agent liest Läufe mit `test_runs_list` und `test_run_get` wieder aus.

## Nachweise für Tickets

Die Markdown-Zusammenfassung ist dafür gedacht, zusammen mit den Screenshots und dem Bericht in ein Issue eingefügt zu werden. Wenn Ihr Agent mit Ihrem Ticket-Tool verbunden ist, kann er diese Nachweise dort für Sie posten. Astral selbst integriert sich in kein Ticket-Tool: Es schreibt die Nachweise und überlässt das Posten Ihnen oder Ihrem Agenten.

Testnamen, Schritte, Screenshot-Namen und alles, was Astral über einen Lauf schreibt, sind auf Englisch, unabhängig davon, welche Sprache Sie, das Ticket oder die Seite verwenden. Nur Locators behalten den eigenen Text der Seite.
