Wir verwenden StructureMap in einem neuen Softwareentwicklungsprojekt. Eines der Teammitglieder hat einen Komponententest implementiert, der im Wesentlichen die StructureMap- Containerkonfiguration testet . Dies geschieht durch Folgendes:
- Zählt die Anzahl der Instanzen von Assemblys, die für Klassen in unserem Anwendungsnamespace konfiguriert sind.
- Definiert erwartete Instanzen auf Klassenebene
- Gibt an, dass die erwarteten Instanzen mit der Gesamtzahl der gefundenen Instanzen übereinstimmen.
- Gibt an, dass die erwarteten Instanzen mit den im Test definierten übereinstimmen
Ein Beispiel dafür ist;
var repositories = container.GetAllInstances<IEnvironmentRepository>();
Assert.AreEqual(1, repositories .Count());
foundInstances = foundInstances + repositories .Count();
Wir haben auch "Unit-Tests" für die folgende Klasse;
public MyClass(IEnvironmentRepository environmentRepository)
{
}
In diesen Tests verspotten wir IEnvironmentRepository, würden es also nicht wie im Live-System aus dem Container injizieren.
Ein Kollege ignorierte den Komponententest in der Strukturkartenkonfiguration mit einem Kommentar in der Zeile "Komponententest testet nur die eigene Konfiguration". Dies war offensichtlich der Zweck des Tests und ist meiner Meinung nach vollkommen gültig. Ich habe den Typen, der den Test ignoriert hat, gebeten, die Strukturzuordnungskonfiguration für IEnvironmentRepository
(wobei der Test immer noch ignoriert wird) zu entfernen und die vollständige Unit-Test-Suite auszuführen. Alle haben bestanden. Wir haben dann die Anwendung ausgeführt und sie ist umgefallen, weil die Containerkonfiguration jetzt ungültig war. Meiner Meinung nach hat dies den Wert des Tests bewiesen, mein Kollege war immer noch anderer Meinung. Er erklärte lediglich, dass wir die Konfiguration nicht testen sollten, aber ich denke, dass dies im Rahmen eines Komponententests liegt.
Also eine Reihe von Fragen;
- Ist es ein gültiger Komponententest? Wir testen die Konfiguration unseres Containers, nicht dass die Strukturkarte funktioniert (aber ich kann die Überlappung sehen).
- Wenn nicht, wie können Sie die Konfiguration überprüfen, ohne sie zu testen? Wie können Sie verhindern, dass jemand versehentlich eine erforderliche Codezeile löscht und eincheckt?
- Sollte der
MyClass
Unit-Test die Instanz vonIEnvironmentRepository
aus dem Container auflösen und übergeben?
quelle
Antworten:
Dies ist ein absolut gültiger automatisierter Test. Ich nenne sie "Architekturtests", da sie die Solidität der Skelettkomponenten Ihrer Codebasis überprüfen.
Kann der IoC-Container alle Objektbäume in der Anwendung auflösen und zusammenstellen? Kann der Auto Mapper alle registrierten Objekte ohne Fehler zuordnen? Bezieht sich die zentrale Schicht in einer Zwiebelarchitektur nicht auf etwas Äußeres?
Diese Tests können Ihnen viel Zeit sparen, wenn sich ein Konfigurationsfehler einschleicht, indem Sie auf den genauen Schuldigen hinweisen. Gute Frameworks geben Ihnen sehr genaue Fehlermeldungen darüber, was falsch ist, und Sie erhalten sie, sobald Sie die Tests ausführen (idealerweise kontinuierlich), anstatt sie mit etwas Glück tief in einem Laufzeit-Stack-Trace zu vergraben.
Ob es sich um Unit-Tests handelt ... wahrscheinlich nicht, aber sie arbeiten größtenteils immer noch im Speicher und laufen ziemlich schnell. Andererseits, ich weiß nicht, ist es nicht so, als gäbe es eine allgemein akzeptierte Definition von Unit Test.
quelle
Das Problem bei einem solchen Test, bei dem die Interna des Programms getestet werden und nicht eine Anforderung. Ist das, dass der Test fehlschlagen kann, auch wenn das Programm wie erforderlich funktioniert.
Wenn Sie in Ihrem Fall das Container-Setup ändern und möglicherweise eine neue Abhängigkeit haben, die injiziert werden muss, brechen Sie Ihren Test ab.
Wenn Sie die zusätzliche Abhängigkeitsanforderung hinzufügen, aber vergessen, sie dem Container hinzuzufügen, und den Containertest ändern. Alles wird vergehen, aber Ihr Programm wird abstürzen.
Ein besserer automatisierter Test wäre, das Programm zu starten und zu prüfen, ob es abstürzt.
Sie sollten diese Fehlertypen bei Integrations- oder UI-Tests abfangen, auch wenn sie durch die Komponententests fallen.
Trotzdem ist die zunehmende Komplexität der Containereinrichtung ein Ärgernis. Vielleicht lohnen sich einige "schlechte" Tests.
quelle
Unit-Tests Testcode. Alles andere ist "anderes" automatisiertes Testen - nennen Sie es so, wie Sie wollen. Sie scheinen hier die Konfiguration zu testen. Wenn sich die Konfiguration je nach Umgebung ändern kann, gehört sie nicht zu einem Komponententest. Fügen Sie möglicherweise ein Testattribut hinzu, um anzuzeigen, dass der Test von einem anderen Typ als die anderen Tests ist.
quelle
Die Verantwortung des Abhängigkeitsinjektionsbehälters besteht darin , verschiedene Module in einer Arbeitsanwendung zu kleben .
Wenn Sie automatisierte Tests für Ihre Anwendung schreiben, sollten Sie nur wenige "Integrations- (oder Akzeptanz-) Tests haben, die Tests" von Ende zu Ende "ausführen, mit denen die gesamte Pipeline Ihrer Anwendung getestet wird , damit alle an einem bestimmten Testfall beteiligten Module zusammengeklebt werden richtig .
Diese Integrationstests schlagen also fehl, wenn der Abhängigkeitsinjektionscontainer nicht ordnungsgemäß konfiguriert wurde. Dies macht Unit-Tests für den Container selbst unbrauchbar, da der Integrationstest mögliche Fehler in der Containerkonfiguration aufzeigen sollte.
Sie müssen nicht alle möglichen Testfälle in Integrationstests abdecken, sondern nur einen Testfall pro Feature, der den gesamten Weg von der Benutzeroberfläche zur Datenbank abdeckt.
Wenn Integrationstestfälle die Instanziierung einer bestimmten Abhängigkeit nicht abdecken, fügen Sie einfach eine solche hinzu.
Mit Integrationstests können Sie Container frei wechseln, ohne Unit-Tests für ihre Konfiguration neu schreiben zu müssen.
quelle
IMO, die Antworten sind:
Ist es ein gültiger Komponententest? Wir testen die Konfiguration unseres Containers, nicht dass die Strukturkarte funktioniert (aber ich kann die Überlappung sehen).
Wenn nicht, wie können Sie die Konfiguration überprüfen, ohne sie zu testen? Wie können Sie verhindern, dass jemand versehentlich eine erforderliche Codezeile löscht und eincheckt?
Sollte der MyClass-Komponententest die Instanz von IEnvironmentRepository aus dem Container auflösen und übergeben?
quelle
UnitTest überprüft das gewünschte Verhalten einer Einheit bei der Trennung .
Das bedeutet , jede Art von Konfiguration ist nicht in den Anwendungsbereich von Unittests .
Trotzdem sollten Sie automatisierte Tests für Ihre Konfigurationen haben, aber dies sind keine UnitTests ...
quelle