3

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 方库?我正在寻找一种更好的方法,而不是用这种方式包装所有基本断言来做出我自己的假设。

4

1 回答 1

2

为此,我使用 pytest skipif。

http://doc.pytest.org/en/latest/skipping.html

于 2018-12-06T16:47:58.777 回答