157 votes

__init__ pour unittest.TestCase

J'aimerais ajouter deux ou trois choses à ce que le unittest.TestCase mais je n'arrive pas à trouver 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

J'aimerais 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 réussi à le faire fonctionner sur Python 2.7 non plus).

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

Je reçois cette erreur :

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

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

204voto

karthikr Points 36157

Essayez ça :

class TestingClass(unittest.TestCase):

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

Vous remplacez le TestCase 's __init__ Il est donc préférable de laisser la classe de base gérer les arguments pour vous.

53voto

Thomas Vetterli Points 21

Je voulais juste ajouter quelques clarifications sur le fait de remplacer la fonction init de l'application

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 le SetUpClass méthode de classe

@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 qui est appelée avant chaque méthode de test.

4voto

fabrizioM Points 11498

Installez unittest2 et utilisez l'unittest de ce paquet.

import unittest2 

et ensuite utiliser la classe setupModule / tearDownModule ou setupClass / tearDown pour une logique d'initialisation spéciale

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

De plus, il est fort probable que vous créez un test d'intégration plutôt qu'un unittest. Choisissez un bon nom pour les tests afin de les différencier ou mettez-les dans un module conteneur différent.

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