95 votes

Exécuter le setUp une seule fois pour un ensemble de tests automatisés

Ma version de Python est 2.6.

J'aimerais n'exécuter la méthode setUp du test qu'une seule fois, car j'y fais des choses qui sont nécessaires pour tous les tests.

Mon idée était de créer une variable booléenne qui serait mise à 'true' après la première exécution et ensuite de désactiver plus d'un appel à la méthode de configuration.

class mySelTest(unittest.TestCase):
    setup_done = False

    def setUp(self):
        print str(self.setup_done)
            
        if self.setup_done:
            return
        self.setup_done = True
        print str(self.setup_done)

Le résultat :

False

True

--- Test 1 ---

False

True

--- Test 2 ---

pourquoi cela ne fonctionne-t-il pas ? Ai-je manqué quelque chose ?

2voto

Anonymous Points 7804

N'essayez pas de déduire les appels à setUp, appelez-le une seule fois.

Par exemple :

class MyClass(object):
    ...

def _set_up():
    code to do one-time setup

_set_up()

Ceci appellera _set_up() lorsque le module sera chargé pour la première fois. Je l'ai définie comme une fonction au niveau du module, mais vous pourriez également en faire une méthode de classe de MyClass.

2voto

NuclearPeon Points 547

Placez tout le code que vous voulez mettre en place une fois en dehors du mySelTest.

setup_done = False

class mySelTest(unittest.TestCase):

    def setUp(self):
        print str(setup_done)

        if setup_done:
            return

        setup_done = True
        print str(setup_done)

Une autre possibilité est d'avoir une classe Singleton que l'on instancie en setUp() qui n'exécutera que le __new__ une fois et renvoie l'instance de l'objet pour le reste des appels. Voir : Existe-t-il un moyen simple et élégant de définir les singletons ?

class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(
                            cls, *args, **kwargs)
            # PUT YOUR SETUP ONCE CODE HERE!
            cls.setUpBool = True

        return cls._instance

class mySelTest(unittest.TestCase):

    def setUp(self):
        # The first call initializes singleton, ever additional call returns the instantiated reference.
        print(Singleton().setUpBool)

Votre façon de faire fonctionne aussi.

0voto

ismail Points 21

Pour python >3 vous pouvez le faire en définissant startTestRun , stopTestRun de unittest.TestResult class . répondre https://stackoverflow.com/a/64892396/2679740

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X