Haben die Unit-Tests das Projekt "verwenden" oder haben Sie nur den gleichen Namespace?

9

Hintergrund

Ich arbeite an einem Projekt mit C # .NET und habe meiner Lösung in Visual Studio gerade ein neues Komponententestprojekt hinzugefügt. So habe ich das immer gemacht:

  1. Erstellen Sie ein neues Unit-Test-Projekt.
  2. Haben Sie das Projekt einen Verweis gehören zu dem Projekt im Test .
  3. Gerade ist ( using) , um das Projekt.

Ich denke, der andere Weg, wie Sie es tun könnten, wäre ...

  1. Erstellen Sie ein neues Unit-Test-Projekt.
  2. Haben Sie das Projekt einen Verweis gehören zu dem Projekt im Test .
  3. Machen Sie das Unit - Test - Projekt einen Namespace mit dem teilen Projekt im Test .

Frage

Gibt es eine akzeptierte Möglichkeit, dies für Projekte in der .NET-Welt zu tun, oder ist dies nur eine Meinung und es gibt nichts mehr dazu?

Schnüffeln
quelle
3
Die Verwendung desselben Namespace scheint nur eine Möglichkeit zu sein, Namespace-Konflikte zu verursachen. Und Sie benötigen immer noch einen Verweis auf die Assembly, die den zu testenden Code enthält.
David Arno
2
Ich stimme David zu. Wenn Sie Ihre Testmethoden nicht explizit anders benennen als die zu testende Methode, besteht die Gefahr, dass Namenskonflikte auftreten. Ich sehe nur nicht, wie das Teilen eines Namespace der Party etwas bringt.
Robbie Dee
2
Wenn sie richtig geschrieben sind, sollten Tests niemals in Konflikt geraten, da die Methodennamen so etwas wie MethodName_StateUnderTest_ExpectedBehavior()sind und ich sicher bin, dass Sie geeignete, nicht widersprüchliche Namen für die Testklassen finden könnten. Die eigentliche Frage ist: Wollen Sie wirklich, dass diese Typen in Ihrer Intelligenz auftauchen?
Robert Harvey
1
@DavidArno TDD ist nicht in jeder Situation anwendbar. Wenn mein Code nur ein elektronisches Gerät liest und ein Ergebnis zurückgibt (was 99% der Zeit für EEs ist, die Code schreiben) ... Alles, was mich interessiert, ist, ob ich zu diesem Zeitpunkt den richtigen Wert erhalte oder nicht Es spielt keine Rolle, ob ich den Test vorher oder nachher schreibe.
Snoop
1
@StevieV, ich entschuldige mich, das sollte kein ernsthafter Kommentar sein (also das Smiley-Gesicht), aber ich denke, es ist nicht so rübergekommen.
David Arno

Antworten:

13

Ihre Komponententests befinden sich in einem separaten Projekt und erfüllen eine von Ihrem Hauptcode getrennte Funktion. Daher ist es für mich am sinnvollsten, sie in einen separaten Namespace zu stellen.

Wenn Sie erwägen, sie in denselben Namespace zu setzen, um die usingZeile zu speichern , tun Sie dies nicht. Weniger Code ist gut, klarerer Code ist besser.

svick
quelle
2
Und Sie möchten keine Komponententests freigeben / verteilen / bereitstellen.
Radarbob
1
Durch das Einfügen von Tests in einen separaten Namespace wird (in einigen Sprachen) sichergestellt, dass Sie die API als Drittanbieter sehen, dh nicht auf Mitglieder zugreifen, auf die nur Klassen im selben Namespace zugreifen können. Praktischerweise werden Ihre Tests alle falschen Warnungen zum Schweigen bringen, wenn Ihre öffentlichen API-Mitglieder nicht referenziert oder unnötig offengelegt werden.
StackOverthrow
@TKK Die Frage bezieht sich auf C # und in C # funktionieren Namespaces nicht so.
Svick
@svick: Ja, und C # zwingt Sie nicht dazu, jeder Assembly einen eigenen Namespace zuzuweisen. Dies ist jedoch eine nützliche Konvention, insbesondere bei größeren Projekten, und ich würde eine Unit-Test-Baugruppe nicht anders behandeln als jede andere Baugruppe.
Doc Brown
0

Ich habe Testsein paar Jahre lang Unit-Test-Projekte mit demselben Namespace wie das eigentliche Projekt verwendet (indem das Suffix im Namespace des Testprojekts manuell entfernt wurde ), ohne Probleme.

Ich denke, dass dies zu einem einfacheren Code führt, daher schlage ich normalerweise vor, diesen Ansatz zu wählen. Einige der Nachteile, wie potenzielle Namespace-Konflikte, sollten beim Umgang mit einem Unit-Test-Projekt einfach nicht auftreten, da Sie dafür bereits einige Testkonventionen befolgen, z. B. das Suffixieren aller Testklassen mit Tests. Außerdem klingt es für mich sehr intuitiv, die Klassen und die Testklassen im selben Namespace zu haben.

Einige Leute werden es für seltsam halten, aber dies sollte wirklich nicht der Fall sein, da viele Framework-Assemblys auch diese Strategie verwenden, mehrere DLLs mit Klassen in denselben Namespaces zu haben: Es sollte keine überraschende oder schlechte Sache sein an und für sich üben.

Ich denke, dass dies mehr auf den persönlichen Geschmack abzielt, daher ist es per se nicht wirklich "verantwortungsbewusst". Trotzdem ist "meine Stimme", wie oben dargelegt, zunächst, es selbst zu versuchen, und wenn Ihnen der Ansatz gefällt, versuchen Sie es.

julealgon
quelle