Comment tester une méthode qui passe dans une boucle infinie pour une entrée?

cette question m'est venue à l'esprit et je veux la poser ici.

l'affaire est intentionnelle, j'écris juste une boucle qui tourne à l'infini. Comment puis-je passer un test unitaire?

je demande ceci parce que, cette situation peut se produire n'importe où dans le code. Dites que ma méthode délègue à plusieurs autres méthodes, et je veux savoir

  • Comment il a couru dans une boucle infinie
  • Quel ensemble d'entrée causé
  • appel à quelle méthode (de cette méthode) a causé ceci

je n'ai pas de code écrit pour cela. La question est purement de savoir ce qu'il faut faire si cette situation se présente à l'avenir. S'il vous plaît répondre.

21
demandé sur Shankar Raju 2011-05-11 08:38:14

4 réponses

Comment l'unité de tester une méthode qui s'exécute dans une boucle infinie pour une entrée?

Vous pouvez tester le contraire:"comment tester une méthode à l'unité pour que la méthode ne dure pas plus de Xxxx millisecondes pour une entrée". Si ce test échoue, vous pouvez avoir trouvé un candidat avec une boucle infinie.

NUnit 2.5 a un TimeoutAttribute qui fait échouer un test si le test prend plus de temps que la quantité donnée de milliseconde.

11
répondu k3b 2014-01-08 18:10:46

j'espère que vous voulez dire une sorte de boucle message-pompe/événement. (La plupart des boucles infinies sont mauvais).

Je m'assurerais que la boucle délègue à une classe qui traite l'entrée. Testez cette classe à fond.

la probabilité qu'une construction de boucle ne fonctionne pas est minime.. Donc je testerais ça via un test d'acceptation ou manuellement.

ceci est un peu similaire à tester la fonction principale d'un exécutable. Le truc c'est aussi de s'assurer que les Principaux délégués à une classe testable.

7
répondu Gishu 2011-05-11 04:48:55

avoir la fonction que les boucles délèguent le contrôle de boucle à une dépendance injectée:

interface IShouldLoop
{
    bool ShouldLoop();
}

class ClassToTest
{
    private final IShouldLoop shouldLoop;

    public ClassToTest(IShouldLoop shouldLoop)
    {
        this.shouldLoop = shouldLoop;
    }

    public void MethodToTest()
    {
        while(shouldLoop.ShouldLoop())
        {
            // do whatever
        }
    }
}

vous pouvez tester qu'il délègue le contrôle de boucle à la IShouldLoop dépendance à chaque fois, et vous pouvez contrôler la boucle dans votre test, de sorte qu'il ne boucle le nombre de fois que vous voulez. Dans l'environnement de production, l'instancier avec une instance de IShouldLoop qui renvoie toujours vrai.

7
répondu Scott Whitlock 2011-05-11 18:39:10

le but de l'unitesting est de tester chaque unité la plus simple dans votre programme.

l'unité la plus simple est habituellement une fonction qui fait une seule mission, donc pour unitester votre boucle infinie, vous devrez extraire chaque mission que cette boucle pourrait faire dans une fonction séparée qui peut être appelée seule, une fois fait cela, vous serez en mesure d'appeler ces fonctions en leur donnant tous les paramètres possibles afin de tester différents szenarios votre fonction devrait être en mesure de gérer. Le boucle infinie comme une fonction ne doit pas être unitested, mais les missions plus petites à l'intérieur de celui-ci.

3
répondu CloudyMarble 2011-05-11 05:07:47