Python假设 - 为许多测试构建策略一次?

时间:2017-05-05 07:30:42

标签: python testing python-hypothesis property-testing

我有一个复合,昂贵的构建,但廉价的测试策略。我必须这样做:

@given(expensive_strategy())
def test_all(x):
    assert...
    assert...
    ...

构建示例需要大约4秒钟,运行断言的时间可以忽略不计。

最佳实践要求将这些测试分开。

我不清楚如何结合假设策略和例如。 TestCase.setUp或pytest会话范围的灯具。装饰夹具和使用x = expensive_strategy(); @given(x)进行调用都无济于事。

1 个答案:

答案 0 :(得分:3)

一种选择是使用策略来生成示例,并忽略testcase收缩,示例数据库等。这将使传递测试套件更快,并且失败的测试套件更加混乱。以下内容应该有效:

class MyTest(TestCase):
    @classmethod  # or however this is done in your test runner
    def setUpClass(cls):
        strategy = expensive_strategy()
        cls.examples = [strategy.example() for _ in range(1000)]

    def test_all(self):
        for x in self.examples:
            assert invariant(x)

另一个选择是破坏假设'内部,以便每个测试用例接收相同的字节流,并对构建策略的任何缓慢进行缓存,尽管这肯定会违反"最佳实践"。

就个人而言,我不会遵循"最佳做法"当他们导致像一个缓慢的测试套件那样荒谬的结果,并在一个测试方法中做出所有断言,可能是通过调用辅助方法,如assert_a_particular_kind_of_assertion(x)