Pflegen Sie den Kontext zwischen den Komponententestmethoden in VS Test Project

8

Ich möchte die folgenden Komponententests in der folgenden Reihenfolge ausführen:

  1. Erstellen Sie einen neuen Kunden mit einer Zufallszahl für Name, Passwort usw.
  2. Rufen Sie den gerade erstellten Kunden ab und bestätigen Sie, dass seine Eigenschaften dieselbe Zufallszahl enthalten
  3. Rufen Sie die ForgotPassword-Funktion für denselben Benutzer mit derselben Zufallszahl für den Benutzernamen
  4. auf

Wie klar zu sehen ist, muss ich einmal eine Zufallszahl erzeugen und sie über drei Testmethoden teilen.
Ich kann keinen Weg finden, das zu tun.

  • Ich dachte an das TestContext-Objekt, aber das wird für jede Instanz erstellt.
  • Ich habe versucht, die ClassInitialize () -Methode zu verwenden, hilft nicht, da sie statisch ist und daher die Zahl nicht durch andere Methoden zugänglich ist.

Irgendeine Idee, wie ich mein Ziel erreichen kann?

Danke, Danke Guy

    
Traveling Tech Guy 12.02.2011, 04:07
quelle

4 Antworten

10

Können Sie Ihre geteilten Daten einfach in statische Variablen einfügen?

Etwas einfaches wie das:

%Vor%

Update: Um andere Kommentare zu dieser Frage zusammenzufassen, denke ich, dass alle völlig einverstanden sind, dass der Zustand zwischen Einzeltests zu halten eine schlechte Idee ist. Meine Antwort war einfach eine Möglichkeit, dies zu tun, wenn nötig. Wie ich in einem anderen Kommentar erwähnte, musste ich dies in der Vergangenheit tun, aber nicht für Unit-Tests. Es ist manchmal nützlich / notwendig, den Status zwischen Integrations- / Regressionstests beizubehalten, in denen Sie nicht unbedingt Objekte vortäuschen oder Teile der Anwendung isolieren möchten. Als Software-Tester haben Sie nicht immer den Einfluss / die Fähigkeit / Berechtigung, eine Anwendung sofort zu refaktorieren oder zu überarbeiten, um für diese Tests optimal zu sein.

    
RP Niemeyer 12.02.2011, 04:39
quelle
3

Was Sie hier tun möchten, ist etwas wie ein Repository hinter einer IRepository-Schnittstelle:

%Vor%

Sie können in Ihrem Code eine echte Klasse implementieren, die eine Datenbank abfragt, aber in Ihren Tests können Sie diese Schnittstelle "verpatzen", um genau das zurückzugeben, was Sie wollen. Moq ist mein Favorit - und was folgt ist Pseudo-Code, aber hoffentlich kommst du auf die Idee:

%Vor%

Die Idee hier ist, dass Sie vollständig die Daten kontrollieren, die Sie steuern müssen, ohne darauf angewiesen zu sein, wenn ein Objekt instanziiert wird usw.

    
user1151 12.02.2011 04:57
quelle
2

Es ist eine wirklich schlechte Idee, Komponententests auszuführen, die den Kontext teilen. Obwohl ich offen für Vorschläge bin, bin ich nie auf einen guten Grund gekommen, das zu tun, was Sie vorschlagen.

Wenn jemand Ihre Tests in einer anderen Reihenfolge oder isoliert ausführt, werden sie fehlschlagen. Tests wie diese werden flakey genannt - sie bestehen manchmal, aber nicht andere - und es ist nicht klar warum.

Es ist viel besser, ein spöttisches Framework wie Rhino Mocks zu verwenden, um die Pseudo-Abhängigkeiten in diesem Zustand zu instanziieren das brauchst du. Auf diese Weise ist jeder Test ein eigenständiger Test, der eine bestimmte Sache ohne Bezug zu anderen Tests verifiziert.

Sie werden feststellen, dass es viel einfacher ist, Tests wie diese durchzuführen, und Ihre Ergebnisse werden weniger falsch positive und negative Ergebnisse aufweisen.

    
sheikhjabootie 12.02.2011 06:43
quelle
0

Es ist schlecht, Unit-Tests mit Abhängigkeiten zu erstellen. Es ist jedoch keine schlechte Form, funktionale Tests mit Abhängigkeiten zu erstellen. In der Tat ist es fast in jeder Anwendung mit einer normalen Komplexität erforderlich.

Was Sie versuchen, ist kein Unit-Test. Es ist ein Funktionstest. Und Sie müssen Werte zwischen Testmethoden teilen, um Dinge aus der Sicht eines Benutzers zu erreichen.

    
user2839569 02.10.2013 16:50
quelle