Гипотеза Python - создание стратегии один раз для многих тестов?
У меня есть сложная, дорогая в построении, но дешевая в тестировании стратегия. Я обязан сделать:
@given(expensive_strategy())
def test_all(x):
assert...
assert...
...
Создание примеров занимает ~4 секунды, а запуск утверждений незначителен.
Передовая практика требует разделения этих тестов.
Мне не понятно, как я мог бы сочетать стратегии гипотез и т. Д. TestCase.setUp или pytest фиксированные сессией приборы. И украшать прибор и звонить с x = expensive_strategy(); @given(x)
не помогает.
1 ответ
Одним из вариантов может быть использование стратегии исключительно для генерации, например, игнорирования сокращения тестового набора, базы данных примеров и т. Д. Это ускорит прохождение тестового набора, а сбойный набор тестов более запутанный. Должно работать что-то вроде следующего:
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)
,