我可以"turn-off"@unittest.expectedFailure吗?
Can I "turn-off" @unittest.expectedFailure?
这么说吧,不管出于什么原因,我想写一组以失败代码为前提的测试用例。
可能是因为设置失败真的很复杂,而演示固定状态很简单。就我而言,甚至不是那样,我想 start 测试失败,然后 then 展示如何修复它,用于文档目的。
我可以在底座 class 上装饰 @unittest.expectedFailure
。
但是固定的子class因为装饰是继承的而意外地成功了。
我能以某种方式删除 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):
....
这依赖于 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 或函数,具体取决于您放置装饰器的位置。
这么说吧,不管出于什么原因,我想写一组以失败代码为前提的测试用例。
可能是因为设置失败真的很复杂,而演示固定状态很简单。就我而言,甚至不是那样,我想 start 测试失败,然后 then 展示如何修复它,用于文档目的。
我可以在底座 class 上装饰 @unittest.expectedFailure
。
但是固定的子class因为装饰是继承的而意外地成功了。
我能以某种方式删除 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):
....
这依赖于 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 或函数,具体取决于您放置装饰器的位置。