在python中使用装饰器跳过unittest

时间:2015-11-18 19:33:16

标签: python unit-testing python-3.x

我正在写一些MyService.aFunction()并发现一种相当好奇的行为,几乎把我烧死了。

以下测试:

unittest

结果:

import unittest

class Test(unittest.TestCase):
    @unittest.skip('Not ready yet')
    def test_A(self):
        self.assertTrue(False)

    @unittest.skip
    def test_B(self):
        self.assertTrue(False)

    def test_C(self):
        self.assertTrue(False)

if __name__ == '__main__':
    unittest.main()

使用装饰器test_A (__main__.Test) ... skipped 'Not ready yet' test_B (__main__.Test) ... ok test_C (__main__.Test) ... FAIL ====================================================================== FAIL: test_C (__main__.Test) ---------------------------------------------------------------------- Traceback (most recent call last): File "./test.py", line 13, in test_C self.assertTrue(False) AssertionError: False is not true ---------------------------------------------------------------------- Ran 3 tests in 0.000s 为空会跳过测试,但会将其报告为已通过。因此,这个跳过的测试可能很容易在第二天被遗忘并永远处于跳过状态。这次跳过背后的原因是什么,但报告传递行为?

如果重要:

  • Python:3.4.3 | Anaconda 2.3.0(64位)
  • 操作系统:RHEL 6.7

1 个答案:

答案 0 :(得分:4)

@decorator
def f(): ...

相当于

def f(): ...
f = decorator(f)

@decorator(...)
def f(): ...

相当于

def f(): ...
f = decorator(...)(f)

这意味着当您忘记跳过原因时,您将获得

的效果
def test_B(self): ...
test_B = unittest.skip(test_B)

测试方法作为跳过原因传递,返回的测试装饰器被分配给test_B。当unittest尝试运行test_B时,测试装饰器不报告断言失败,因此unittest认为它是通过测试。

@decorator@decorator()的不等同是Python的设计瑕疵之一,但我们无能为力。