我可以"turn-off"@unittest.expectedFailure吗?

Can I "turn-off" @unittest.expectedFailure?

这么说吧,不管出于什么原因,我想写一组以失败代码为前提的测试用例。

可能是因为设置失败真的很复杂,而演示固定状态很简单。就我而言,甚至不是那样,我想 start 测试失败,然后 then 展示如何修复它,用于文档目的。

我可以在底座 class 上装饰 @unittest.expectedFailure

但是固定的子class因为装饰是继承的而意外地成功了。

我能以某种方式删除 expectedFailure 吗?

import sys
import unittest

@unittest.expectedFailure
class Test_ThisShouldFail(unittest.TestCase):
    """ for argument's sake, let's say 
    the configuration and testing is very complicated 
    and I want it fail by default.
    Subclasses fix the issue but re-use the test code
    """

    data = dict(a=1, b=2)

    def test_evens(self):
        for key, v in self.data.items():
            self.assertFalse(v % 2, f"{key}:Odd on {v}")

#@ ???unittest.expectedSuccess???? 
class Test_ThisShouldWork(Test_ThisShouldFail):
    """ how do I turn off the expected failure? """

    def setUp(self):
        self.data.update(a=10)

if __name__ == "__main__":
    sys.exit(unittest.main())

输出:

FAILED (expected failures=1, unexpected successes=1)
(venv) @explore$ py test_expectedfail.py -v
test_evens (__main__.Test_ThisShouldFail) ... expected failure
test_evens (__main__.Test_ThisShouldWork) ... unexpected success

----------------------------------------------------------------------
Ran 2 tests in 0.000s

FAILED (expected failures=1, unexpected successes=1)

这没有用:

我希望 MRO 会查看 TurnItOff 的空白单元测试设置并使用它们。没有这样的运气。

class TurnItOff(unittest.TestCase):
    pass

class Test_ThisShouldWork(TurnItOff, Test_ThisShouldFail):
    ....

这依赖于 unittest.expectedFailure 的内部实现,但一开始就有效:

def expectedSuccess(test_item):
    test_item.__unittest_expecting_failure__ = False
    return test_item


@unittest.expectedFailure
class TestFailure(unittest.TestCase):
    def test_something(self):
        self.assertTrue(False)


@expectedSuccess
class TestSuccess(TestFailure):
    def test_something(self):
        self.assertTrue(True)

请注意,test_item 可以是 class 或函数,具体取决于您放置装饰器的位置。