Quelles sont les conventions de nommage les plus utilisées pour les tests unitaires? [fermé]

général

  • sont conformes aux mêmes normes pour tous les essais.
  • être clair sur ce que chaque État d'essai est.
  • soyez précis sur le comportement attendu.

Exemples

1) Methodname_stateundert_expectedbehavior

Public void Sum_NegativeNumberAs1stParam_ExceptionThrown() 

Public void Sum_NegativeNumberAs2ndParam_ExceptionThrown () 

Public void Sum_simpleValues_Calculated ()

Source: normes de Nommage pour les Tests Unitaires

2) Séparer Chaque Mot Par Un Trait De Soulignement

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

autres

  • Fin des noms de méthode avec Test
  • méthode de Démarrage des noms avec le nom de classe
195
demandé sur stung 2008-09-18 23:59:56

7 réponses

je suis à peu près avec vous sur cet homme. Les conventions de nommage que vous avez utilisées sont:

  • clair sur ce qu'est chaque État d'essai.
  • précise le comportement attendu.

que vous faut-il de plus d'un nom de test?

contraire à Ray's answer Je ne pense pas que le Test préfixe est nécessaire. C'est le code de test, nous savons que. Si vous devez faire cela pour identifier le code, alors vous avez de plus gros problèmes, votre code de test ne doit pas être mélangé avec votre code de production.

quant à la longueur et l'utilisation de underscore, son code test , qui s'en soucie? Seuls vous et votre équipe va le voir, tant que c'est lisible et clair sur ce que le test est fait, continuez! :)

cela dit, je suis encore assez nouveau à l'essai et à bloguer mes aventures avec elle :)

88
répondu Rob Cooper 2017-05-23 12:10:26

il vaut également la peine de lire: essais de structuration de L'Unité

la structure a une classe d'essai par classe essayée. Ce n'est pas si inhabituel. Mais ce qui était inhabituel pour moi, c'était qu'il avait une classe imbriquée pour chaque méthode testée.

p.ex.

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

et voici pourquoi:

Eh bien pour une chose, c'est une bonne façon de garder les tests organisé. Tous les les tests (ou faits) d'une méthode sont regroupés. Par exemple, si vous utilisez le CTRL+M, CTRL+O raccourci pour réduire les corps de la méthode, vous pouvez Numérisez facilement vos tests et lisez-les comme une spécification pour votre code.

j'aime aussi cette approche:

MethodName_StateUnderTest_Expectedbehavior

donc peut-être s'adapter à:

État sous-estimé_concerné_par le comportement

parce que chaque essai sera déjà dans une classe imbriquée

35
répondu Lucifer 2012-01-21 18:45:47

j'ai tendance à utiliser la convention de MethodName_DoesWhat_WhenTheseConditions donc par exemple:

Sum_ThrowsException_WhenNegativeNumberAs1stParam

cependant, ce que je vois souvent, c'est que le nom de l'essai doit suivre la structure d'essai unitaire de

  • Organiser
  • Loi
  • Assert

qui suit également la syntaxe BDD / Gherkin de:

  • Donné
  • quand
  • puis

qui serait de nommer le test de la manière suivante: UnderTheseTestConditions_WhenIDoThis_ThenIGetThis

ainsi à votre exemple:

WhenNegativeNumberAs1stParam_Sum_ThrowsAnException

cependant, je préfère de loin mettre le nom de la méthode testée en premier, parce qu'alors les tests peuvent être classés par ordre alphabétique, ou apparaissent Classés par ordre alphabétique dans la boîte de menu déroulant membre dans VisStudio, et tous les tests pour 1 Méthode sont regroupés ensemble.


dans tous les cas, j'aime séparer le majeur sections du nom du test avec des underscores, par opposition à chaque mot , parce que je pense qu'il rend plus facile de lire et de faire passer le point du test.

en d'autres termes, j'aime: Sum_ThrowsException_WhenNegativeNumberAs1stParam mieux que Sum_Throws_Exception_When_Negative_Number_As_1st_Param .

25
répondu CodingWithSpike 2012-02-15 18:20:19

Je ne nomme mes méthodes d'essai comme d'autres méthodes utilisant" PascalCasing " sans aucun underscores ou séparateurs. Je laisse le postfix Test pour la méthode, car il ajoute aucune valeur. Le fait que la méthode est une méthode d'essai est indiqué par l'attribut TestMethod .

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

en raison du fait que chaque classe D'essai ne devrait tester qu'une autre classe, je laisse le nom de la classe en dehors du nom de la méthode. Le nom de l' la classe qui contient les méthodes d'essai est nommée comme la classe à l'essai avec le postfix "Tests".

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

pour les méthodes qui testent les exceptions ou les actions qui ne sont pas possibles, Je préfixe la méthode d'essai avec le mot ne peut pas être .

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

Mon nommage convension sont de base sur l'article "TDD Conseils: Test des Conventions de Nommage Et lignes Directrices" de Bryan Cuire. J'ai trouvé cet article très utile.

22
répondu Jehof 2010-03-23 15:41:40

le premier ensemble de noms est plus lisible pour moi, puisque le CamelCasing sépare les mots et les sous-barres séparent les parties du schéma de nommage.

j'ai aussi tendance à inclure" Test " quelque part, soit dans le nom de la fonction, soit dans l'espace de noms ou la classe qui l'entoure.

5
répondu Frank Szczerba 2008-09-18 20:04:52

tant que vous suivez une seule pratique, cela n'a pas vraiment d'importance. En général, j'écris un test unitaire pour une méthode qui couvre toutes les variations pour une méthode (j'ai des méthodes simples;) et puis j'écris des ensembles plus complexes de tests pour les méthodes qui l'exigent. Ma structure d'appellation est donc habituellement un test (un hold-over de JUnit 3).

-3
répondu Munger 2008-09-18 20:04:47

j'utilise un préfixe " T " pour les espaces de noms, les classes et les méthodes d'essai.

j'essaie d'être soigné et de créer des dossiers qui répliquent les espaces de noms, puis créer un dossier de tests ou un projet séparé pour les tests et répliquer la structure de production pour les tests de base:

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

je peux facilement voir que quelque chose est un test, je sais exactement quel code original il se rapporte, (si vous ne pouvez pas résoudre cela, alors le test est trop alambiqué de toute façon).

il ressemble à la convention de nommage des interfaces, (je veux dire, on ne se confond pas avec les choses commençant par 'I', ni vous avec 'T').

Il est facile de compiler avec ou sans les tests.

il est bon en théorie de toute façon, et fonctionne assez bien pour les petits projets.

-8
répondu user566399 2011-01-07 03:56:20