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

Python 我可以吗;“关闭”@unittest.expectedFailure?,python,python-unittest,Python,Python Unittest,让我们假设,无论出于什么原因,我都想编写一组测试用例,从失败代码的前提开始 可能是因为设置故障非常复杂,而演示固定状态非常简单。在我的例子中,甚至不是这样,我想从一个失败的测试开始,然后展示如何修复它,以便于文档记录 我可以在基类上修饰@unittest.expectedFailure 但是由于装饰是继承的,固定的子类意外地成功了 我能以某种方式消除预期的失败吗 在代码本身中,而不是在命令行参数中 当我使用并欣赏pytest时,这是一个针对常规unittest的问题 unittest.skip

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

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

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

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

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

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

  • 当我使用并欣赏
    pytest
    时,这是一个针对常规
    unittest
    的问题

  • unittest.skipXXX
    不是我想要的,我确实想运行
    Test\u这应该会失败
    的测试

导入系统 导入单元测试 @unittest.expectedFailure 类测试应该失败(unittest.TestCase): “为了争论,让我们说 配置和测试非常复杂 我希望它在默认情况下失败。 子类修复了这个问题,但重新使用了测试代码 """ 数据=dict(a=1,b=2) def测试(自身): 对于self.data.items()中的键v: assertFalse(v%2,f“{key}:在{v}上的奇数”)
#@这取决于内部实现的
unittest.expectedFailure
,但可以作为一个开始:

def预期成功(测试项目):
测试项目。\uuuuu单元测试\u预期\u失败\uuuuu=False
返回测试项目
@unittest.expectedFailure
类TestFailure(unittest.TestCase):
def测试(自我):
self.assertTrue(False)
@预期的成功
类TestSuccess(TestFailure):
def测试(自我):
self.assertTrue(True)

请注意,
test\u item
既可以是类也可以是函数,这取决于您将装饰器放置在何处。

很聪明,尽管“delattr”可能更好-以防测试系统在某个点切换到使用“hasattr”而不使用测试值。让我试试。没错,尽管我不认为他们会改变这一点——通常这是其他工具所依赖的内部结构。你可能是对的,它在任何情况下都可以正常工作。Txs。
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}")

#@ This relies on the internal implementation of 
unittest.expectedFailure
, but works for a start:

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)