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