在python中跳过带有decorator的unittest
我正在写一些在python中跳过带有decorator的unittest,python,unit-testing,python-3.x,Python,Unit Testing,Python 3.x,我正在写一些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)
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
使用decoratorunittest.skip
empty会跳过测试,但会将其报告为已通过。因此,这个跳过的测试很容易在第二天被忘记,永远处于跳过状态。这种跳过行为背后的原因是什么,但报告通过行为
如有必要:
- Python:3.4.3 | Anaconda 2.3.0(64位)
- 操作系统:RHEL 6.7
def f(): ...
f = decorator(f)
def f(): ...
f = decorator(...)(f)
及
相当于
def f(): ...
f = decorator(f)
def f(): ...
f = decorator(...)(f)
这意味着当你忘记跳过原因时,你会得到
def test_B(self): ...
test_B = unittest.skip(test_B)
测试方法作为跳过原因通过,返回的测试装饰器被分配到test\u B
。当unittest
尝试运行test\u B
时,测试装饰程序不会报告断言失败,因此unittest
认为这是一个通过的测试
@decorator
和@decorator()
的不等价性是Python的设计缺陷之一,但我们对此无能为力。(1.)如果在详细模式下运行(使用-v
开关),测试运行会显示“跳过”。(2.)正如您已经演示过的,您可以使用一个字符串参数将一条有用的消息包含到装饰器中。@Two-bitalchest。是的,我忘了提到这是详细的输出。我想知道的是,为什么在这种情况下跳过测试并将其标记为通过。部分回答在user2357112
answer.At down投票者中。想解释一下为什么这个问题不好,或者如何改进它吗?我认为这是值得的。没有理由不能修改unittest来完成这里显而易见的事情,并报告测试被跳过而没有提供任何理由。@wim:我可能会让它引发一个异常,这样我们就不会有奇怪的兼容性问题。谢谢你的回答。我可以看出这更容易实现。然而,他们会争辩说,以不同的方式实现decorator函数,一个简单的if子句就可以做到这一点,这将消除一个潜在的陷阱。我假设这种行为是出于一个我还不清楚的原因而故意选择的。顺便说一句,我同意在这一点上提出一个例外可能更好的兼容性。真见鬼,一切都比简单地无声地跳过/通过要好。@magu:我可以向你保证,这不是故意的。人们通常认为他们的参数在Python中是正确的,因为duck类型使显式类型检查变得混乱。没有人决定不检查跳过原因是否是函数。@user2357112。我想你是对的。即使在这种情况下,我们仍然可以使用duck类型而不是类型检查。如果明天没有新消息,我会接受你的回答。