多条用例的 @pytest.mark.parametrize 没有顺序执行的问题

问题场景:
一个原始yaml数据文件,接口A读取初始数据,执行之后,将返回的部分关联数据回写到yaml文件,接口b载读取更新后的yaml数据文件,然后执行请求。

def getInterfaceCaceLists(interface_number,flag):
     # 根据interface_number 获取yaml内容并返回
      print("开始 %d 替换 %s" % (flag,interface_number))
      return interface_dict.get("case_lists")

@pytest.mark.parametrize("case_data", getInterfaceCaceLists("create_activity",1))
def test_create_activity(case_data):
      # url, headers 固定 ,请求数据参数化
      response = requests.post(url=url,headers=headers,data=case_data["params"])
      # 返回参数回写yaml
      writeback(response.text)


@pytest.mark.parametrize("case_data", getInterfaceCaceLists("create_father_config",2))
def test_create_father_config(case_data):
      # url, headers 固定 ,请求数据参数化
      response = requests.post(url=url,headers=headers,data=case_data["params"])
      # 返回参数回写yaml
      writeback(response.text)

期望的是:先执行test_create_activity ,获取数据,参数化执行,返回参数回写到yaml;然后执行test_create_father_config,获取更新后的数据,参数化执行。

实际执行中发现:在执行接口请求前,先执行了两次@pytest.mark.parametrize,分别获取参数化数据,再执行的接口请求。这就导致了 test_create_father_config 取到的是空数据,导致接口失败。

请问 如何让其按顺序执行呢? 或者 有什么替换解决方案呢 ?

pytest-ordering 这个插件了解下

pytest-ordering 改变了用例的执行顺序。但是 还是先执行了每条用例的@pytest.mark.parametrize,然后取得参数化数据还是空的。
image

不晓得是控制了先执行所有的
@pytest.mark.parametrize

或者你用pytest的钩子函数 pytest_collection_modifyitems试下能不能满足你要求了

pytest_collection_modifyitems 在用例收集后可以改变用例顺序。但是不是用例顺序的问题。 是 pytest在用例收集阶段直接执行了装饰器@pytest.mark.parametrize的功能,收集到了空的数据。再实际执行用例时却没有再次收集数据。

期望的是 :在执行用例前才执行收集参数操作,从后正确的获取之前用例回写到yaml中的参数。

或者把需要用到yaml文件数据的测试用例。在page层就读取yaml文件里的数据?

pytest的执行流程就是先进行全部用例的参数化操作,根据参数化将用例分解为多个非参数化用例,然后再进行执行
所以你的数据准备步骤无法在用例中进行,pytest没有这种先将一个用例完全执行完毕再去进行下一个用例参数化的操作。。

关闭