web-dev-qa-db-fra.com

__init__ pour unittest.TestCase

J'aimerais ajouter quelques éléments à ce que la classe unittest.TestCase Fait lors de son initialisation, mais je ne vois pas comment le faire.

En ce moment je fais ça:

#filename test.py

class TestingClass(unittest.TestCase):

    def __init__(self):
        self.gen_stubs()

    def gen_stubs(self):
        # Create a couple of tempfiles/dirs etc etc.
        self.tempdir = tempfile.mkdtemp()
        # more stuff here

Je voudrais que tous les stubs soient générés une seule fois pour tout cet ensemble de tests. Je ne peux pas utiliser setUpClass() parce que je travaille sur Python 2.4 (je n'ai pas réussi à le faire fonctionner python = 2,7 non plus).

Qu'est-ce que je fais mal ici?

Je reçois cette erreur:

 `TypeError: __init__() takes 1 argument (2 given)` 

... et autres erreurs lorsque je déplace tout le code de raccord dans __init__ lorsque je l'exécute avec la commande python -m unittest -v test.

90
ffledgling

Essaye ça:

class TestingClass(unittest.TestCase):

    def __init__(self, *args, **kwargs):
        super(TestingClass, self).__init__(*args, **kwargs)
        self.gen_stubs()

Vous écrasez TestCase's __init__, vous pouvez donc laisser la classe de base gérer les arguments pour vous.

128
karthikr

Je voulais juste ajouter quelques précisions sur le remplacement de la fonction init de

unittest.TestCase

La fonction sera appelée avant chaque méthode de votre classe de test. Veuillez noter que si vous souhaitez ajouter des calculs coûteux qui doivent être effectués une fois avant d'exécuter toutes les méthodes de test, veuillez utiliser la méthode de classe SetUpClass.

@classmethod
def setUpClass(cls):
    cls.attribute1 = some_expensive_computation()

Cette fonction sera appelée une fois avant toutes les méthodes de test de la classe. Voir setUp pour une méthode appelée avant chaque méthode de test.

5
Thomas Vetterli

Installez unittest2 et utilisez le unittest de ce paquet.

import unittest2 

puis utilisez la classe setupModule/tearDownModule ou setupClass/tearDown pour une logique d'initialisation spéciale

Plus d'infos: http://www.voidspace.org.uk/python/articles/unittest2.shtml

En outre, il est fort probable que vous créez un test d’intégration plus qu’un test unitaire. Choisissez un bon nom pour les tests afin de les différencier ou insérez un module de conteneur différent.

3
fabrizioM