在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
使用decorator
unittest.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类型而不是类型检查。如果明天没有新消息,我会接受你的回答。