Ich habe unittest Code wie folgt:
import unittest
class MyUnitTest(unittest.TestCase):
def setUpClass(self):
do_something_expensive_for_all_sets_of_tests()
class MyFirstSetOfTests(MyUnitTest):
def setUpClass(self):
super(MyFirstSetOfTests, self).setUpClass()
do_something_expensive_for_just_these_first_tests()
def test_one(self):
...
def test_two(self):
...
class MySecondSetOfTests(MyUnitTest):
def setUpClass(self):
super(MySecondSetOfTests, self).setUpClass()
do_something_expensive_for_just_these_second_tests()
def test_one(self):
...
def test_two(self):
...
if __== '__main__':
unittest.main()
Wenn ich versuche, diesen Code auszuführen, erhalte ich folgende Fehlermeldung:
======================================================================
ERROR: setUpClass (__main__.MyFirstSetOfTests)
----------------------------------------------------------------------
TypeError: unbound method setUpClass() must be called with MyFirstSetOfTests instance as first argument (got nothing instead)
----------------------------------------------------------------------
setUpClass
muss eine Klassenmethode sein . Aus der Dokumentation :
Eine Klassenmethode, die vor den Tests in einem einzelnen Klassenlauf aufgerufen wurde.
setUpClass
wird mit der Klasse als einziges Argument aufgerufen und muss alsclassmethod()
dekoriert werden:@classmethod def setUpClass(cls): ...
Siehe Klassen- und Modulbefestigungen für weitere Einzelheiten.
In Ihrer Version fehlt der @classmethod
Dekorator :
class MyUnitTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
do_something_expensive_for_all_sets_of_tests()
class MyFirstSetOfTests(MyUnitTest):
@classmethod
def setUpClass(cls):
super(MyFirstSetOfTests, cls).setUpClass()
do_something_expensive_for_just_these_first_tests()
Der Fehler wird ausgelöst, weil MyFirstSetOfTests.setUpClass()
für die Klasse aufgerufen wird, nicht für eine Instanz, aber Sie haben Ihre Methode nicht als markiert ein classmethod
und daher wurde es nicht im automatischen self
Argument übergeben. In dem oben aktualisierten Code habe ich stattdessen cls
verwendet, um anzuzeigen, dass der Name auf das Klassenobjekt verweist.