Integration vs. Unit-Tests
Sie sollten Ihre Komponententests und Ihre Integrationstests vollständig getrennt halten. Ihre Komponententests sollten nur eine Sache und eine Sache testen und den Rest Ihres Systems vollständig isolieren. Eine Einheit ist lose definiert, läuft jedoch normalerweise auf eine Methode oder eine Funktion hinaus.
Es ist sinnvoll, Tests für jede Einheit durchzuführen, damit Sie wissen, dass ihre Algorithmen korrekt implementiert sind und Sie sofort wissen, was wo schief gelaufen ist, wenn die Implementierung fehlerhaft ist.
Da Sie während des Unit-Tests vollständig isoliert testen, verwenden Sie Stub- und Mock-Objekte, um sich wie der Rest Ihrer Anwendung zu verhalten. Hier kommen Integrationstests ins Spiel. Das isolierte Testen aller Einheiten ist großartig, aber Sie müssen wissen, ob die Einheiten tatsächlich zusammenarbeiten.
Dies bedeutet zu wissen, ob ein Modell tatsächlich in einer Datenbank gespeichert ist oder ob tatsächlich eine Warnung ausgegeben wird, nachdem Algorithmus X fehlgeschlagen ist.
Testgetriebene Entwicklung
Wenn Sie einen Schritt zurücktreten und sich Test Driven Development (TDD) ansehen, müssen Sie einige Dinge berücksichtigen.
- Sie schreiben Ihren Komponententest, bevor Sie den Code schreiben, der ihn bestanden hat.
- Sie bestehen den Test und schreiben gerade genug Code, um dies zu erreichen.
- Nachdem der Test bestanden wurde, ist es Zeit, einen Schritt zurückzutreten. Gibt es etwas zu überarbeiten, wenn diese neue Funktionalität vorhanden ist? Sie können dies sicher tun, da alles durch Tests abgedeckt ist.
Integration zuerst gegen Integration zuletzt
Integrationstests passen auf zwei Arten in diesen TDD-Zyklus. Ich kenne Leute, die sie gerne vorher schreiben. Sie nennen einen Integrationstest einen End-to-End-Test und definieren einen End-to-End-Test als einen Test, der den gesamten Pfad eines Anwendungsfalls vollständig testet (denken Sie daran, eine Anwendung einzurichten, sie zu booten, zu einem Controller zu gehen, sie auszuführen). Überprüfung auf Ergebnis, Ausgabe usw.). Dann beginnen sie mit ihrem ersten Komponententest, lassen ihn bestehen, fügen einen zweiten hinzu, bestehen ihn usw. Langsam bestehen auch immer mehr Teile des Integrationstests, bis die Funktion abgeschlossen ist.
Der andere Stil besteht darin, einen Feature-Unit-Test nach dem anderen zu erstellen und anschließend die Integrationstests hinzuzufügen, die als notwendig erachtet werden. Der große Unterschied zwischen diesen beiden besteht darin, dass Sie beim Integrationstest zunächst über das Design einer Anwendung nachdenken müssen. Diese Art widerspricht der Annahme, dass es bei TDD sowohl um das Anwendungsdesign als auch um das Testen geht.
Praktische Aspekte
Bei mir haben wir alle unsere Tests im selben Projekt. Es gibt jedoch verschiedene Gruppen. Das Tool für die kontinuierliche Integration führt zuerst die als Komponententests gekennzeichneten Tests aus. Nur wenn diese erfolgreich sind, werden auch die langsameren Integrationstests ausgeführt (weil sie echte Anforderungen stellen, echte Datenbanken verwenden usw.).
Normalerweise verwenden wir übrigens eine Testdatei für eine Klasse.
Vorgeschlagene Literatur
- Wachsende objektorientierte Software, die von Tests geleitet wird Dieses Buch ist ein äußerst gutes Beispiel für die erste Methodik des Integrationstests
- Die Kunst des Unit-Tests mit Beispielen in dot.net Über Unit-Tests mit Beispielen in dot.net: D Sehr gutes Buch über die Prinzipien des Unit-Tests.
- Robert C. Martin über TDD (kostenlose Artikel): Lesen Sie auch die ersten beiden Artikel, die er dort verlinkt hat.