我在写一些东西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
使用装饰器为unittest.skip
空不会跳过测试,但随后将其报告为通过。因此,第二天很容易忘记此跳过的测试,并永远保持跳过状态。跳过但报告通过行为的原因是什么?
如果很重要:
@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的设计疣之一,但没有太多我们可以做些什么。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句