Гипотеза 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),

Другие вопросы по тегам