Ce sunt convențiile de numire populare pentru testele de unitate?

General

  • Urmați aceleași standarde pentru toate testele.
  • Fii clar despre ceea ce este fiecare stare de testare.
  • Fii specific cu privire la comportamentul așteptat.

Exemple

1) MethodName_StateUnderTest_ExpectedBehavior

Public void Sum_NegativeNumberAs1stParam_ExceptionThrown() 

Public void Sum_NegativeNumberAs2ndParam_ExceptionThrown() 

Public void Sum_simpleValues_Calculated ()

Source: Naming standards for Unit Tests

2) Separarea fiecărui cuvânt de subliniere

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 ()

Alte

  • End method names with Test
  • Start method names with class name
0
adăugat autor Wedge, sursa

7 răspunsuri

Sunt cam mult cu tine pe acest singur om. Convențiile de numire pe care le-ați utilizat sunt:

  • Ștergeți despre ce este fiecare stare de testare.
  • Specifică despre comportamentul așteptat.

De ce mai aveți nevoie de un nume de test?

Contrary to Ray's answer I don't think the Test prefix is necessary. It's test code, we know that. If you need to do this to identify the code, then you have bigger problems, your test code should not be mixed up with your production code.

În ceea ce privește lungimea și utilizarea sublinierii, codul de test , cine dracului îi pasă? Numai tu și echipa ta o vei vedea, atâta timp cât este ușor de citit și clar despre ceea ce face testul, continuă! :)

Acestea fiind spuse, sunt încă destul de nouă pentru a testa și blogging-ul meu aventuri cu ea :)

0
adăugat
Un argument suplimentar pentru prefix. Când căutați un fișier în IDE, puteți căuta cu ușurință cazuri de testare pornind de la Test și numele dvs. de clasă. Dacă numele clasei și numele clasei de test sunt identice, va trebui întotdeauna să întrerupem și să citim calea a două fișiere
adăugat autor THIS USER NEEDS HELP, sursa
Contradicție ușoară "atâta timp cât este lizibilă și clară" și "cine ... îi pasă". Ei bine, toată lumea îi pasă când nu este lizibilă și clară, de aceea este importantă. :-)
adăugat autor David Victor, sursa

Fac numele metodei mele de testare ca și alte metode care utilizează "PascalCasing" fără subliniere sau separatoare. Am lăsat postfixul Test pentru această metodă, deoarece nu adaugă nici o valoare. Că metoda este o metodă de testare este indicată de atributul TestMethod .

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

Datorită faptului că fiecare clasă de testare ar trebui să testeze doar o altă clasă, am lăsat numele clasei din numele metodei. Numele clasei care conține metodele de testare este denumit ca clasa testată cu postfixul "Tests".

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

Pentru metode care testează excepții sau acțiuni care nu sunt posibile, i prefixez metoda de testare cu cuvântul Nu pot .

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

My naming convension are base on the article "TDD Tips: Test Naming Conventions & Guidelines" of Bryan Cook. I found this article very helpful.

0
adăugat
Nu-mi place pentru că nu include comportamentul așteptat
adăugat autor Johannes Rudolph, sursa
+1 pentru linkul la postarea mea - deși nu este necesar să folosiți un prefix "Test" în Testele dvs. Asigurați-vă că testele dvs. specifică comportamentul așteptat. De exemplu, CanRetrieveProperCountWhenAddingMultipleItems ()
adăugat autor bryanbcook, sursa

This is also worth a read: Structuring Unit Tests

Structura are o clasă de test pe fiecare clasă care este testată. Nu e atât de neobișnuit. Dar ceea ce era neobișnuit pentru mine era că el avea o clasă imbricată pentru fiecare metodă testată.

de exemplu.

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
        }
    }
}

Iată de ce:

Ei bine, pentru un singur lucru, este o modalitate frumoasă de a organiza testele organizate. Toate   testele (sau faptele) pentru o metodă sunt grupate împreună. De exemplu, dacă   utilizați comanda rapidă CTRL + M, CTRL + O pentru a restrânge corpurile de metode, puteți   scanați cu ușurință testele și citiți-le ca o specificație pentru codul dvs.

Îmi place și această abordare:

MethodName_StateUnderTest_ExpectedBehavior

Deci, poate ajusta la:

StateUnderTest_ExpectedBehavior

Deoarece fiecare test va fi deja într-o clasă imbricată

0
adăugat
Pentru cei care utilizează Runner de testare Resharper în Visual Studio, au reparat bug-uri folosind clase de test imbricate în 8.x. De atunci, aceasta a devenit de departe structura mea preferată.
adăugat autor angularsen, sursa

