Ich habe TDD als Entwicklungsstil in den letzten zwei Jahren bei einigen Projekten eingesetzt, aber ich bleibe immer an demselben Punkt hängen: Wie kann ich die Integration der verschiedenen Teile meines Programms testen?
Derzeit schreibe ich einen Testfall pro Klasse (dies ist meine Faustregel: eine "Einheit" ist eine Klasse, und jede Klasse hat einen oder mehrere Testfälle). Ich versuche, Abhängigkeiten mit Hilfe von Mocks und Stubs aufzulösen, und das funktioniert wirklich gut, da jede Klasse unabhängig getestet werden kann. Nach einiger Codierung sind alle wichtigen Klassen getestet. Dann "verdrahte" ich sie mit einem IoC-Container. Und hier stecke ich fest: Wie kann ich testen, ob die Verdrahtung erfolgreich war und die Objekte so interagieren, wie ich es möchte?
Ein Beispiel: Denken Sie an eine Webanwendung. Es gibt eine Controllerklasse, die ein Array von IDs nimmt, ein Repository verwendet, um die Datensätze auf der Grundlage dieser IDs zu holen, dann über die Datensätze iteriert und sie als String in eine Outfile schreibt.
Der Einfachheit halber würde es drei Klassen geben: Controller
, Repository
, OutfileWriter
. Jede von ihnen wird isoliert getestet.
Was ich tun würde, um die "echte" Anwendung zu testen: die http-Anfrage (entweder manuell oder automatisiert) mit einigen IDs aus der Datenbank und dann in das Dateisystem schauen, wenn die Datei geschrieben wurde. Natürlich könnte dieser Prozess automatisiert werden, aber trotzdem: dupliziert das nicht die Testlogik? Ist das, was man einen "Integrationstest" nennt? In einem Buch, das ich kürzlich über Unit-Tests gelesen habe, schien es mir, dass Integrationstests eher ein Anti-Muster sind?