Python unittest - setUpClass()给了我麻烦 - 为什么我不能这样继承?

jon*_*omo 44 python unit-testing

我有像下面这样的unittest代码:

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 __name__ == '__main__':
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

当我尝试运行此代码时,我收到如下错误:

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

----------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 74

setUpClass 必须是一个类方法.从文档:

在单个类中运行之前调用的类方法.setUpClass以类作为唯一参数调用,必须装饰为classmethod():

@classmethod
def setUpClass(cls):
    ...
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅类和模块夹具.

您的版本缺少@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()
Run Code Online (Sandbox Code Playgroud)

抛出错误是因为MyFirstSetOfTests.setUpClass()上调用,而不是在实例上调用,但是您没有将方法标记为a classmethod,因此它不会在自动self参数中传递.在我上面使用的更新代码中cls,反映了该名称引用了类对象.