646 Stimmen

Bewährte Verfahren zur Benennung von Einheitstests

Was sind die besten Praktiken für die Benennung von Unit-Test-Klassen und Testmethoden?

Dies wurde bereits auf SO diskutiert, unter Was sind einige gängige Namenskonventionen für Unit Tests?

Ich weiß nicht, ob dies ein sehr guter Ansatz ist, aber derzeit habe ich in meinen Testprojekten Eins-zu-Eins-Zuordnungen zwischen jeder Produktionsklasse und einer Testklasse, z. B. Product et ProductTest .

In meinen Testklassen habe ich dann Methoden mit den Namen der Methoden, die ich teste, einen Unterstrich und dann die Situation und das, was ich erwarte, z. B. Save_ShouldThrowExceptionWithNullName() .

1 Stimmen

2 Stimmen

Dies ist zwar keine Antwort auf Ihre Frage, aber es lohnt sich, es zu lesen: haacked.com/archive/2012/01/02/structuring-unit-tests.aspx

6 Stimmen

Google Style Guide sagt: test<MethodUnderTest>_<state> z.B. testPop_emptyStack google-styleguide.googlecode.com/svn/trunk/javaguide.html 5.2.3 Methodennamen. Im Zweifelsfall sollte man Google folgen.

14voto

Pashec Punkte 22869

Yo uso Gegeben-Wenn-Dann Konzept. Werfen Sie einen Blick auf diesen kurzen Artikel http://cakebaker.42dh.com/2009/05/28/given-when-then/ . Artikel beschreibt dieses Konzept in Bezug auf BDD, aber Sie können es auch in TDD ohne Änderungen verwenden.

0 Stimmen

Given-When-Then ist dasselbe wie MethodName_Scenario_ExpectedBehavior, nicht wahr?!

2 Stimmen

Nicht ganz. Given_When_Then bezieht sich eher auf: GivenAnEntity_WhenSomeActionHappens_ThatResultIsExpected Der Test sollte den Willen zum Ausdruck bringen, eine Verhalten, nicht eine Implementierung .

1 Stimmen

"Given When Then" wird oft auch als Gherkin bezeichnet. Es ist eine DSL, die aus den Tools Cucumber, JBehave und Behat hervorgegangen ist.

10voto

Thorsten Lorenz Punkte 11563

Vor kurzem habe ich die folgende Konvention für die Benennung meiner Tests, ihrer Klassen und der darin enthaltenen Projekte entwickelt, um ihre Beschreibbarkeit zu maximieren:

Nehmen wir an, ich teste die Settings Klasse in einem Projekt in der MyApp.Serialization Namensraum.

Zuerst werde ich ein Testprojekt mit der MyApp.Serialization.Tests Namensraum.

Innerhalb dieses Projekts und natürlich des Namespaces werde ich eine Klasse namens IfSettings (gespeichert als IfSettings.cs ).

Nehmen wir an, ich teste die SaveStrings() Methode. -> Ich werde den Test benennen CanSaveStrings() .

Wenn ich diesen Test ausführe, wird die folgende Überschrift angezeigt:

MyApp.Serialization.Tests.IfSettings.CanSaveStrings

Ich denke, das sagt mir sehr gut, was es testet.

Natürlich ist es nützlich, dass im Englischen das Substantiv "Tests" das gleiche ist wie das Verb "tests".

Bei der Benennung der Tests sind Ihrer Kreativität keine Grenzen gesetzt, damit wir vollständige Satzüberschriften für sie erhalten.

Normalerweise müssen die Testnamen mit einem Verb beginnen.

Beispiele hierfür sind:

  • Erkennt (z.B. DetectsInvalidUserInput )
  • Würfe (z. B. ThrowsOnNotFound )
  • Wille (z.B. WillCloseTheDatabaseAfterTheTransaction )

usw.

Eine weitere Möglichkeit ist die Verwendung von "dass" anstelle von "wenn".

Letzteres erspart mir allerdings Tastatureingaben und beschreibt genauer, was ich tue, da ich es nicht weiß, que das getestete Verhalten ist vorhanden, aber ich teste wenn es ist.

[ bearbeiten ]

Nachdem ich obige Namenskonvention nun schon etwas länger verwende, habe ich festgestellt, dass die Si Präfix kann verwirrend sein, wenn man mit Schnittstellen arbeitet. Zufälligerweise ist die Testklasse IfSerializer.cs sieht der Schnittstelle sehr ähnlich ISerializer.cs in der Registerkarte "Dateien öffnen". Dies kann sehr störend sein, wenn man zwischen den Tests, der getesteten Klasse und ihrer Schnittstelle hin und her wechselt. Als Ergebnis würde ich nun wählen Das en Si als Präfix.

Zusätzlich verwende ich jetzt - nur für Methoden in meinen Testklassen, da es nirgendwo sonst als Best Practice angesehen wird - das "_", um Wörter in meinen Testmethodennamen zu trennen, wie in:

[Test] public void detects_invalid_User_Input()

Ich finde, dass dies leichter zu lesen ist.

[ Bearbeiten beenden ]

Ich hoffe, dass dies einige weitere Ideen hervorbringt, da ich die Benennung von Tests für sehr wichtig halte, da man dadurch viel Zeit sparen kann, die man sonst damit verbracht hätte, zu verstehen, was die Tests tun (z.B. wenn man ein Projekt nach einer längeren Pause wieder aufnimmt).

9voto

Ates Goral Punkte 132294

Siehe: http://googletesting.blogspot.com/2007/02/tott-naming-unit-tests-responsibly.html

Bei den Namen von Testmethoden finde ich persönlich die Verwendung von ausführlichen und selbstdokumentierten Namen sehr nützlich (zusammen mit Javadoc-Kommentaren, die weiter erklären, was der Test tut).

7voto

bytedev Punkte 6692

Ich denke, eines der wichtigsten Dinge ist, dass Sie Ihre Namenskonvention konsequent durchsetzen (und sie mit den anderen Mitgliedern Ihres Teams abstimmen). Viel zu oft sehe ich, dass in ein und demselben Projekt viele verschiedene Konventionen verwendet werden.

2voto

Kev Punkte 115293

In VS + NUnit erstelle ich normalerweise Ordner in meinem Projekt, um funktionale Tests zusammenzufassen. Dann erstelle ich Unit-Test-Fixture-Klassen und benenne sie nach der Art der Funktionalität, die ich teste. Die [Test]-Methoden sind benannt nach dem Muster Can_add_user_to_domain :

- MyUnitTestProject   
  + FTPServerTests <- Folder
   + UserManagerTests <- Test Fixture Class
     - Can_add_user_to_domain  <- Test methods
     - Can_delete_user_from_domain
     - Can_reset_password

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X