Was sind einige beliebte Namenskonventionen für Unit-Tests? [geschlossen]

203

Allgemeines

  • Befolgen Sie für alle Tests die gleichen Standards.
  • Machen Sie sich klar, was jeder Testzustand ist.
  • Seien Sie genau ü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: Namensstandards für Unit Tests

2) Trennen jedes Wortes durch Unterstrich

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

  • Beenden Sie Methodennamen mit Test
  • Starten Sie Methodennamen mit dem Klassennamen
gestochen
quelle

Antworten:

94

Ich bin ziemlich mit dir in diesem einen Mann. Die von Ihnen verwendeten Namenskonventionen sind:

  • Klar, was jeder Testzustand ist.
  • Spezifisch für das erwartete Verhalten.

Was brauchst du mehr von einem Testnamen?

Im Gegensatz zu Rays Antwort halte ich das Testpräfix nicht für notwendig. Es ist Testcode, das wissen wir. Wenn Sie dies tun müssen, um den Code zu identifizieren, haben Sie größere Probleme. Ihr Testcode sollte nicht mit Ihrem Produktionscode verwechselt werden.

Was die Länge und Verwendung des Unterstrichs betrifft , wen interessiert der Testcode? Nur Sie und Ihr Team werden es sehen, solange es lesbar und klar ist, was der Test tut. Machen Sie weiter! :) :)

Trotzdem bin ich noch ziemlich neu darin, meine Abenteuer damit zu testen und zu bloggen :)

Rob Cooper
quelle
20
Leichter Widerspruch "solange es lesbar und klar ist" und "wen ... interessiert". Nun, jeder kümmert sich darum, wenn es nicht lesbar und klar ist, deshalb ist es wichtig. :-)
David Victor
1
Ein zusätzliches Argument für das Präfix. Wenn Sie in IDE nach einer Datei suchen, können Sie Testfälle einfach durchsuchen, indem Sie mit Testund Ihrem Klassennamen beginnen. Wenn der Klassenname und der Name der
Testklasse
@THISUSERNEEDSHELP Ich denke, Ihr Punkt kann leicht überwunden werden, wenn Sie eine gute Ordnerstruktur wie src / libs & src / tests haben . Ich weiß, dass einige Testrunner-Frameworks ein Präfix wie test zur Identifizierung des Testcodes benötigen , sodass dies in diesen Fällen nicht vermieden wird. Im Übrigen kann es sich jedoch um ein sich wiederholendes Präfix handeln, das nicht erforderlich ist.
Negrotico19
@ negrotico19 Ich denke an den Fall wie in IntelliJ, wenn Sie Search Everywhere(Schichtverschiebung) oder Find a Class By Name(CMD O). Ich, dass es wird entweder durch Ordnerstruktur oder Modulstruktur unterschieden werden, aber wenn wir nach etwas suchen, wir wissen schon, was wir suchen möchten. Zum Beispiel, wenn ich für einen Test suchen, mag ich meine Suche nach begrenzen testund suchen Sie nach dem Namen, anstatt die Namen suchen und dann herauszufiltern Test manuell durch Augen. Es ist eine kleine Unterscheidung, aber es ist viel einfacher, "[Klassenname] zu testen" und nur ein Popup zu haben und die mentale Belastung zu reduzieren
DIESER BENUTZER BRAUCHT HILFE
37

Dies ist auch eine Lektüre wert: Strukturieren von Unit-Tests

Die Struktur hat eine Testklasse pro getesteter Klasse. Das ist nicht so ungewöhnlich. Was für mich jedoch ungewöhnlich war, war, dass er für jede getestete Methode eine verschachtelte Klasse hatte.

z.B

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 warum:

Zum einen ist es eine gute Möglichkeit, die Tests organisiert zu halten. Alle Tests (oder Fakten) für eine Methode sind zusammengefasst. Wenn Sie beispielsweise die Tastenkombination STRG + M, STRG + O verwenden, um Methodenkörper zu reduzieren, können Sie Ihre Tests einfach scannen und wie eine Spezifikation für Ihren Code lesen.

