__init__ für unittest.TestCase

122

Ich möchte ein paar Dinge zu dem hinzufügen, was die unittest.TestCaseKlasse nach der Initialisierung tut, aber ich kann nicht herausfinden, wie es geht.

Im Moment mache ich das:

#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

Ich möchte, dass alle Stubs für diesen gesamten Testsatz nur einmal generiert werden. Ich kann es nicht verwenden, setUpClass()weil ich an Python 2.4 arbeite (ich konnte das auch nicht mit Python 2.7 zum Laufen bringen).

Was mache ich hier falsch?

Ich erhalte diesen Fehler:

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

... und andere Fehler, wenn ich den gesamten Stub-Code verschiebe, __init__wenn ich ihn mit dem Befehl ausführe python -m unittest -v test.

flügge
quelle
@Neeraj Ich denke, meine Frage datiert vor dieser?
Jungvogel
@Abhijeet Diese Frage wurde 2013 gestellt, die, auf die Sie verlinken, wurde 2016 gestellt und hat weniger Antworten und Diskurse. Vielleicht sollten Sie stattdessen die andere Frage als Duplikat markieren? Die Antwort dort ist Python 3 verwandt und diese Frage spricht über Python 2.
Ffledgling
Entschuldigung, mein schlechtes.
Abhijeet

Antworten:

165

Versuche dies:

class TestingClass(unittest.TestCase):

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

Sie überschreiben die TestCase's __init__, daher möchten Sie möglicherweise, dass die Basisklasse die Argumente für Sie verarbeitet.

karthikr
quelle
+1 Ich würde die Basisklasse initialisieren, bevor ich eine Objektmethode aufrufe.
Joachim Isaksson
Das funktioniert bei mir nicht. Das Zeug in gen_stub wird nicht ausgeführt. Infact sieht so aus, als würde gen_stub überhaupt nicht aufgerufen ... Ich kann sagen, dass auf das self.tempdir, das existieren soll, mit den anderen Methoden der Klasse nicht zugegriffen werden kann. Ich erhalte einen AttributeError: 'TestingClass'-Objekt hat kein Attribut' tempdir '
ffledgling
22
sollten Sie dies nicht anrufen, setUpanstatt es zu überschreiben __init__?
Karthikr
2
@karthikr Ich möchte die Stubs einmal für alle Tests generieren, anstatt sie jedes Mal für jeden Test neu zu erstellen. Einige der Stubs werden von einigen Tests nicht einmal verwendet. Ich würde setUpClass verwenden, aber ich glaube nicht, dass Python 2.4 dies unterstützt.
Ffledgling
2
Sie können in diesem Fall auch etwas expliziter sein (was meiner Meinung nach zur besseren Lesbarkeit beiträgt) und verwenden: unittest.TestCase.__init__(self,*args,**kwargs)anstelle vonsuper(TestingClass, self).__init__(*args, **kwargs)
Onyooo
22

Ich wollte nur einige Erläuterungen zum Überschreiben der Init-Funktion von hinzufügen

unittest.TestCase

Die Funktion wird vor jeder Methode in Ihrer Testklasse aufgerufen. Beachten Sie, dass Sie die SetUpClass- Klassenmethode verwenden , wenn Sie einige teure Berechnungen hinzufügen möchten, die einmal ausgeführt werden sollten, bevor alle Testmethoden ausgeführt werden

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

Diese Funktion wird vor allen Testmethoden der Klasse einmal aufgerufen . Suchen Sie setUpnach einer Methode, die vor jeder Testmethode aufgerufen wird.

Thomas Vetterli
quelle
4

Installieren Sie unittest2 und verwenden Sie das unittest dieses Pakets.

import unittest2 

Verwenden Sie dann die Klasse setupModule / tearDownModule oder setupClass / tearDown für eine spezielle Initialisierungslogik

Weitere Informationen: http://www.voidspace.org.uk/python/articles/unittest2.shtml

Außerdem erstellen Sie höchstwahrscheinlich mehr einen Integrationstest als einen Test. Wählen Sie einen guten Namen für die Tests, um sie zu unterscheiden, oder fügen Sie ein anderes Containermodul ein.

fabrizioM
quelle
Danke für den Dokumentationslink.
Chris