2

我有一个复合的、构建成本高但测试成本低的策略。我必须这样做:

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

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

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

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

4

1 回答 1

3

一种选择是仅将策略用于示例生成,而忽略测试用例收缩、示例数据库等。这将使通过的测试套件更快,而失败的测试套件更加混乱。像下面这样的东西应该可以工作:

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).

于 2017-05-19T18:29:02.320 回答