2010-06-08 6 views
8

Zum Beispiel:Ist es eine schlechte Idee, Tests zu erstellen, die innerhalb einer Testvorrichtung aufeinander angewiesen sind?

// NUnit-like pseudo code (within a TestFixture) 

Ctor() 
{ 
m_globalVar = getFoo(); 
} 

[Test] 
Create() 
{ 
a(m_globalVar) 
} 

[Test] 
Delete() 
{ 
// depends on Create being run 
b(m_globalVar) 
} 

... oder ...

// NUnit-like pseudo code (within a TestFixture) 

[Test] 
CreateAndDelete() 
{ 
Foo foo = getFoo(); 
a(foo); 

// depends on Create being run 
b(foo); 
} 

... ich mit der später würde und unter der Annahme, dass die Antwort auf meine Frage ist:

Nein, zumindest nicht mit NUnit, weil according to the NUnit manual:

Der Konstruktor sollte keine Nebenwirkungen haben, da NUnit die Klasse mehrere Tim erstellen kann es im Laufe einer Sitzung.

... kann ich auch davon ausgehen, dass es generell eine schlechte Praxis ist? Da Tests in der Regel separat ausgeführt werden können. So kann das Ergebnis von Create niemals durch Löschen bereinigt werden.

Antwort

6

Ja, es ist eine schlechte Übung. In allen Unit-Test-Frameworks, die ich kenne, ist die Ausführungsreihenfolge der Testmethoden nicht garantiert, daher wird ausdrücklich davon abgeraten, Tests zu schreiben, die von der Ausführungsreihenfolge abhängen. Wenn Test B von den (Neben-) Effekten von Test A abhängt, enthält Test A einen allgemeinen Initialisierungscode (der dann stattdessen in eine allgemeine Setup-Methode verschoben werden sollte), oder die beiden Tests sindTeil der gleichen Geschichte, so dass sie vereinigt werden konnten (IMHO - einige Menschen bleiben bei einer einzigen Behauptung pro Testmethode, so würden sie mir diesbezüglich widersprechen), oder Test B sollte ansonsten völlig unabhängig von Test A bezüglich der Befestigung gemacht werden Konfiguration.

+0

ich damit einverstanden, aber alle TestNG http://testng.org/doc/index.html nicht sehen, was eine Verbesserung gegenüber jUnit in vielerlei Hinsicht, sondern ermöglicht auch abhängig Tests - vor allem http: // beust.com/weblog/2004/02/08/junit-pain/für die Begründung der Authorin – Mark

+0

@Mark, TestNG kenne ich nicht, danke für den Link. –

+1

@Mark: Die Argumentation in der zweiten Link ist tatsächlich trügerisch. Bei Komponententests sollte die Datenbank trotzdem gespottet werden, so dass die Kosten für die Einrichtung und den Abbau von Ressourcen ignoriert werden, und für Integrationstests können Sie sich die Kosten leisten (Sie müssen auch die Datenbank in einen bekannten Zustand versetzen und andere) solche Dinge, die in sich durchaus einen Einfluss haben können). –

0

Im Allgemeinen ist es gute Praxis, jeden Ihrer Tests genau eine Sache oder eine Folge von Dingen zu testen. (Sie sind verschiedene Arten von Tests, aber trotzdem.) Außer wenn Sie den Konstruktor oder Destruktor selbst testen, sollten sie als Teil des Test-Setup- und Teardown-Codes und nicht als Tests selbst ausgeführt werden. Es ist in Ordnung, diesbezüglich ineffizient zu sein; Das Wichtigste bei einem Test ist, dass genau klar ist, was getestet wird, und nicht, dass Sie die Anzahl der während des Prozesses durchgeführten Hilfsaktionen minimieren.

Viele Prüfkabelbäume erlauben es Ihnen auch, nur eine Teilmenge von Prüfungen durchzuführen (minimal nur eine). Dies ist ideal, wenn Sie sich auf einen bestimmten Fehler konzentrieren! Aber es bedeutet, dass die Tests so geschrieben werden müssen, dass keine Abhängigkeiten bestehen oder alles ziemlich bedeutungslos ist.

Persönlich würde ich Prüfung von Konstruktoren und Destruktoren früher in meinem Test-Suite als Prüfung des Verhaltens der konstruierten Instanzen setzen, aber YMMV.

1

Auf jeden Fall eine schlechte Idee. Unit-Tests sollten leicht, zustandslos sein und keine Abhängigkeiten von Dingen wie Dateisystem, Registrierung usw. haben. Dies ermöglicht ihnen, schnell zu laufen und weniger brüchig zu sein.

Wenn Sie Ihre Tests in einer bestimmten Reihenfolge erfordern Ausführung, dann kann man nicht immer sicher sein (zumindest ohne Untersuchung), ob ein Test wegen Ausführungsreihenfolge oder ein Problem mit dem Code versagt hat!

Dies wird letztlich zu einem Mangel an Vertrauen führt in Bezug auf Ihre Testsuite und eventuellen Verzicht zu entwickeln.

Verwandte Themen