Кэширует ли Pytest данные прибора при вызове несколькими тестовыми функциями?

#python #unit-testing #pytest

#python #модульное тестирование #pytest

Вопрос:

У меня есть модульные тесты, для которых требуются тестовые данные. Эти тестовые данные загружаются и имеют прилично большой размер файла.

 @pytest.fixture
def large_data_file():
    large_data = download_some_data('some_token')
    return large_data

# Perform tests with input data
def test_foo(large_data_file): pass
def test_bar(large_data_file): pass
def test_baz(large_data_file): pass
# ... and so on
  

Я не хочу загружать эти данные более одного раза. Его следует загружать только один раз и передавать всем тестам, которые этого требуют. Вызывает ли pytest large_data_file один раз и использует ли его для каждого модульного теста, который использует этот прибор, или он вызывает large_data_file каждый раз?

В unittest этом случае вы просто загружаете данные для всех тестов один раз в setUpClass методе.

Я бы предпочел не просто иметь глобальный large_data_file = download_some_data('some_token') в этом скрипте py. Я хотел бы знать, как справиться с этим вариантом использования с помощью Pytest.

Ответ №1:

Вызывает ли pytest large_data_file один раз и использует ли его для каждого модульного теста, который использует этот прибор, или он вызывает large_data_file каждый раз?

Это зависит от области применения прибора. Область по умолчанию function , поэтому в вашем примере large_data_file будет оцениваться три раза. Если вы расширяете область, например

 @pytest.fixture(scope="session")
def large_data_file():
    ...
  

прибор будет оцениваться один раз за тестовый сеанс, а результат будет кэшироваться и повторно использоваться во всех зависимых тестах. Для получения более подробной информации ознакомьтесь с разделом Область применения: совместное использование приборов между классами, модулями, пакетами или сеансом в pytest документах.