Quelles sont les conventions de dénomination populaires pour les tests unitaires? [fermé]

StackOverflow https://stackoverflow.com/questions/96297

  •  01-07-2019
  •  | 
  •  

Question

Général

  • Suivez les mêmes normes pour tous les tests.
  • Définissez clairement chaque état de test.
  • Soyez précis sur le comportement attendu.

Exemples

1) MethodName_StateUnderTest_ExpectedBehavior

Public void Sum_NegativeNumberAs1stParam_ExceptionThrown() 

Public void Sum_NegativeNumberAs2ndParam_ExceptionThrown () 

Public void Sum_simpleValues_Calculated ()

Source: Normes de dénomination 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 ()

Autre

  • Terminer les noms de méthodes avec Test
  • Démarrer les noms de méthodes avec le nom de classe
Était-ce utile?

La solution

Je suis à peu près avec vous sur ce seul homme. Les conventions de dénomination que vous avez utilisées sont les suivantes:

  • Définissez clairement chaque état de test.
  • Spécifique sur le comportement attendu.

Qu'avez-vous besoin de plus d'un nom de test?

Contrairement à la réponse de Ray , je ne pense pas que le Le préfixe Test est nécessaire. C'est le code de test, nous le savons. Si vous devez le faire pour identifier le code, vous avez de gros problèmes. votre code de test ne doit pas être confondu avec votre code de production.

En ce qui concerne la longueur et l'utilisation du trait de soulignement, son code de test , qui s'en soucie? Seuls vous et votre équipe pourrez le voir, tant qu'il est lisible et clair sur le résultat du test, continuez! :)

Cela dit, je suis encore relativement novice en matière de test et bloguer mes aventures avec elle :)

Autres conseils

Cela vaut également la peine d'être lu: Structuration des tests unitaires

  

La structure a une classe de test par classe testé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.

par exemple

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, d’une part, c’est un bon moyen de garder les tests organisés. Tous les   les tests (ou faits) d'une méthode sont regroupés. Par exemple, si   vous utilisez les raccourcis CTRL + M, CTRL + O pour réduire les corps de méthode, vous pouvez   analysez facilement vos tests et lisez-les comme une spécification de votre code.

J'aime aussi cette approche:

MethodName_StateUnderTest_ExpectedBehavior

Alors ajustez peut-être sur:

StateUnderTest_ExpectedBehavior

Parce que chaque test sera déjà dans une classe imbriquée

J'ai tendance à utiliser la convention de MethodName_DoesWhat_WhenTheseConditions , par exemple:

Sum_ThrowsException_WhenNegativeNumberAs1stParam

Cependant, ce que je vois beaucoup, c’est de faire en sorte que le nom du test suive la structure de tests unitaires de

  • Organiser
  • Agir
  • Assert

Qui suit également la syntaxe BDD / Gherkin de:

  • Étant donné
  • quand
  • Alors

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

donc à votre exemple:

WhenNegativeNumberAs1stParam_Sum_ThrowsAnException

Toutefois, je préfère de loin placer le nom de la méthode à tester en premier, car les tests peuvent être classés par ordre alphabétique ou par ordre alphabétique dans la liste déroulante des membres de VisStudio, et tous les tests de la méthode 1 sont regroupés.

Dans tous les cas, j'aime bien séparer les sections principales du nom du test par des traits de soulignement, par opposition à chaque mot , car j'estime que cela facilite la lecture et comprendre le sens du test.

En d'autres termes, j'aime bien: Sum_ThrowsException_WhenNegativeNumberAs1stParam meilleur que Sum_Throws_Exception_When_Negative_Number_As_1st_Param . . .

Je nomme mes méthodes de test comme d'autres méthodes utilisant "PascalCasing". sans aucun soulignement ou séparateur. Je laisse postfix Test pour la méthode, car elle n’ajoute aucune valeur. Le fait que la méthode soit une méthode de test est indiqué par l'attribut TestMethod .

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

Etant donné que chaque classe de test ne doit tester qu’une autre classe, laissez le nom de la classe en dehors du nom de la méthode. Le nom de la classe qui contient les méthodes de test est nommé comme la classe sous test avec le suffixe "Tests".

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

Pour les méthodes qui testent des exceptions ou des actions impossibles, préfixez la méthode de test avec le mot Ne peut pas .

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

Mes convictions de nommage sont basées sur l'article & TD; Conseils TDD : Testez les conventions de dénomination & amp; Directives " de Bryan Cook. J'ai trouvé cet article très utile.

Le premier ensemble de noms est plus lisible pour moi, car CamelCasing sépare les mots et les barres de sous-couche séparent des 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.

Tant que vous suivez une seule pratique, peu importe. En général, j’écris un test unitaire unique pour une méthode qui couvre toutes les variantes d’une méthode (j’ai des méthodes simples;) puis j’écris des ensembles de tests plus complexes pour les méthodes qui en ont besoin. Ma structure de nommage est donc généralement testée (une sauvegarde de JUnit 3).

J'utilise un préfixe 'T' pour les espaces de nom, les classes et les méthodes de test.

J'essaie d'être ordonné et de créer des dossiers qui répliquent les espaces de noms, puis de créer un dossier de tests ou un projet séparé pour les tests et de 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 d'origine il se rapporte (si vous ne pouvez pas résoudre ce problème, le test est de toute façon trop compliqué).

Cela ressemble à la convention de nommage des interfaces (je veux dire, vous ne vous trompez pas avec les choses commençant par 'I', vous ne le ferez pas non plus avec 'T').

Il est facile de compiler avec ou sans les tests.

C'est bon en théorie de toute façon, et fonctionne plutôt bien pour les petits projets.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top