如何在Pytest中存储测试用例响应并在其他用例中复用
解决Pytest测试用例间共享component_id的问题
方案一:利用现有test_inputs对象存储(贴合现有代码结构)
你的项目中已经定义了Inputs类并通过test_inputs fixture注入,直接复用这个对象存储component_id是最直接的方案:
步骤1:修改test_component_approval_request存储component_id
更新test.component_approval.py中的第一个测试用例,将接口返回的component_id赋值给test_inputs的属性:
import pytest from . import custom_assertions GROUP = 'component_approval' def test_component_approval_request(api, test_inputs): code, res = api.component_approval.test_component_approval_request(test_inputs.parameters) print("Response:", res) assert code == 200 assert isinstance(res, dict) print(res) assert res["status"] == '1' # 将获取到的component_id存入test_inputs对象 test_inputs.component_id = res["data"][0] print(f"Component ID set to: {test_inputs.component_id}")
步骤2:修改test_approve_request使用存储的component_id
同样在test.component_approval.py中,修改第二个测试用例,直接从test_inputs中读取component_id,同时修正参数拼写错误(paramaetes改为parameters):
def test_approve_request(api, test_inputs): # 先校验component_id是否已被正确设置 assert test_inputs.component_id != "", "component_id未初始化,请确保test_component_approval_request已执行" # 使用test_inputs中存储的component_id作为参数 code, res = api.component_approval.approve_request(test_inputs.parameters, test_inputs.component_id) assert code == 200 assert isinstance(res, dict) print(res) assert res["status"] == '1'
注意事项
- Pytest默认按函数名字母顺序执行测试用例,
test_component_approval_request会在test_approve_request之前执行,确保component_id已被存储。 - 如果需要强制指定执行顺序,可以使用
pytest-ordering插件,给测试用例添加装饰器:@pytest.mark.order(1) def test_component_approval_request(api, test_inputs): # ... 代码 ... @pytest.mark.order(2) def test_approve_request(api, test_inputs): # ... 代码 ...
方案二:使用Pytest Fixture(更符合Pytest最佳实践)
如果希望解耦测试用例间的依赖,可以创建一个模块级别的fixture来获取并返回component_id,供后续测试用例使用:
步骤1:在conftest.py中添加fixture
import os import pytest import random import string import json import fossidsdk class Inputs: # 保留原有参数定义 component_id = "" @pytest.fixture(scope="module") def component_id(api, test_inputs): # 在fixture中执行接口请求并获取component_id code, res = api.component_approval.test_component_approval_request(test_inputs.parameters) assert code == 200 assert res["status"] == '1' return res["data"][0]
步骤2:修改测试用例使用fixture
def test_component_approval_request(component_id): # 验证component_id的有效性 assert isinstance(component_id, int) print(f"Component ID obtained: {component_id}") def test_approve_request(api, test_inputs, component_id): code, res = api.component_approval.approve_request(test_inputs.parameters, component_id) assert code == 200 assert isinstance(res, dict) print(res) assert res["status"] == '1'
这种方式下,component_id fixture只会执行一次,所有依赖它的测试用例都能复用这个值,同时保持测试用例的独立性。
内容的提问来源于stack exchange,提问作者Abilash
相关产品推荐
相关产品推荐

