You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 07:20:24