Ich mag auch diesen Ansatz:

MethodName_StateUnderTest_ExpectedBehavior

Also vielleicht anpassen an:

StateUnderTest_ExpectedBehavior

Weil jeder Test bereits in einer verschachtelten Klasse ist

Luzifer
quelle
2
Für diejenigen, die den Testläufer von Resharper in Visual Studio verwenden, wurden Fehler mithilfe verschachtelter Testklassen in 8.x behoben. Seitdem wurde dies bei weitem meine bevorzugte Struktur.
Angularsen
Ist es wichtig, dass der Name mit dem MethodName_StateUnderTest_ExpectedBehavior-Ansatz wirklich lang wird? Zum Beispiel "InitializeApiConfiguration_MissingApiKey_IllegalArgumentException". Ist das wirklich ein guter Testname?
Portfoliobuilder
28

Ich neige dazu, die Konvention von MethodName_DoesWhat_WhenTheseConditionsso zu verwenden, zum Beispiel:

Sum_ThrowsException_WhenNegativeNumberAs1stParam

Was ich jedoch häufig sehe, ist, dass der Testname der Unit-Test-Struktur von folgt

  • Ordnen
  • Handlung
  • Behaupten

Was auch der BDD / Gherkin-Syntax von folgt:

  • Gegeben
  • Wann
  • Dann

Das wäre, den Test wie folgt zu benennen: UnderTheseTestConditions_WhenIDoThis_ThenIGetThis

Also zu deinem Beispiel:

WhenNegativeNumberAs1stParam_Sum_ThrowsAnException

Ich bevorzuge es jedoch, den zu testenden Methodennamen an die erste Stelle zu setzen, da die Tests dann alphabetisch angeordnet oder in der Dropdown-Box für Mitglieder in VisStudio alphabetisch sortiert angezeigt werden können und alle Tests für eine Methode zusammengefasst sind.


Auf jeden Fall mag ich es, die Hauptabschnitte des Testnamens im Gegensatz zu jedem Wort durch Unterstriche zu trennen , weil ich denke, dass es einfacher ist, den Punkt des Tests zu lesen und zu vermitteln.

Mit anderen Worten, ich mag: Sum_ThrowsException_WhenNegativeNumberAs1stParambesser als Sum_Throws_Exception_When_Negative_Number_As_1st_Param.

CodingWithSpike
quelle
22

Ich benenne meine Testmethoden wie andere Methoden mit "PascalCasing" ohne Unterstriche oder Trennzeichen. Ich lasse den Postfix- Test für die Methode weg, weil er keinen Wert hinzufügt. Dass die Methode eine Testmethode ist, wird durch das Attribut TestMethod angezeigt .

[TestMethod]
public void CanCountAllItems() {
  // Test the total count of items in collection.
}

Aufgrund der Tatsache, dass jede Testklasse nur eine andere Klasse testen sollte, lasse ich den Namen der Klasse aus dem Methodennamen heraus. Der Name der Klasse, die die Testmethoden enthält, wird wie die zu testende Klasse mit dem Postfix "Tests" benannt.

[TestClass]
public class SuperCollectionTests(){
    // Any test methods that test the class SuperCollection
}

Für Methoden, die auf Ausnahmen oder Aktionen testen, die nicht möglich sind, stelle ich der Testmethode das Wort Cannot voran .

[TestMethod]
[ExpectedException(typeOf(ArgumentException))]
public void CannotAddSameObjectAgain() {
  // Cannot add the same object again to the collection.
}

Meine Namenskonvision basiert auf dem Artikel "TDD-Tipps: Testbenennungskonventionen und -richtlinien " von Bryan Cook. Ich fand diesen Artikel sehr hilfreich.

Jehof
quelle
1
+1 für den Link zu meinem Beitrag - obwohl es nicht erforderlich ist, in Ihren Tests ein "Test" -Präfix zu verwenden. Stellen Sie sicher, dass Ihre Tests das erwartete Verhalten angeben. Zum Beispiel CanRetrieveProperCountWhenAddingMultipleItems ()
bryanbcook
2
Ich mag es nicht, weil es nicht das erwartete Verhalten enthält
Johannes Rudolph
5

