web-dev-qa-db-fra.com

Python unittest - setUpClass () me pose des problèmes - pourquoi ne puis-je pas hériter comme ça?

J'ai un code unittest comme le suivant:

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()

Lorsque j'essaie d'exécuter ce code, j'obtiens une erreur comme celle-ci:

======================================================================
ERROR: setUpClass (__main__.MyFirstSetOfTests)
----------------------------------------------------------------------
TypeError: unbound method setUpClass() must be called with MyFirstSetOfTests instance as first argument (got nothing instead)

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

setUpClass doit être une méthode de classe. De la documentation :

Une méthode de classe appelée avant les tests dans une exécution de classe individuelle. setUpClass est appelé avec la classe comme seul argument et doit être décoré comme classmethod():

@classmethod
def setUpClass(cls):
    ...

Voir Class and Module Fixtures pour plus de détails.

Votre version ne contient pas le décorateur @classmethod :

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()

L'erreur est générée car MyFirstSetOfTests.setUpClass() est appelée sur la classe , pas sur une instance, mais vous n'avez pas marqué votre méthode comme un classmethod et donc il n'a pas été passé dans l'argument automatique self. Dans le code mis à jour ci-dessus, j'ai utilisé cls à la place, pour indiquer que le nom fait référence à l'objet de classe.

72
Martijn Pieters