我可以“关闭”@unittest.expectedFailure吗?

2024-09-30 22:23:39 发布

您现在位置:Python中文网/ 问答频道 /正文

让我们假设,无论出于什么原因,我都想编写一组测试用例,从失败代码的前提开始

可能是因为设置故障非常复杂,而演示固定状态非常简单。在我的例子中,甚至不是这样,我想以失败的测试开始,然后展示如何修复它,以便于文档记录

我可以在基类上修饰@unittest.expectedFailure

但是由于装饰是继承的,固定的子类意外地成功了

我能以某种方式消除预期的失败吗

  • 在代码本身中,而不是在命令行参数中

  • 虽然我使用并欣赏pytest,但这是一个常规unittest的问题

  • unittest.skipXXX不是我想要的,我确实想要运行Test_ThisShouldFail的测试

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):
    ....

Tags: the代码testselfdatamainunittestclass
1条回答
网友
1楼 · 发布于 2024-09-30 22:23:39

这依赖于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既可以是类也可以是函数,具体取决于放置装饰器的位置

相关问题 更多 >