Der erste Satz von Namen ist für mich besser lesbar, da das CamelCasing Wörter trennt und die Unterbalken Teile des Namensschemas trennen.

Ich neige auch dazu, "Test" irgendwo aufzunehmen, entweder im Funktionsnamen oder im umschließenden Namespace oder in der Klasse.

Frank Szczerba
quelle
2
@Frank methodName = camelCase MethodName = PascalCase
Metro Smurf
@ metro-smurf: interessante Unterscheidung, ich habe den Begriff PascalCase noch nie gehört und mache das schon lange. Ich sehe den Begriff PascalCase nur in Microsoft-Entwicklerkreisen. Tun Sie das?
Frank Szczerba
Geschichte rund um Pascal Casing und Camel Casing (von: Brad Abrams - blogs.msdn.com/brada/archive/2004/02/03/67024.aspx ) ... "Bei der ersten Entwicklung des Frameworks hatten wir Hunderte von Stunden Zeit Debatte über den Namensstil. Um diese Debatten zu erleichtern, haben wir eine Reihe von Begriffen geprägt. Mit Anders Heilsberg (dem ursprünglichen Designer von Turbo Pascal), einem wichtigen Mitglied des Designteams, ist es kein Wunder, dass wir den Begriff Pascal Casing für den Gehäusestil gewählt haben populär gemacht durch die Programmiersprache Pascal. "
Heliac
-3

Solange Sie einer einzelnen Übung folgen, spielt es keine Rolle. Im Allgemeinen schreibe ich einen einzelnen Komponententest für eine Methode, der alle Variationen einer Methode abdeckt (ich habe einfache Methoden;), und schreibe dann komplexere Testreihen für Methoden, die dies erfordern. Meine Namensstruktur ist daher normalerweise Test (ein Holdover von JUnit 3).

Munger
quelle
-8

Ich verwende ein 'T'-Präfix für Test-Namespaces, Klassen und Methoden.

Ich versuche ordentlich zu sein und Ordner zu erstellen, die die Namespaces replizieren, dann einen Testordner oder ein separates Projekt für die Tests erstellen und die Produktionsstruktur für die Basistests replizieren:

AProj
   Objects
      AnObj
         AProp
   Misc
      Functions
         AFunc
   Tests
      TObjects
         TAnObj
            TAnObjsAreEqualUnderCondition
      TMisc
         TFunctions
            TFuncBehavesUnderCondition

Ich kann leicht erkennen, dass etwas ein Test ist. Ich weiß genau, um welchen Originalcode es sich handelt (wenn Sie das nicht herausfinden können, ist der Test sowieso zu kompliziert).

Es sieht genauso aus wie die Namenskonvention für Schnittstellen (ich meine, Sie werden nicht mit Dingen verwechselt, die mit 'I' beginnen, und Sie werden auch nicht mit 'T' beginnen).

Es ist einfach, mit oder ohne die Tests zu kompilieren.

Theoretisch ist es sowieso gut und funktioniert ziemlich gut für kleine Projekte.

user566399
quelle
3
Interessanter Ansatz. Einige Leute mögen argumentieren, dass das T-Präfix im Widerspruch zu Konventionen steht, die Sie in Generika verwenden (z. B. func (T1, T2, TResult)), aber es ist mir persönlich egal, solange es innerhalb des Teams einen Konsens gibt. Die Namen sind kurz, was die Dinge auch lesbarer macht.
gestochen
Zu ungarisch (Notation) für mich. Außerdem wird, wie angegeben, das Präfix T für generische Typparameter verwendet.
Danny Varod
Ich bin damit einverstanden, dass die ungarische Notation entzogen wurde und aufgrund des Konflikts mit Standardparametern für generische Typen in diesem Fall keine Ausnahme gilt (wie dies für Schnittstellen der Fall ist).
SonOfPirate