Was sind einige beliebte Namenskonventionen für Unit-Tests? [geschlossen]
-
01-07-2019 - |
Frage
Allgemein
- Folgen Sie den gleichen Standards für alle Tests.
- Seien Sie klar, was jeder Testzustand ist.
- Seien Sie konkret über das erwartete Verhalten.
Beispiele
1) MethodName_StateUnderTest_ExpectedBehavior
Public void Sum_NegativeNumberAs1stParam_ExceptionThrown()
Public void Sum_NegativeNumberAs2ndParam_ExceptionThrown ()
Public void Sum_simpleValues_Calculated ()
Quelle: Standards für Unit Tests Naming
2) Die Trennung jedes Wort durch Unders
Public void Sum_Negative_Number_As_1st_Param_Exception_Thrown()
Public void Sum_Negative_Number_As_2nd_Param_Exception_Thrown ()
Public void Sum_Simple_Values_Calculated ()
Andere
- Ende Methodennamen mit Test
- Start Methodennamen mit Klassennamen
Lösung
Ich bin ziemlich viel mit Ihnen auf diesen einen Mann. Die Namenskonventionen Sie verwendet haben, sind:
- Löschen über das, was jeder Testzustand ist.
- Spezifische über das erwartete Verhalten.
Was brauchen Sie von einem Testnamen?
Im Gegensatz href="https://stackoverflow.com/questions/96297/naming-conventions-for-unit-tests#96476"> Ray Antwort auf Ich glaube nicht das Test Präfix erforderlich ist. Es ist Testcode, das wissen wir. Wenn Sie dies tun müssen, um den Code zu identifizieren, dann haben Sie größere Probleme, Ihr Testcode nicht mit dem Produktionscode verwechselt werden soll.
Wie für Länge und die Verwendung von Strich, sein Testcode , der die Hölle Sorgen? Nur Sie und Ihr Team sehen es, so lange wie es lesbar ist, und klar, was der Test tut, weitermachen! :)
Das heißt, ich bin noch recht neu zu Tests und Bloggen meine Abenteuer mit ihm :)
Andere Tipps
Dies ist auch lesenswert: Strukturierung Unit Tests
Die Struktur einer Testklasse pro Klasse hat getestet. Das ist nicht so ungewöhnlich. Aber was war ungewöhnlich für mich war, dass er eine verschachtelte Klasse für jede Methode hatte getestet.
z.
using Xunit;
public class TitleizerFacts
{
public class TheTitleizerMethod
{
[Fact]
public void NullName_ReturnsDefaultTitle()
{
// Test code
}
[Fact]
public void Name_AppendsTitle()
{
// Test code
}
}
public class TheKnightifyMethod
{
[Fact]
public void NullName_ReturnsDefaultTitle()
{
// Test code
}
[Fact]
public void MaleNames_AppendsSir()
{
// Test code
}
[Fact]
public void FemaleNames_AppendsDame()
{
// Test code
}
}
}
Und hier ist der Grund:
Gut für eine Sache, es ist eine schöne Möglichkeit, Tests zu halten organisiert. All die Tests (oder Fakten) für ein Verfahren gruppiert werden. Zum Beispiel, wenn Sie verwenden die STRG + M, STRG + O Verknüpfung Methodenrümpfe zu kollabieren, können Sie leicht Ihre Tests scannen und sie wie eine Spezifikation für Ihren Code lesen.
Ich mag auch diesen Ansatz:
MethodName_StateUnderTest_ExpectedBehavior
So möglicherweise anpassen, um:
StateUnderTest_ExpectedBehavior
Da jeder Test wird bereits in einer verschachtelten Klasse
Ich neige dazu, die Konvention von MethodName_DoesWhat_WhenTheseConditions
so zum Beispiel zu verwenden:
Sum_ThrowsException_WhenNegativeNumberAs1stParam
Doch was muss ich viel sehen, ist der Testnamen folgen der Unit-Tests Struktur
zu machen- Anordnen
- Act
- Assert
Welche folgt auch die BDD / Gherkin Syntax:
- Da
- Wenn
- Dann
, die den Test in der Art zu nennen wäre: UnderTheseTestConditions_WhenIDoThis_ThenIGetThis
so zu Ihrem Beispiel:
WhenNegativeNumberAs1stParam_Sum_ThrowsAnException
So sehr ich es vorziehen, setze die Methodennamen zuerst getestet werden, weil dann die Tests in alphabetischer Reihenfolge angeordnet sein, oder alphabetisch in dem Kastenelement Drop-Down in VisStudio sortierten erscheinen, und alle Tests für 1 Verfahren zusammengefasst.
Auf jeden Fall, ich mag die Trennung der großen Abschnitte des Testnamen mit Unterstrichen, im Gegensatz zu jedem Wort , weil ich denke, es macht es leichter zu lesen und erhält den Punkt des Tests über.
Mit anderen Worten: Ich mag: Sum_ThrowsException_WhenNegativeNumberAs1stParam
besser als Sum_Throws_Exception_When_Negative_Number_As_1st_Param
ich meine Testmethoden wie andere Methoden Name „PascalCasing“ ohne Unterstreichungen oder Separatoren. Ich verlasse das postfix Test für das Verfahren aus, weil es keinen Wert hinzufügt. Dass das Verfahren ein Testverfahren wird durch das Attribut angegeben Testmethod .
[TestMethod]
public void CanCountAllItems() {
// Test the total count of items in collection.
}
Aufgrund der Tatsache, dass jeder Test-Klasse nur eine andere Klasse testen sollte ich den Namen der Klasse aus dem Methodennamen verlassen. Der Name der Klasse, die die Testmethoden enthält, wie die Klasse unter Test mit der Postfix „Tests“ genannt.
[TestClass]
public class SuperCollectionTests(){
// Any test methods that test the class SuperCollection
}
Für Methoden, die Ausnahmen oder Aktionen testen, die nicht möglich sind, i Präfix des Testverfahrens mit dem Wort kann nicht .
[TestMethod]
[ExpectedException(typeOf(ArgumentException))]
public void CannotAddSameObjectAgain() {
// Cannot add the same object again to the collection.
}
Mein Name convension ist Basis auf dem Artikel "TDD-Tipps: Konventionen Test Naming & Richtlinien " von Bryan Cook. Ich fand diesen Artikel sehr hilfreich.
Der erste Satz von Namen ist besser lesbar zu mir, da die camelcase Worte und die Unterstriche getrennte Teile des Namensschemas trennt.
Ich neige dazu, auch „Test“ irgendwo enthalten, entweder in den Funktionsnamen oder der umschließenden Namespace oder Klasse.
Solange Sie eine einzelne Praxis folgen, ist es nicht wirklich wichtig. Im Allgemeinen schreiben I eine einzige Einheit Test für ein Verfahren, das alle Varianten für ein Verfahren umfasst (I haben einfache Methoden;) und dann kompliziertere Sätze von Tests für Methoden schreiben, die es benötigen. Meine Namensstruktur ist daher in der Regel Test (ein Überbleibsel aus JUnit 3).
Ich verwende einen ‚T‘ Präfix für die Testnamespaces, Klassen und Methoden.
Ich versuche, ordentlich und Ordner erstellen zu sein, die die Namespaces zu replizieren, dann einen Ordner oder Tests separates Projekt für die Tests erstellen und die Produktionsstruktur für die grundlegenden Tests wiederholen:
AProj
Objects
AnObj
AProp
Misc
Functions
AFunc
Tests
TObjects
TAnObj
TAnObjsAreEqualUnderCondition
TMisc
TFunctions
TFuncBehavesUnderCondition
Ich kann leicht sehen, dass etwas ein Test ist, ich weiß genau, was ursprünglicher Code es betrifft, (wenn Sie nicht heraus arbeiten können, dann wird der Test auch gewunden sowieso).
Es sieht genauso aus wie die Schnittstellen-Namenskonvention, (ich meine, bekommt man nicht verwirrt mit den Dingen, die mit ‚I‘, noch werden Sie mit ‚T‘).
Es ist einfach, nur mit oder ohne die Tests zusammenstellen.
Es ist gut, in der Theorie wie auch immer, und funktioniert sehr gut für kleine Projekte.