49

我有如下的单元测试代码:

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

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

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

----------------------------------------------------------------------
4

1 回答 1

79

setUpClass 必须是类方法。从文档中:

在单个类运行测试之前调用的类方法。setUpClass以类作为唯一参数调用,并且必须装饰为classmethod()

@classmethod
def setUpClass(cls):
    ...

有关更多详细信息,请参见类和模块装置

您的版本缺少@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()

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

于 2012-12-26T18:27:25.930 回答