Ich habe die Angewohnheit, immer zu versuchen, Code auf Anwendungsebene von Code auf Framework-Ebene zu unterscheiden. Daher bin ich auf das Problem gestoßen, das Sie häufig beschreiben: Normalerweise möchten Sie, dass der gesamte Code auf Framework-Ebene getestet wird, bevor Code auf Anwendungsebene getestet wird . Auch innerhalb von Code auf Framework-Ebene gibt es in der Regel einige grundlegende Framework-Module, die von allen anderen Framework-Modulen verwendet werden, und wenn etwas in den Grundlagen versagt, macht es keinen Sinn, etwas anderes zu testen.
Leider neigen die Anbieter von Test-Frameworks dazu, eine eher starre Vorstellung davon zu haben, wie ihre Kreationen verwendet werden sollen, und schützen diese Ideen eher, während die Leute, die ihre Frameworks verwenden, die beabsichtigte Verwendung eher akzeptieren, ohne zu hinterfragen. Das ist problematisch, weil es Experimente und Innovationen behindert. Ich kenne nicht alle anderen, aber ich würde es vorziehen, die Freiheit zu haben, zu versuchen, etwas auf seltsame Weise zu tun, und selbst zu sehen, ob die Ergebnisse besser oder schlechter sind als der etablierte Weg, anstatt nicht die Freiheit zu haben Mach die Dinge in erster Linie so, wie ich es will.
Meiner Meinung nach wären Testabhängigkeiten eine großartige Sache, und stattdessen wäre die Möglichkeit, die Reihenfolge festzulegen, in der die Tests ausgeführt werden, die nächstbeste.
Die einzige Möglichkeit, das Problem der Testreihenfolge zu lösen, besteht in der sorgfältigen Benennung, um die Tendenz von Testframeworks auszunutzen, Tests in alphabetischer Reihenfolge auszuführen.
Ich weiß nicht, wie dies in Visual Studio funktioniert, da ich noch nichts mit umfangreichen Tests mit C # zu tun habe, aber auf der Java-Seite der Welt funktioniert es wie folgt: Unter dem Quellordner eines Projekts haben wir normalerweise zwei Unterordner, eine mit dem Namen "main", der den Produktionscode enthält, und eine mit dem Namen "test", der den Testcode enthält. Unter "main" haben wir eine Ordnerhierarchie, die genau der Pakethierarchie unseres Quellcodes entspricht. Java-Pakete entsprechen in etwa C # -Namensräumen. In C # müssen Sie die Ordnerhierarchie nicht an die Namespace-Hierarchie anpassen, es wird jedoch empfohlen, dies zu tun.
Normalerweise spiegeln die Benutzer in der Java-Welt im Ordner "test" die Ordnerhierarchie im Ordner "main" wider, sodass sich jeder Test in genau demselben Paket befindet wie die Klasse, die er testet. Das Grundprinzip dahinter ist, dass die Testklasse häufig auf paketprivate Mitglieder der zu testenden Klasse zugreifen muss, sodass sich die Testklasse im selben Paket wie die zu testende Klasse befinden muss. Auf der C # -Seite der Welt gibt es keine Sichtbarkeit auf Namespaces, daher gibt es keinen Grund, die Ordnerhierarchien zu spiegeln, aber ich denke, dass C # -Programmierer bei der Strukturierung ihrer Ordner mehr oder weniger der gleichen Disziplin folgen.
Auf jeden Fall finde ich die ganze Idee, den Testklassen den Zugriff auf paketlokale Mitglieder der zu testenden Klassen zu ermöglichen, falsch, weil ich dazu neige, Schnittstellen und keine Implementierungen zu testen. Die Ordnerhierarchie meiner Tests muss also nicht die Ordnerhierarchie meines Produktionscodes widerspiegeln.
Also, was ich tue, ist, dass ich die Ordner (dh die Pakete) meiner Tests wie folgt benenne:
t001_SomeSubsystem
t002_SomeOtherSubsystem
t003_AndYetAnotherSubsystem
...
Dies garantiert, dass alle Tests für "SomeSubsystem" vor allen Tests für "SomeOtherSubsystem" ausgeführt werden, die wiederum alle vor allen Tests für "AndYetAnotherSubsystem" usw. ausgeführt werden.
Innerhalb eines Ordners werden einzelne Testdateien wie folgt benannt:
T001_ThisTest.java
T002_ThatTest.java
T003_TheOtherTest.java
Natürlich ist es sehr hilfreich, dass moderne IDEs über leistungsstarke Refactoring-Funktionen verfügen, mit denen Sie ganze Pakete (und alle Unterpakete sowie den gesamten Code, der auf sie verweist) mit nur wenigen Klicks und Tastatureingaben umbenennen können.