Vorbemerkungen
Ich werde nicht auf die Unterscheidung der verschiedenen Testarten eingehen, da gibt es auf diesen Seiten bereits einige Fragen dazu .
Ich nehme, was da ist und was sagt: Komponententest im Sinne von "Testen der kleinsten isolierbaren Einheit einer Anwendung", aus der diese Frage tatsächlich stammt
Das Isolationsproblem
Was ist die kleinste isolierbare Einheit eines Programms. Nun, wie ich es sehe, hängt es (hoch?) Davon ab, in welcher Sprache Sie programmieren.
Micheal Feathers spricht über das Konzept einer Naht : [WEwLC, S. 31]
Eine Naht ist ein Ort, an dem Sie das Verhalten in Ihrem Programm ändern können, ohne es dort zu bearbeiten.
Und ohne auf die Details einzugehen, verstehe ich eine Naht - im Rahmen von Unit-Tests - als einen Ort in einem Programm, an dem Ihr "Test" mit Ihrem "Gerät" kommunizieren kann.
Beispiele
Bei Unit-Tests - insbesondere in C ++ - müssen aus dem getesteten Code weitere Nähte hinzugefügt werden , die für ein bestimmtes Problem unbedingt erforderlich wären.
Beispiel:
- Hinzufügen einer virtuellen Schnittstelle, bei der eine nicht virtuelle Implementierung ausreichend gewesen wäre
- Teilen - Verallgemeinern (?) - eine (kleinere) Klasse, die "nur" das Hinzufügen eines Tests erleichtert.
- Teilen Sie ein einzeln ausführbares Projekt in scheinbar "unabhängige" Bibliotheken auf, "nur" um sie für die Tests unabhängig kompilieren zu können.
Die Frage
Ich werde ein paar Versionen ausprobieren, die hoffentlich nach dem gleichen Punkt fragen:
- Ist die Art und Weise, wie Unit-Tests erfordern, dass der Code einer Anwendung "nur" für die Unit-Tests strukturiert wird, oder ist sie tatsächlich für die Anwendungsstruktur von Vorteil?
- Ist die Codeverallgemeinerung, die erforderlich ist, um die Einheit testbar zu machen, für etwas anderes als die Einheitentests nützlich ?
- Erzwingt das Hinzufügen von Komponententests eine unnötige Verallgemeinerung?
- Ist die Formeinheitentestkraft auf Code "immer" auch eine gute Form für den Code im Allgemeinen, wie aus der Problemdomäne ersichtlich?
Ich erinnere mich an eine Faustregel, die besagte, verallgemeinern Sie nicht, bis Sie / müssen, bis es einen zweiten Platz gibt, der den Code verwendet. Bei Unit-Tests gibt es immer einen zweiten Ort, an dem der Code verwendet wird, nämlich den Unit-Test. Also ist dieser Grund genug, um zu verallgemeinern?