【问题标题】:Python unittest - setUpClass() is giving me trouble - why can't I inherit like this?Python unittest - setUpClass() 给我带来了麻烦 - 为什么我不能这样继承?
【发布时间】:2012-12-26 18:17:06
【问题描述】:

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

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)

----------------------------------------------------------------------

【问题讨论】:

    标签: python unit-testing


    【解决方案1】:

    setUpClass 必须是一个类方法。来自documentation

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

    @classmethod
    def setUpClass(cls):
        ...
    

    更多详情请见Class and Module Fixtures

    您的版本缺少@classmethod decorator

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多