__init__ pour unittest.TestCase

122

J'aimerais ajouter quelques choses à ce que fait la unittest.TestCaseclasse lors de son initialisation, mais je n'arrive pas à comprendre comment le faire.

En ce moment, je fais ceci:

#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 souhaite que tous les stubs ne soient générés qu'une seule fois pour l'ensemble de ces tests. Je ne peux pas utiliser setUpClass()parce que je travaille sur Python 2.4 (je n'ai pas pu le faire fonctionner sur python 2.7 non plus).

Qu'est-ce que je fais de mal ici?

J'obtiens cette erreur:

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

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

brouiller
la source
@Neeraj Je pense que ma question est antérieure à celle-là?
ffledgling
@Abhijeet Cette question a été posée en 2013, celle vers laquelle vous créez un lien a été posée en 2016, et a moins de réponses et de discours, peut-être devriez-vous marquer l'autre question comme doublon à la place? La réponse est liée à Python 3 et cette question parle de Python 2.
ffledgling
désolé pour ça mon mal.
Abhijeet

Réponses:

166

Essaye ça:

class TestingClass(unittest.TestCase):

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

Vous remplacez les TestCase's __init__, vous pouvez donc laisser la classe de base gérer les arguments à votre place.

karthikr
la source
+1 J'initialiserais la classe de base avant d'appeler une méthode objet.
Joachim Isaksson
Cela ne fonctionne pas pour moi. Le contenu de gen_stub n'est pas exécuté. En fait, il semble que gen_stub ne soit pas du tout appelé ... Je peux le dire car le self.tempdir qui est censé exister n'est pas accessible par les autres méthodes de la classe. J'obtiens un AttributeError: l'objet 'TestingClass' n'a pas d'attribut 'tempdir'
ffledgling le
22
ne devriez-vous pas appeler cela setUpplutôt que passer outre __init__?
karthikr
2
@karthikr Je veux générer les stubs une fois pour tous les tests plutôt que de les recréer pour chaque test à chaque fois. Certains des stubs ne seront même pas utilisés par certains des tests. J'utiliserais setUpClass, mais je ne pense pas que python 2.4 le prend en charge.
ffledgling le
2
Vous pouvez également être un peu plus explicite dans ce cas (ce qui aide à la lisibilité à mon avis) et utiliser: unittest.TestCase.__init__(self,*args,**kwargs)au lieu desuper(TestingClass, self).__init__(*args, **kwargs)
Onyooo
22

Je voulais juste ajouter quelques clarifications 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 setUppour une méthode qui est appelée avant chaque méthode de test.

Thomas Vetterli
la source
4

Installez unittest2 et utilisez unittest de ce package.

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

Il est également 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 mettez-les dans un module de conteneur différent.

fabrizioM
la source
Merci pour le lien de documentation.
Chris