2017-01-24 6 views
2

Я хочу запустить коллекцию тестовых функций с различными светильниками для каждого запуска. Как правило, решения, предлагаемые для переполнения стека, документации и сообщений в блогах, относятся к двум категориям. Один из них параметризующее прибор:Pytest: работает несколько раз с различными входными данными

@pytest.fixture(params=list_of_cases) 
def some_case(request): 
    return request.param 

Другой по телефону metafunc.parametrize для того, чтобы произвести несколько тестов:

def pytest_generate_tests(metafunc): 
    metafunc.parametrize('some_case', list_of_cases) 

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

Чтобы проиллюстрировать это, предположим, что dataframe_x - это еще одно приспособление, которое принадлежит case_x. Pytest делает это

test_01(dataframe_1) 
test_01(dataframe_2) 
... 
test_50(dataframe_1) 
test_50(dataframe_2) 

вместо

test_01(dataframe_1) 
... 
test_50(dataframe_1) 

test_01(dataframe_2) 
... 
test_50(dataframe_2) 

В результате я буду получать каждый набор данных из БД в 50 раз, а не только один раз. Поскольку я могу определить область видимости как «сеанс», «модуль» или «функция», я не мог понять, как сгруппировать мои тесты, чтобы они выполнялись вместе в кусках.

Есть ли способ структурировать мои тесты, чтобы я мог выполнять все мои тестовые функции последовательно для каждого набора данных?

+0

Почему вы хотите, чтобы ваши тесты выполнялись в кусках? Требуются ли ваши тесты для выполнения в порядке? Если это так, я думаю, что это не идеально, потому что каждый тест должен работать независимо. – Cedric

+0

Они независимы, но представьте, что каждый размер данных очень велик: я хочу загрузить его, выполнить все тесты, выбросить его, загрузить следующий и т. Д. Это делает мне более интуитивный смысл, в отличие от загрузки его несколько раз , или хранения всех данных в памяти на протяжении всего теста. – instant

ответ

1

Если вы хотите загрузить только данные, как только вы можете использовать параметр области с помощью «модуля» или «сеанса».

@pytest.fixture(scope="module", params=[1, 2]) 
def dataframe(request): 
    if request.param == 1: 
     return #load datagrame_1 
    if request.param == 2: 
     return #load datagrame_2 

Испытания по-прежнему будет работать попеременно, но dataframe будет загружен только один раз для каждого модуля или сессии.