Was sind die Best Practices für die Benennung von Unit-Testklassen und Testmethoden?
Dies wurde bereits in SO unter Was sind einige beliebte 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
und ProductTest
.
In meinen Testklassen habe ich dann Methoden mit den Namen der Methoden, die ich teste, einen Unterstrich und dann die Situation und was ich erwarte, z Save_ShouldThrowExceptionWithNullName()
.
unit-testing
naming-conventions
James Newton-King
quelle
quelle
test<MethodUnderTest>_<state>
zBtestPop_emptyStack
google-styleguide.googlecode.com/svn/trunk/javaguide.html 5.2.3 Methodennamen. Folgen Sie im Zweifelsfall Google.Antworten:
Ich mag Roy Osheroves Namensstrategie , es ist die folgende:
[UnitOfWork_StateUnderTest_ExpectedBehavior]
Es enthält alle Informationen zum Methodennamen und ist strukturiert.
Die Arbeitseinheit kann so klein wie eine einzelne Methode, eine Klasse oder so groß wie mehrere Klassen sein. Es sollte alle Dinge darstellen, die in diesem Testfall getestet werden sollen und unter Kontrolle sind.
Für Assemblys verwende ich die typische
.Tests
Endung, die meiner Meinung nach ziemlich weit verbreitet ist, und dieselbe für Klassen (Endung mitTests
):[NameOfTheClassUnderTestTests]
Früher habe ich Fixture als Suffix anstelle von Tests verwendet, aber ich denke, letzteres ist häufiger, dann habe ich die Namensstrategie geändert.
quelle
UpdateManager.Update()
. In diesem Sinne neige ich dazu, meine TestsWhenUpdating_State_Behaviour
oder zu nennenWhenUpdating_Behaviour_State
. Auf diese Weise teste ich eine bestimmte Aktion einer Klasse, ohne einen Methodennamen in einen Testnamen einzufügen. Aber das Wichtigste ist, dass ich eine Ahnung haben muss, welche Geschäftslogik fehlschlägt, wenn ich den Namen eines fehlgeschlagenen TestsIch befolge gerne den Namensstandard "Sollte" für Tests, während ich das Testgerät nach dem zu testenden Gerät (dh der Klasse) benenne.
Zur Veranschaulichung (mit C # und NUnit):
Warum "sollte" ?
Ich finde, dass es die Testschreiber zwingt, den Test mit einem Satz zu benennen, der so lautet: "Sollte [in einem Zustand sein] [nach / vor / wann] [Aktion findet statt]".
Ja, das Schreiben von "Sollte" überall wiederholt sich ein wenig, aber wie gesagt, es zwingt die Autoren, richtig zu denken (kann also gut für Anfänger sein). Außerdem führt dies im Allgemeinen zu einem lesbaren englischen Testnamen.
Update :
Mir ist aufgefallen, dass Jimmy Bogard auch ein Fan von "sollte" ist und sogar eine Unit-Test-Bibliothek namens hat Sollte" hat .
Update (4 Jahre später ...)
Für Interessierte hat sich mein Ansatz zur Benennung von Tests im Laufe der Jahre weiterentwickelt. Eines der Probleme mit dem oben beschriebenen Sollte- Muster ist nicht einfach auf einen Blick zu erkennen, welche Methode getestet wird. Für OOP halte ich es für sinnvoller, den Testnamen mit der zu testenden Methode zu beginnen. Für eine gut gestaltete Klasse sollte dies zu lesbaren Testmethodennamen führen. Ich benutze jetzt ein ähnliches Format wie
<method>_Should<expected>_When<condition>
. Je nach Kontext möchten Sie natürlich die Sollte / Wann-Verben durch etwas Passenderes ersetzen. Beispiel:Deposit_ShouldIncreaseBalance_WhenGivenPositiveValue()
quelle
increasesBalanceWhenDepositIsMade()
.Ich mag diesen Namensstil:
und so weiter. Es macht einem Nicht-Tester wirklich klar, wo das Problem liegt.
quelle
should
ziehe ich werdewill
soOrdersWithNoProductsWillFail()
Will
ist die Verwendung nicht wirklich angemessen und damit sagen Sie dem Leser fälschlicherweise, dass der Test in keiner Weise fehlschlagen wird ... wenn SieWill
in Zukunft etwas ausdrücken, das möglicherweise nicht passiert, sind Sie es Wenn Sie es falsch verwenden,Should
ist dies die bessere Wahl, da es anzeigt, dass Sie möchten / möchten, dass etwas passiert, aber es nicht oder nicht konnte. Wenn der Test ausgeführt wird, erfahren Sie, ob es fehlgeschlagen / erfolgreich war, sodass Sie dies nicht wirklich implizieren können vorher, das ist die logische Erklärung dafür, was ist deins? warum vermeidestShould
duKent Beck schlägt vor:
Ein Testgerät pro 'Einheit' (Klasse Ihres Programms). Prüfvorrichtungen sind Klassen selbst. Der Name des Testgeräts sollte lauten:
Testfälle (die Testvorrichtungsmethoden) haben folgende Namen:
Zum Beispiel mit der folgenden Klasse:
Ein Testgerät wäre:
quelle
Klassennamen . Bei Namen von Testgeräten finde ich, dass "Test" in der allgegenwärtigen Sprache vieler Domänen weit verbreitet ist. Zum Beispiel in einem technischen Bereich:
StressTest
und in einem kosmetischen Bereich :SkinTest
. Es tut mir leid, Kent nicht zuzustimmen, aber die Verwendung von "Test" in meinen Testgeräten (StressTestTest
?) Ist verwirrend."Einheit" wird auch häufig in Domänen verwendet. ZB
MeasurementUnit
. Wird eine Klasse alsMeasurementUnitTest
Test von "Measurement" oder "MeasurementUnit" bezeichnet?Daher verwende ich gerne das Präfix "Qa" für alle meine Testklassen. ZB
QaSkinTest
undQaMeasurementUnit
. Es wird nie mit Domänenobjekten verwechselt, und die Verwendung eines Präfixes anstelle eines Suffix bedeutet, dass alle Testgeräte visuell zusammenleben (nützlich, wenn Sie Fälschungen oder andere Unterstützungsklassen in Ihrem Testprojekt haben).Namespaces . Ich arbeite in C # und behalte meine Testklassen im selben Namespace wie die Klasse, die sie testen. Dies ist bequemer als separate Test-Namespaces. Natürlich befinden sich die Testklassen in einem anderen Projekt.
Namen der Testmethoden . Ich möchte meine Methoden WhenXXX_ExpectYYY nennen. Es macht die Voraussetzung klar und hilft bei der automatisierten Dokumentation (a la TestDox). Dies ähnelt den Ratschlägen im Google-Testblog, jedoch mit einer stärkeren Trennung von Voraussetzungen und Erwartungen. Zum Beispiel:
quelle
Ich verwende das Given-When-Then- Konzept. Schauen Sie sich diesen kurzen Artikel an: 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.
quelle
Siehe: http://googletesting.blogspot.com/2007/02/tott-naming-unit-tests-responsibly.html
Für Namen von Testmethoden finde ich es persönlich sehr nützlich, ausführliche und selbstdokumentierte Namen zu verwenden (neben Javadoc-Kommentaren, die näher erläutern, was der Test tut).
quelle
Ich denke, eines der wichtigsten Dinge ist, dass Sie in Ihrer Namenskonvention konsistent sind (und dies mit anderen Mitgliedern Ihres Teams vereinbaren). Zu oft sehe ich viele verschiedene Konventionen, die im selben Projekt verwendet werden.
quelle
Ich habe kürzlich die folgende Konvention entwickelt, um meine Tests, ihre Klassen und Projekte zu benennen, um ihre Beschreibungen zu maximieren:
Nehmen wir an, ich teste die
Settings
Klasse in einem Projekt imMyApp.Serialization
Namespace.Zuerst werde ich ein Testprojekt mit dem
MyApp.Serialization.Tests
Namespace erstellen .Innerhalb dieses Projekts und natürlich des Namespace werde ich eine Klasse namens
IfSettings
(gespeichert als IfSettings.cs ) erstellen .Nehmen wir an, ich teste die
SaveStrings()
Methode. -> Ich werde den Test benennenCanSaveStrings()
.Wenn ich diesen Test durchfü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 das Substantiv "Tests" im Englischen dasselbe ist wie das Verb "tests".
Ihrer Kreativität bei der Benennung der Tests sind keine Grenzen gesetzt, sodass wir vollständige Satzüberschriften für sie erhalten.
Normalerweise müssen die Testnamen mit einem Verb beginnen.
Beispiele beinhalten:
DetectsInvalidUserInput
)ThrowsOnNotFound
)WillCloseTheDatabaseAfterTheTransaction
)usw.
Eine andere Möglichkeit ist, "das" anstelle von "wenn" zu verwenden.
Letzteres erspart mir jedoch Tastatureingaben und beschreibt genauer, was ich tue, da ich nicht weiß, dass das getestete Verhalten vorhanden ist, aber teste, ob es vorhanden ist.
[ Bearbeiten ]
Nachdem ich die obige Namenskonvention nun etwas länger verwendet habe, habe ich festgestellt, dass das If- Präfix bei der Arbeit mit Schnittstellen verwirrend sein kann. Es ist einfach so, dass die Testklasse IfSerializer.cs der Schnittstelle ISerializer.cs auf der Registerkarte "Dateien öffnen " sehr ähnlich sieht . Dies kann sehr ärgerlich werden, wenn zwischen den Tests, der getesteten Klasse und ihrer Schnittstelle hin und her gewechselt wird. Als Ergebnis würde ich jetzt That anstelle von If als Präfix wählen .
Zusätzlich verwende ich jetzt - nur für Methoden in meinen Testklassen, da dies nirgendwo anders als Best Practice angesehen wird - das "_", um Wörter in meinen Testmethodennamen wie folgt zu trennen:
Ich finde das leichter zu lesen.
[ Bearbeiten beenden ]
Ich hoffe, dass dies weitere Ideen hervorbringt, da ich die Benennung von Tests für sehr wichtig halte, da Sie dadurch viel Zeit sparen können, die sonst aufgewendet worden wäre, um zu verstehen, was die Tests tun (z. B. nach Wiederaufnahme eines Projekts nach einer längeren Pause). .
quelle
In VS + NUnit erstelle ich normalerweise Ordner in meinem Projekt, um Funktionstests zu gruppieren. Dann erstelle ich Unit-Test-Fixture-Klassen und benenne sie nach der Art der Funktionalität, die ich teste. Die [Test] -Methoden sind wie folgt benannt
Can_add_user_to_domain
:quelle
Ich sollte hinzufügen, dass das Speichern Ihrer Tests im selben Paket, aber in einem parallelen Verzeichnis zur getesteten Quelle, das Aufblähen des Codes beseitigt, sobald Sie bereit sind, ihn bereitzustellen, ohne eine Reihe von Ausschlussmustern ausführen zu müssen.
Ich persönlich mag die in "JUnit Pocket Guide" beschriebenen Best Practices ... es ist schwer, ein Buch zu schlagen, das vom Co-Autor von JUnit geschrieben wurde!
quelle
Der Name des Testfalls für die Klasse Foo sollte FooTestCase oder ähnliches sein (FooIntegrationTestCase oder FooAcceptanceTestCase) - da es sich um einen Testfall handelt. Unter http://xunitpatterns.com/ finden Sie einige Standard-Namenskonventionen wie Test, Testfall, Testvorrichtung, Testmethode usw.
quelle