Pytest灯具-参数化-一次调用灯具

时间:2019-07-08 18:20:18

标签: python pytest fixtures

我有一个固定装置,可以返回该端点的名称(已传入)

名称是测试中设置的字符串。在每次测试(参数化)中每次调用端点时,我都搞砸了,现在我不知道如何在不每次调用端点的情况下实现相同的功能。

基本上,我只需要调用一次端点,然后在该文件中的所有测试之间传递数据(理想情况下,无需创建类并在测试中调用它。我大约有12个文件,每个文件都具有相似的测试,希望减少样板。理想情况下,如果可以在夹具/参数化级别上完成而没有全局变量。

这是我到目前为止所拥有的:

Theme Context Contributor

1 个答案:

答案 0 :(得分:2)

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()返回的对象是可变的,则可能在测试之间创建不必要的依赖关系。您可以通过返回对象的(深层)副本来避免这种情况。您可以为此使用copy module