我有一个复合,昂贵的构建,但廉价的测试策略。我必须这样做:
@given(expensive_strategy())
def test_all(x):
assert...
assert...
...
构建示例需要大约4秒钟,运行断言的时间可以忽略不计。
最佳实践要求将这些测试分开。
我不清楚如何结合假设策略和例如。 TestCase.setUp或pytest会话范围的灯具。装饰夹具和使用x = expensive_strategy(); @given(x)
进行调用都无济于事。
答案 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)
。