Python 单元测试中的假设
Python 是否支持将假设用作测试的前提条件,类似于JUnit为 Java 提供的assumeThat(...)
方法。
这很重要,因为Hoare Logic的应用,引用 JUnit:
一组方法,可用于陈述有关测试有意义的条件的假设。失败的假设并不意味着代码被破坏,而是测试没有提供有用的信息。假设基本上意味着“如果这些条件不适用,请不要运行此测试”。默认的 JUnit 运行器会跳过假设失败的测试。自定义跑步者的行为可能不同。
似乎 Python 在其unittest framework中没有提供这些开箱即用的功能。我通过扩展unittest.TestCase
.
class LoggingTestCase(unittest.TestCase):
def assumeTrue(self, expr: Any, msg: Any = ...) -> None:
try:
super().assertTrue(expr, msg)
self.test_result = TestResult.PASSED
except AssertionError as e:
self.test_result = TestResult.SKIPPED
raise InvalidAssumption(e)
有了这个行为单元测试:
class TestLoggingTestCase(LoggingTestCase):
def test_assumeTrue(self):
self.assertRaises(InvalidAssumption, self.assumeTrue, False) # Passes as expected.
self.assertRaises(InvalidAssumption, self.assumeTrue, True) # Fails as expected.
这种方法似乎表现出我想要的正确行为,这是最好的方法,有没有更好的方法来做到这一点,或者使用 3rd 方库?我正在寻找一种更好的方法,而不是用这种方式包装所有基本断言来做出我自己的假设。