Nach einigen weiteren Jahren des Programmierens und Bearbeitens von Projekten werde ich eine Antwort auf meine eigene Frage geben.
Ja, Sie sollten Komponententests schreiben. End-to-End-Tests sind schwerer zu schreiben und brüchig, insbesondere wenn sie auf UI-Komponenten basieren.
Wenn Sie ein Framework wie Django oder Rails (oder Ihre eigenen benutzerdefinierten Klassen) verwenden, sollten Sie eine Formularklasse haben, die die Validierung des Formulars übernimmt. Sie haben auch Ansichtsklassen, die gerenderte Vorlagen und das Formular anzeigen und GET- und POST-Anforderungen verarbeiten.
In einem End-to-End-Test würden Sie:
- Holen Sie sich die URL
- Füllen Sie das Formular mit gültigen Daten aus
- Sende das Formular an die URL
- Stellen Sie sicher, dass die Datenbank aktualisiert oder eine Aktion aufgrund des gültigen Formulars ausgeführt wurde
Sie testen viel Code und Ihre Berichterstattung wird ziemlich gut sein, aber Sie testen nur den glücklichen Pfad, wenn alles richtig läuft. Wie stellen Sie sicher, dass das Formular die richtige Validierung enthält? Was ist, wenn dieses Formular auf mehreren Seiten verwendet wird? Schreiben Sie noch einen End-to-End-Test?
Versuchen wir es noch einmal mit Unit-Tests:
- Testen Sie die Methode view GET
- Testen Sie die View-POST-Methode mit einem Fake / Mock-Formular
- Testen Sie das Formular mit gültigen Daten
- Testen Sie das Formular mit ungültigen Daten
- Testen Sie die Nebenwirkungen des Formulars
Mit Unit-Tests testen Sie kleinere Codeteile, und die Tests sind spezifisch und einfacher zu schreiben. Wenn Sie dies mit TDD (Test Driven Development) kombinieren, erhalten Sie Code mit höherer Qualität.
Die Leichtigkeit, Unit-Tests zu schreiben, sollte nicht vernachlässigt werden, denn wenn Sie an einem Projekt arbeiten, für das es keine automatisierten Tests gibt, müssen Sie irgendwo anfangen. Das Starten mit Komponententests ist einfacher und schneller und ermöglicht es Ihnen, sofort nach Fehlern zu suchen, anstatt nur nach dem glücklichen Pfad.
was told by a co-worker that the reason for this is that we can rip out and change the underlying implementation at any point as long as the end-to-end tests pass.
- Das gilt auch für Unit-Tests. Es klingt für mich so, als würden die End-to-End-Tests als Entschuldigung dafür dienen, keine Komponententests zu schreiben.