Приспособления Pytest - Параметризация - Call Fixture Once - PullRequest
1 голос
/ 08 июля 2019

У меня есть прибор, который возвращает конечную точку для имени этой конечной точки (передается в)

Имя - это строка, заданная в тесте. Я запутался, вызывая конечную точку каждый раз в тестах (параметризованных), и теперь я не могу понять, как заставить одну и ту же функциональность работать без вызова конечной точки каждый раз.

По сути, мне просто нужно вызвать конечную точку один раз, а затем передать эти данные между всеми моими тестами в этом файле (в идеале без создания класса и вызова его в тесте. У меня около 12 файлов с похожими тестами, и я хочу уменьшить плиту котла. В идеале, если бы это можно было сделать на уровне приспособления / параметризации без глобальных значений.

Вот что у меня есть:

@pytest.mark.parametrize('field', [('beskrivelse'), ('systemId')])
def test_intgra_001_elevforhold_req_fields(return_endpoint, field):
    ep_to_get = 'get_elevforhold'
    ep_returned = return_endpoint(ep_to_get)
    apiv2 = Apiv2()
    apiv2.entity_check(ep_returned, field, ep_to_get, False)


@pytest.fixture()
def return_endpoint():

    def endpoint_initialisation(ep_name):
        apiv2 = Apiv2()
        ep_data = apiv2.get_ep_name(ep_name)
        response = apiv2.get_endpoint_local(ep_data, 200)
        content = json.loads(response.content)
        apiv2.content_filt(content)
        apiv2_data = content['data']

        return apiv2_data

    return endpoint_initialisation

1 Ответ

2 голосов
/ 10 июля 2019

Создайте return_endpoint как прибор с областью действия session и сохраняйте данные в словаре после их выборки. Прибор не возвращает функцию инициализации, но функцию для доступа к словарю.

@pytest.mark.parametrize('field', [('beskrivelse'), ('systemId')])
def test_intgra_001_elevforhold_req_fields(return_endpoint, field):
    ep_to_get = 'get_elevforhold'
    ep_returned = return_endpoint(ep_to_get)
    apiv2 = Apiv2()
    apiv2.entity_check(ep_returned, field, ep_to_get, False)


@pytest.fixture(scope='session')
def return_endpoint():
    def endpoint_initialisation(ep_name):
        apiv2 = Apiv2()
        ep_data = apiv2.get_ep_name(ep_name)
        response = apiv2.get_endpoint_local(ep_data, 200)
        content = json.loads(response.content)
        apiv2.content_filt(content)
        apiv2_data = content['data']

        return apiv2_data

    ep_data = dict()
    def access(ep_name):
        try:
            return ep_data[ep_name]  # or use copy.deepcopy
        except KeyError:
            ep_data[ep_name] = endpoint_initialisation(ep_name)
            return ep_data[ep_name]  # or use copy.deepcopy

    return access

Здесь есть несколько предостережений. Если объект, возвращаемый endpoint_initialisation(), является изменчивым, то вы потенциально можете создать нежелательные зависимости между вашими тестами. Вы можете избежать этого, возвращая (глубокую) копию объекта. Для этого вы можете использовать модуль копирования .

...