PyTest测试类中除Fixture外传递创建实体ID至删除测试的方法
解决pytest测试函数间传递用户/单元ID的方案
方法1:使用测试类属性存储ID
利用同一个测试类的实例属性,在创建测试中保存生成的ID,后续删除测试直接读取这些属性即可:
class TestControlCenter: users_data = user_data_generator() params = [users_data[1], users_data[2]] param_ids = [data[0] for data in params] @pytest.mark.parametrize("users_data", params, ids=param_ids) def test_user_create_by_manager(self, manager_session_fixture, users_data): director_methods = manager_session_fixture # 同时获取创建返回的ID和状态码 user_id, status_code = director_methods.send_user_create_request(users_data) # 将ID存入类实例的列表属性(避免覆盖多个用户ID) self.created_user_ids = getattr(self, 'created_user_ids', []) self.created_user_ids.append(user_id) assert status_code == 200, "ERROR | Manager couldn't create user" def test_unit_create_by_manager(self, manager_session_fixture): director_methods = manager_session_fixture unit_name = unit_name_generator() # 获取单元ID和状态码并存入实例属性 self.unit_id, status_code = director_methods.send_unit_create_request(unit_name, 2, 16) assert status_code == 200, "ERROR | Manager couldn't create unit" # 新增用户删除测试 def test_user_delete_by_manager(self, manager_session_fixture): director_methods = manager_session_fixture # 遍历已创建的用户ID执行删除 for user_id in getattr(self, 'created_user_ids', []): status_code = director_methods.send_user_delete_request(user_id)[0] assert status_code == 200, f"ERROR | Manager couldn't delete user {user_id}" # 新增单元删除测试 def test_unit_delete_by_manager(self, manager_session_fixture): director_methods = manager_session_fixture status_code = director_methods.send_unit_delete_request(self.unit_id)[0] assert status_code == 200, "ERROR | Manager couldn't delete unit"
特点:实现简单,仅适用于同一个测试类内的方法共享数据,执行顺序依赖pytest默认的方法名排序(确保创建测试先于删除测试执行)。
方法2:使用类级Scope的Fixture共享
将创建操作封装到fixture中,设置scope="class"让fixture在测试类初始化时执行一次,生成的ID可以被类内所有测试方法共享,还能自动清理资源:
import pytest @pytest.fixture(scope="class") def created_users(manager_session_fixture): users_data = user_data_generator() params = [users_data[1], users_data[2]] director_methods = manager_session_fixture created_ids = [] # 批量创建用户并保存ID for data in params: user_id, status_code = director_methods.send_user_create_request(data) assert status_code == 200, "ERROR | Manager couldn't create user" created_ids.append(user_id) # 返回ID给测试方法使用 yield created_ids # 测试完成后自动删除用户(即使测试失败也会执行) for user_id in created_ids: director_methods.send_user_delete_request(user_id) @pytest.fixture(scope="class") def created_unit(manager_session_fixture): director_methods = manager_session_fixture unit_name = unit_name_generator() unit_id, status_code = director_methods.send_unit_create_request(unit_name, 2, 16) assert status_code == 200, "ERROR | Manager couldn't create unit" yield unit_id # 测试完成后自动删除单元 director_methods.send_unit_delete_request(unit_id) class TestControlCenter: def test_user_delete_by_manager(self, manager_session_fixture, created_users): director_methods = manager_session_fixture for user_id in created_users: status_code = director_methods.send_user_delete_request(user_id)[0] assert status_code == 200, f"ERROR | Manager couldn't delete user {user_id}" def test_unit_delete_by_manager(self, manager_session_fixture, created_unit): director_methods = manager_session_fixture status_code = director_methods.send_unit_delete_request(created_unit)[0] assert status_code == 200, "ERROR | Manager couldn't delete unit"
特点:资源管理更严谨,自动清理避免测试环境残留数据,fixture的执行顺序由pytest自动控制,无需依赖方法名排序。
方法3:使用pytest缓存机制(跨类/模块场景)
如果需要跨测试类或模块共享ID,可以使用pytest的缓存功能,将ID存入缓存后在其他测试中读取:
class TestControlCenter: users_data = user_data_generator() params = [users_data[1], users_data[2]] param_ids = [data[0] for data in params] @pytest.mark.parametrize("users_data", params, ids=param_ids) def test_user_create_by_manager(self, manager_session_fixture, users_data, request): director_methods = manager_session_fixture user_id, status_code = director_methods.send_user_create_request(users_data) # 用唯一键将ID存入pytest缓存 request.config.cache.set(f"created_user_id_{users_data[0]}", user_id) assert status_code == 200, "ERROR | Manager couldn't create user" def test_unit_create_by_manager(self, manager_session_fixture, request): director_methods = manager_session_fixture unit_name = unit_name_generator() unit_id, status_code = director_methods.send_unit_create_request(unit_name, 2, 16) request.config.cache.set("created_unit_id", unit_id) assert status_code == 200, "ERROR | Manager couldn't create unit" def test_user_delete_by_manager(self, manager_session_fixture, request): director_methods = manager_session_fixture for data in self.params: # 从缓存中读取对应ID user_id = request.config.cache.get(f"created_user_id_{data[0]}", None) assert user_id is not None, f"User ID for {data[0]} not found in cache" status_code = director_methods.send_user_delete_request(user_id)[0] assert status_code == 200, f"ERROR | Manager couldn't delete user {user_id}" def test_unit_delete_by_manager(self, manager_session_fixture, request): director_methods = manager_session_fixture unit_id = request.config.cache.get("created_unit_id", None) assert unit_id is not None, "Unit ID not found in cache" status_code = director_methods.send_unit_delete_request(unit_id)[0] assert status_code == 200, "ERROR | Manager couldn't delete unit"
特点:支持跨类/模块共享数据,但需要确保缓存键的唯一性,避免不同测试数据冲突。
内容的提问来源于stack exchange,提问作者ReGuardian
相关产品推荐
相关产品推荐

