webentwicklung-frage-antwort-db.com.de

Python unittest - setUpClass () macht mir Probleme - warum kann ich nicht so erben?

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)

----------------------------------------------------------------------
43
jononomo

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 als classmethod() 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.

72
Martijn Pieters