Tind să folosesc convenția MethodName_DoesWhat_WhenTheseConditions , de exemplu:

Sum_ThrowsException_WhenNegativeNumberAs1stParam

Cu toate acestea, ceea ce văd o mulțime este de a face numele de testare urmați structura de testare unitate de

  • Aranjare
  • Act
  • Assert

Care urmează, de asemenea, sintaxa BDD/Gherkin a:

  • Date fiind
  • Când
  • Apoi

which would be to name the test in the manner of: UnderTheseTestConditions_WhenIDoThis_ThenIGetThis

la exemplul dvs.:

WhenNegativeNumberAs1stParam_Sum_ThrowsAnException

Cu toate acestea, prefer să pun mai întâi numele metodei testate, deoarece apoi testele pot fi aranjate în ordine alfabetică sau afișate în ordine alfabetică în caseta dropdown a membrilor din VisStudio și toate testele pentru o metodă sunt grupate împreună.


În orice caz, îmi place separarea secțiunilor majore de la numele testului cu subliniere, spre deosebire de fiecare cuvânt , deoarece cred că este mai ușor să citești și să obții punctul din testul de pe.

Cu alte cuvinte, îmi place: Sum_ThrowsException_WhenNegativeNumberAs1stParam mai bine decât Sum_Throws_Exception_When_Negative_Number_As_1st_Param .

0
adăugat

Atâta timp cât urmăriți o singură practică, nu contează cu adevărat. În general, scriu un test unic pentru o metodă care acoperă toate variantele pentru o metodă (am metode simple;) și apoi scriu seturi mai complexe de teste pentru metodele care o cer. Structura mea de denumire este, prin urmare, de obicei, test (un holdover de la JUnit 3).

0
adăugat

Primul set de nume este mai ușor de citit de mine, deoarece CamelCasing separă cuvintele și sub barele separate ale schemei de numire.

De asemenea, am tendința de a include "Test" undeva, fie în numele funcției, fie în spațiul de nume sau clasă anexat.

0
adăugat
@Frank methodName = camelCase MethodName = PascalCase
adăugat autor Metro Smurf, sursa
@ metro-smurf: distincție interesantă, nu am auzit niciodată termenul PascalCase folosit, și am făcut acest lucru de multă vreme. Eu văd doar termenul PascalCase veni în cercurile de dezvoltatori Microsoft, este asta ce faci?
adăugat autor Frank Szczerba, sursa
Istoricul despre Pascal Casing și Camel Casing (de la: Brad Abrams - bloguri .msdn.com/brada/archive/2004/02/03/67024.aspx ) ... "În proiectarea inițială a Cadrului am avut sute de ore de dezbatere despre stilul de numire. "Cu Anders Heilsberg (designerul original al lui Turbo Pascal), un membru cheie al echipei de design, nu este de mirare ca am ales termenul Pascal Casing pentru stilul carcasei popularizat de limbajul de programare Pascal".
adăugat autor Heliac, sursa

Folosesc un prefix "T" pentru spațiile de nume, clase și metode de testare.

Încerc să fiu curat și să creez foldere care replică spațiile de nume, apoi să creeze un dosar de testare sau un proiect separat pentru teste și să replice structura de producție pentru testele de bază:

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

Pot vedea cu ușurință că ceva este un test, știu exact la ce cod original îi aparține (dacă nu poți să faci asta, atunci testul e prea complicat).

Se pare ca convenția de numire a interfețelor (adică nu te confundă cu lucrurile începând cu "eu" și nici cu "T").

Este ușor să compilați doar cu sau fără teste.

Este bine în teorie, oricum, și funcționează destul de bine pentru proiecte mici.

0
adăugat
Prea maghiar (notație) pentru mine. De asemenea, a afirmat anunțul, prefixul T este utilizat pentru parametrii de tip generic.
adăugat autor Danny Varod, sursa
Sunt de acord că notația maghiară a fost deprimată și deoarece conflictul cu parametrii de tip standard generic nu văd o excepție aplicabilă în acest caz (cum ar fi interfețele).
adăugat autor SonOfPirate, sursa
O abordare interesantă. Unii oameni pot argumenta că prefixul T este în conflict cu convenția pe care o utilizați în generice (de exemplu func (T1, T2, TResult)), dar personal nu-mi pasă cât de mult există un consens în cadrul echipei. Numele sunt scurte, ceea ce face lucrurile mai ușor de citit.
adăugat autor stung, sursa