11
votes

Tests de l'unité Python avec plusieurs configurations?

Je travaille sur un module utilisant des sockets avec des centaines de cas de test. Qui est gentil. Sauf maintenant, j'ai besoin de tester tous les cas avec et sans socket.setDefaultTimeout (60) ... S'il vous plaît ne me disiez pas couper et coller tous les tests et définir / supprimer un délai d'attente par défaut dans la configuration / la déchirure.

Honnêtement, je reçois que chaque cas de test a été aménagé de sa propre pratique, mais je n'aime pas non plus me répéter. Cela ne fait que tester vraiment dans un contexte différent, pas différents tests.

Je vois que l'unitest prend en charge les appareils de configuration / démonstration de niveau de module, mais il n'est pas évident pour moi comment convertir mon module de test unique en testant deux fois avec deux configurations différentes.

Toute aide serait très appréciée.


0 commentaires

5 Réponses :


4
votes

Je le ferais comme ceci:

  1. Faites de tous vos tests dérivent de votre propre classe de testcase, appelons-le synaptestcase.

  2. dans synapticatestcase.setup (), examinez une variable d'environnement pour déterminer s'il faut définir le délai d'attente de socket ou non.

  3. exécutez à deux reprises votre suite de tests, une fois avec la variable d'environnement définie d'une manière, puis à nouveau avec celle-ci définit l'autre sens.

  4. Écrivez un petit script shell pour appeler la suite de tests à la fois.


2 commentaires

Cela semble bon, mais il doit fonctionner automatisé à la fois avec et sans délai d'attente par défaut.


Mise à jour: Utilisez un script shell ou un petit script Python pour exécuter les tests des deux manières.



1
votes

Si votre code n'appelle pas socket.setdefaulttimeout code>, vous pouvez exécuter des tests de la manière suivante:

import socket
socket.setdeaulttimeout(60)
old_setdefaulttimeout, socket.setdefaulttimeout = socket.setdefaulttimeout, None
unittest.main()
socket.setdefaulttimeout = old_setdefaulttimeout


2 commentaires

Cela fonctionne pour le tester avec l'heure par défaut, mais pas sans elle. J'ai besoin de tester tous les tests des deux manières


Ensuite, ajouter socket.setDefaultTimeout (autre_value); Unitest.Main () jusqu'à la fin.



5
votes

Les autres réponses sur cette question sont valables dans la mesure où elles permettent d'effectuer les tests dans plusieurs environnements, mais en jouant avec les options, je pense que j'aime une approche plus autonome. J'utilise des suites et des résultats pour organiser et afficher les résultats des tests. Afin d'exécuter un test avec deux environnements plutôt que deux tests, j'ai pris cette approche - créez une sous-classe TestSuite.

class FixtureSuite(unittest.TestSuite):
    def run(self, result, debug=False):
        socket.setdefaulttimeout(30)
        super().run(result, debug)
        socket.setdefaulttimeout(None)
...
suite1 = unittest.TestSuite(testCases)
suite2 = FixtureSuite(testCases)
fullSuite = unittest.TestSuite([suite1,suite2])
unittest.TextTestRunner(verbosity=2).run(fullSuite)


0 commentaires

8
votes

Vous pouvez faire quelque chose comme ceci:

class TestCommon(unittest.TestCase):
    def method_one(self):
        # code for your first test
        pass

    def method_two(self):
        # code for your second test
        pass

class TestWithSetupA(TestCommon):
    def SetUp(self):
        # setup for context A
        do_setup_a_stuff()

    def test_method_one(self):
        self.method_one()

    def test_method_two(self):
        self.method_two()

class TestWithSetupB(TestCommon):
    def SetUp(self):
        # setup for context B
        do_setup_b_stuff()

    def test_method_one(self):
        self.method_one()

    def test_method_two(self):
        self.method_two()


1 commentaires

C'est plus simple et meilleur que la réponse auto-acceptée! Merci beaucoup!



1
votes

Vous pouvez également hériter et remédier à la suite originale, mais écraser toute la configuration ou une partie de celui-ci:

class TestOriginal(TestCommon):
    def SetUp(self):
        # common setUp here

        self.current_setUp()

    def current_setUp(self):
        # your first setUp
        pass

    def test_one(self):
        # your test
        pass

    def test_two(self):
        # another test
        pass

class TestWithNewSetup(TestOriginal):
    def current_setUp(self):
        # overwrite your first current_setUp


0 commentaires