2009-11-25 6 views
12

Ich habe eine Lösung mit> 270 Projekten, es enthält verschiedene Ordner und etc. Stellen Sie sich vor, jedes Projekt hat Unit Tests, was denken Sie, was ist der beste Weg, sie zu organisieren? Sollte jedes Projekt Unit-Tests in der Nähe haben, oder ich sollte spezielle Ordner für sie erstellen, oder sogar eine andere Lösung für nur Unit-Tests.Best Practice: Unit Tests organisieren

Wie organisieren Sie sie für so große Lösungen/Projekte?

Antwort

12

Sie sollten ein (oder mehrere) Unit Test-Projekte pro Zielprojekt haben. Nur so können Sie flexibel bleiben und jede Unit-Testsuite mit dem Zielprojekt variieren.

Wenn Sie ein Komponententestprojekt für mehr als ein Zielprojekt haben, wird zwischen diesen beiden Projekten eine künstliche enge Kopplung erstellt, da Sie das Komponententestprojekt nicht ohne alle Zielprojekte kompilieren können. Dies macht es wiederum sehr schwierig, ein einzelnes Projekt isoliert zu testen - und das ist alles, was man testen kann.

Wenn Sie Testcode für mehrere Testziele freigeben möchten, können Sie immer eine gemeinsam genutzte Bibliothek mit einer verallgemeinerten, wiederverwendbaren Test-API erstellen, sofern sie keines der Zielprojekte referenziert.

Das heißt, ich muss Jon Skeet zustimmen, dass eine Lösung mit 270 Projekten ein struktureller Geruch ist, der zuerst angegangen werden muss (es sei denn es handelt sich um eine "Build All" -Lösung für automatisierte Builds).

14

Eine einzige Lösung mit 270 Projekten klingt zunächst problematisch. Wie lange dauert es, um VS zu öffnen? :) (Im Ernst, können Sie entweder einige Projekte kombinieren oder die Lösung teilen?)

Normalerweise halte ich die Unit-Tests in ihrem eigenen Projekt, aber in der gleichen Lösung. Spiegeln Sie innerhalb des Projekts die Ordner-/Namespace-Struktur des Produktionsprojekts. Sehen Sie sich an, wie Noda Time für ein Beispiel organisiert ist. Ich war in Unternehmen, wo sie in einer separaten Lösung gehalten wurden, aber das war wirklich schmerzhaft. (Sie hatten einen guten Grund: Die Tests waren in VS2005 und der Produktionscode war 2003.)

Manchmal habe ich den Standardnamespace des Testprojekts auf das gleiche wie das Produktionsprojekt festgelegt - das ist wichtiger in Java als in .NET (da es Ihnen den Zugriff auf Paketerweiterungen ermöglicht), aber es kann immer noch hilfreich sein, da es bedeutet, dass die Klasse, die Sie testen möchten, nicht importiert werden muss.

+0

1 Einheit Testprojekt ist der Weg zu gehen. Wir haben versucht, unsere Projekte zu spiegeln und für jedes Testprojekt ein Testprojekt zu erstellen. –

+0

Ich mag es nicht, sie in einem separaten Projekt zu haben, weil es es schwieriger macht, interne Klassen und Methoden zu testen. – tster

+0

@Arnis: Warum? Ich habe nie ein Problem mit einem Testprojekt pro Produktionsprojekt gefunden. Mit welchen Problemen sind Sie konfrontiert worden? –

0

Nachdem ich vom eingebauten Visual Studio-Testframework zu Gallio gewechselt habe, habe ich damit begonnen, meine Tests in einen Test-Ordner innerhalb desselben Projekts zu schreiben. Für kleine Hilfsklassen könnte ich sogar einen Komponententest genau dort im selben Ordner definieren. Solange Ihre Namespaces relativ klein sind (ich mag keine weitläufigen Namespace-Ordner), fügt dies nicht zu viel Unordnung für mich hinzu. Später, wenn diese Klassen schon eine Weile bestehen und stabil sind, können Sie diese Komponententests in einen separaten Ordner verschieben.

+0

Haben Sie also, wenn Sie Ihre Produktions-Binärdateien versenden, noch die Testklassen? Versenden Sie auch die Test-Framework Assemblies, auf die sich Ihr Projekt vermutlich bezieht? Was ist mit Testdaten? –

+0

Ich habe nie zu viel darüber nachgedacht, weil ich an internen Apps arbeite. Aber ja, ich nehme an, der Testcode würde versandt werden. Das muss ich in Zukunft berücksichtigen. – tster