Agententests in YAML.
Vor jedem Deployment geprüft.
Jeder Testfall prüft die Antwort, die aufgerufenen Tools und die Tools, die tabu sind. Dieselbe Suite läuft per CLI, in Pull Requests und vor jedem Deployment.
version: "1.0"
tests:
- name: routes_billing_question
payload: "I was charged twice for order 4471"
expected_result: output.priority == "normal"
expected_tool_calls:
- tickets.assign_queue: params.queue == "billing"
expected_no_tool_calls:
- oncall.page
- name: pages_oncall_for_outage
payload: "Checkout returns a 500 error for every customer"
mocks: triage_mocks
runs: 5
success_threshold: 80
expected_result: output.priority == "urgent"
expected_tool_calls:
- oncall.page: invocations == 1Die Antwort prüfen. Und jeden Schritt davor.
Ein Testfall besteht, wenn jede Assertion zutrifft. Das reicht von der Reihenfolge der Tool-Aufrufe bis zur Reaktion auf eine abgelehnte Freigabe.
version: "1.0"
tests:
- name: hands_double_charge_to_billing
payload: "I was charged twice for order 4471"
expected_tool_call_order:
- crm.lookup_customer
- tickets.assign_queue
expected_child_agents:
billing-desk:
expected_triggered: 1
approval_decisions:
- tool: tickets.issue_credit
decision: reject
reason: Billing confirms the double charge first
expected_result: status == "completed"Aufrufe in der richtigen Reihenfolge
Die Tools müssen in dieser Reihenfolge vorkommen. Andere Aufrufe dürfen dazwischen liegen.
Übergaben an andere Agenten
Welche Agenten dieser Agent startet, samt Payload, Ausgabe und Tool-Aufrufen.
Menschliche Entscheidungen simulieren
Wartet ein Tool auf eine Person, gibst du approve, reject oder timeout vor. Dann prüfst du, was der Agent danach tut.
Das Ergebnis des Runs
Ausgabe, Status und Fehler des Runs. Ohne das Feld reicht ein fertiger Run.
Echte Testdaten anlegen. Seiteneffekte per Mock abfangen.
Builder legen die Datensätze an, die ein Testfall braucht. Mocks halten den Test von Tools fern, die er nie erreichen darf.
- Builder
- build() liefert den Payload und legt IDs für die Assertions in context ab. cleanup() läuft nach jedem Versuch, auch nach Timeouts und Fehlern.
- Mocks
- Sie ersetzen eigene Tools, Middleware, Hooks oder eigene Guardrails Funktion für Funktion. Gemockte Aufrufe zählen trotzdem für Tool-Assertions.
- Dateien
- PDFs, Bilder und Audio aus tests/files/ hängst du über den Dateinamen an den Payload.
- name: routes_a_real_ticket
builder: open_ticket
builder_args:
subject: "Charged twice for order 4471"
mocks: triage_mocks
expected_tool_call_order:
- crm.lookup_customer
- tickets.assign_queue
expected_tool_calls:
- tickets.assign_queue: params.ticket_id == context.ticket_idimport os
import httpx
HELPDESK = os.environ["HELPDESK_API_URL"]
def build(context, builder_args, test_name, payload, files):
subject = builder_args["subject"]
ticket = httpx.post(f"${HELPDESK}/tickets", json={"subject": subject}).json()
context["ticket_id"] = ticket["id"]
return {"ticket_id": ticket["id"], "message": subject}
def cleanup(run, context, builder_args):
httpx.delete(f"${HELPDESK}/tickets/{context['ticket_id']}")def mock_oncall_page(tool_name, params, context):
return {"paged": False, "incident_id": "test-incident"}Alle Suites mit einem Befehl starten. Im Terminal oder in CI.
connic test führt jede Suite auf connic aus. Du bekommst ein Ergebnis pro Testfall und einen Link zu Runs und Traces.
- Exit Codes für CI
- 0, wenn alles besteht, 1 bei einem Fehlschlag und 2 bei Infrastrukturfehlern. Mit --json bekommst du maschinenlesbare Ergebnisse.
- Abdeckung ohne Zugangsdaten
- --coverage liest agents/ und tests/ offline und listet die Tools, die noch keine Assertion abdeckt.
- Gezielt einzelne Testfälle
- --filter führt nur die Testfälle aus, deren Name eine bestimmte Zeichenfolge enthält.
Ein roter Test stoppt das Deployment.
Liegen Suites in tests/, führt jedes Deployment per CLI oder Git-Push zuerst alle Testfälle aus. Live geht es erst, wenn jeder einzelne besteht.
Pull Requests vor dem Merge testen.
Mit PR Testing läuft die Suite für jeden Pull oder Merge Request auf den Branch eines Environments. Das Ergebnis steht als connic/pr-tests am Commit.
Funktioniert mit GitHub und GitLab ab dem Pro-Plan. Machst du den Check bei deinem Git-Anbieter zur Pflicht, blockiert er Merges, bis er besteht.