E2E-Tests in Rust: Vollständiger Leitfaden für reale Projekte

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum E2E-Tests in Rust kein Luxus, sondern eine Notwendigkeit sind

\n\n

Haben Sie jemals eine Rust-Anwendung in der Produktion gestartet und eine Stunde später Panik von Benutzern bekommen? „Auf meinem Rechner funktioniert alles einwandfrei!“ – ein bekanntes Sprichwort? Das Problem ist, dass Unit-Tests nur isolierte Code-Stücke prüfen und Integrationstests die Interaktion von Komponenten. Aber der wahre Albtraum beginnt, wenn die gesamte Pipeline, von der HTTP-Anfrage bis zur Datenbank, aufgrund einer nicht offensichtlichen Verkettung versagt.

\n\n

E2E-Tests von Rust-Anwendungen (End-to-End) sind die einzige Möglichkeit, sicherzustellen, dass Ihre API, Ihr CLI-Tool oder Ihr Webdienst als eine Einheit funktionieren. In diesem Artikel werden wir nicht nur über Theorie sprechen, sondern echte Tests schreiben, die Sie sofort in Ihre CI/CD-Pipeline integrieren können. Kein überflüssiger Inhalt – nur Rust und ein produktionsreifer Ansatz.

\n\n

Was ist E2E-Testing im Kontext von Rust?

\n\n

Im Gegensatz zu Unit-Tests (die Funktionen testen) und Integrationstests (die Module testen), prüfen End-to-End-Tests in Rust den vollständigen Arbeitszyklus der Anwendung: vom Eingang bis zum Ausgang. Für einen Webdienst sieht das so aus:

\n\n
    \n
  • Starten eines echten Servers (oder seines Docker-Images).
  • \n
  • Senden einer HTTP-Anfrage über einen Client (z. B. reqwest).
  • \n
  • Überprüfung der Antwort: Status, Body, Header.
  • \n
  • Validierung des Datenbankzustands (falls vorhanden).
  • \n
\n\n

Für CLI-Anwendungen bedeutet dies das Starten der Binärdatei mit Argumenten und die Überprüfung von stdout/stderr. Für Desktop-Anwendungen die Simulation von Benutzeraktionen über WebDriver (Selenium).

\n\n

Wann sind E2E-Tests obligatorisch?

\n
    \n
  • Sie entwickeln eine öffentliche API.
  • \n
  • Sie haben eine Microservice-Architektur.
  • \n
  • Die Anwendung arbeitet mit externen Diensten (Datenbanken, Warteschlangen, S3).
  • \n
  • Sie möchten Regressionen bei jedem Commit vermeiden.
  • \n
\n\n

Werkzeuge für E2E-Tests in Rust

\n\n

Das Rust-Ökosystem ist reichhaltig, aber für E2E benötigen wir nur wenige Schlüsselbibliotheken:

\n\n\n\n\n\n\n\n\n
BibliothekZweck
reqwestHTTP-Client zum Senden von Anfragen an den zu testenden Server.
tokioAsynchrone Laufzeitumgebung – Grundlage zum Starten von Tests und des Servers.
wiremockMock-Server zur Simulation externer APIs.
assert_cmd + predicatesZum Testen von CLI-Anwendungen.
fantocciniWebDriver-Client (falls Browser-Tests erforderlich sind).
\n\n

Wir werden das integrierte Rust Testing Framework (Modul test) verwenden, aber Asynchronität über tokio::test hinzufügen.

\n\n

Praxis: E2E-Tests für einen Webdienst mit Actix-Web schreiben

\n\n

Angenommen, wir haben eine einfache Rust-Webanwendung mit Actix-Web und einem Endpunkt /api/users, der eine Liste von Benutzern aus PostgreSQL zurückgibt. Wir möchten sicherstellen, dass beim tatsächlichen Start alles funktioniert.

\n\n

Schritt 1: Vorbereitung der Testumgebung

\n\n

Erstellen wir eine separate Datei tests/e2e.rs (Rust behandelt Dateien im Ordner tests/ automatisch als Integrationstests).

\n\n
// tests/e2e.rs\nuse std::process::{Command, Stdio};\nuse std::time::Duration;\nuse tokio::time::sleep;\n\n// Hilfsfunktion: Server im Hintergrund starten\nasync fn start_server() -> std::process::Child {\n    let child = Command::new(\"cargo\")\n        .args(&[\"run\", \"--bin\", \"my_app\"])\n        .stdout(Stdio::null())\n        .stderr(Stdio::null())\n        .spawn()\n        .expect(\"Fehler beim Starten des Servers\");\n\n    // Dem Server Zeit zum Starten geben\n    sleep(Duration::from_secs(5)).await;\n    child\n}
\n\n

Wichtig: Verwenden Sie in einem realen Projekt Docker oder eine separate Datenbankkonfiguration für Tests, um die Produktion nicht zu beeinträchtigen.

\n\n

Schritt 2: Asynchrone Tests schreiben

Blogs

Buchempfehlungen