【问题标题】:Pytest Fixtures - Parameterisation - Call Fixture OncePytest Fixtures - 参数化 - 调用 Fixture 一次
【发布时间】:2019-11-18 07:15:20
【问题描述】:

我有一个夹具,它返回端点名称(传入)

名称是测试中设置的字符串。我在测试(参数化)中每次调用端点都搞砸了,现在我无法弄清楚如何在不每次调用端点的情况下获得相同的功能。

基本上,我只需要调用一次端点,然后在该文件中的所有测试之间传递该数据(理想情况下,无需创建类并在测试中调用它。我有大约 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

【问题讨论】:

    标签: python pytest fixtures


    【解决方案1】:

    创建return_endpoint 作为范围为session 的fixture,并在获取数据后将数据存储在字典中。夹具不返回初始化函数,而是一个访问字典的函数。

    @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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多