web-dev-qa-db-fra.com

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

Général

  • Suivez les mêmes normes pour tous les tests.
  • Soyez clair sur ce que chaque état de test est.
  • 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 nommage pour les tests unitaires

2) Séparer chaque mot par 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
202
stung

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

  • Clarté sur ce que chaque état de test est.
  • Spécifique sur le comportement attendu.

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

Contrairement à réponse de Ray Je ne pense pas que le préfixe Test soit 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.

Quant à la longueur et à l'utilisation du trait de soulignement, son code de test , qui se soucie de l'enfer? 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 assez novice pour tester et bloguer mes aventures avec :)

92
Rob Cooper

Cela vaut également la peine d’être lu: Tests unitaires de structuration

La structure a une classe de test par classe testée. Ce n’est pas si inhabituel. Mais ce qui était inhabituel pour moi é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 tests (ou faits) d'une méthode sont regroupés. Par exemple, si vous utilisez le raccourci CTRL + M, CTRL + O pour réduire les corps de méthode, vous pouvez facilement analyser vos tests et les lire comme une spécification de votre code.

J'aime aussi cette approche:

MethodName_StateUnderTest_ExpectedBehavior

Alors peut-être ajuster à:

StateUnderTest_ExpectedBehavior

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

35
Robs

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

Sum_ThrowsException_WhenNegativeNumberAs1stParam

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

  • Organiser
  • Acte
  • Affirmer

Ce qui suit également la syntaxe BDD/Gherkin de:

  • Donné
  • Quand
  • Ensuite

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

donc à votre exemple:

WhenNegativeNumberAs1stParam_Sum_ThrowsAnException

Cependant, 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 affichés triés par ordre alphabétique dans la liste déroulante des membres de VisStudio, et tous les tests correspondant à une méthode sont regroupés.


Dans tous les cas, j'aime bien séparer la majeure sections du nom du test avec des traits de soulignement, par opposition à chaque Word, car je pense que cela facilite la lecture et la compréhension du point. de l'essai à travers.

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

26
CodingWithSpike

Je nomme mes méthodes de test comme d'autres méthodes utilisant "PascalCasing" sans aucun trait de soulignement ni séparateur. Je laisse le postfix Test pour la méthode out, car il 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.
}

Du fait que chaque classe de test ne doit tester qu’une autre classe, je laisse 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 à tester 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, je préfixe 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 "Conseils TDD: Conventions de nomenclature de test et directives" de Bryan Cook. J'ai trouvé cet article très utile.

22
Jehof

Le premier ensemble de noms m'est plus lisible, 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.

5
Frank Szczerba