Гипотеза Python - стратегия построения один раз для многих тестов?

У меня есть составная, дорогая в разработке, но дешевая в тестировании стратегия. Я обязан сделать:

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

Сборка примеров занимает ~4 секунды, а запуск утверждений занимает незначительное время.

Наилучшая практика требует, чтобы эти тесты были разделены.

Мне непонятно, как я могу комбинировать стратегии гипотез и, например. TestCase.setUp или pytest на уровне сеанса. И декорирование фикстуры, и вызов с помощью x = expensive_strategy(); @given(x) не помогают.


person Eric Kaschalk    schedule 05.05.2017    source источник
comment
как насчет приборы с session областью действия?   -  person Azat Ibrakov    schedule 11.05.2017


Ответы (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).

person RecursivelyIronic    schedule 19.05.2017
comment
Автор гипотезы указал, что первый вариант не является хорошей стратегией, поскольку .example() не представляет того, что hypothesis сделал бы при обычном тестовом прогоне. - person RecursivelyIronic; 17.08.2017