Pytest带参数Fixture实现不同Header的POST请求测试遇错求助
解决pytest Fixture参数传递错误与API测试方案
错误原因
你写的fixture里使用了request[0],但这里的request是pytest自带的SubRequest对象,并非你传入的参数,因此会触发“TypeError: 'SubRequest' object is not subscriptable”错误。pytest fixture要接收外部参数,需要用工厂模式或参数化fixture的方式实现。
方案一:工厂函数式Fixture(灵活支持多次调用)
这种方式让fixture返回一个可接收参数的函数,既能满足你传入不同headers的需求,还能自动完成添加后的用户清理操作。
Fixture代码
@pytest.fixture def add_user(test_client): created_user_id = None # 存储添加成功的用户ID,用于后续清理 def _add_user(headers, user_data): nonlocal created_user_id # 发送添加用户的POST请求 response = test_client.post('permissions/users', headers=headers, json=user_data) # 若添加成功,记录用户ID if response.status_code == 201: created_user_id = response.json().get('id') return response yield _add_user # 返回可调用的函数给测试用例 # 测试完成后清理:删除已创建的用户 if created_user_id: test_client.delete(f'permissions/users/{created_user_id}', headers=admin_headers)
测试用例写法
# 测试管理员添加用户成功 def test_add_user_as_admin(test_client, add_user, admin_headers, test_user_permissions): response = add_user(admin_headers, test_user_permissions) assert response.status_code == 201 # 测试普通用户添加用户失败 def test_add_user_as_normal_user(test_client, add_user, normal_user_headers, test_user_permissions): response = add_user(normal_user_headers, test_user_permissions) assert response.status_code == 403
方案二:结合@pytest.mark.parametrize的参数化测试(批量多场景验证)
如果需要一次性测试多种场景,用@pytest.mark.parametrize可以把不同的请求头、用户数据、预期状态码打包,减少重复代码。
参数化测试用例代码
@pytest.mark.parametrize( "headers, user_data, expected_status", [ # 场景1:管理员添加用户,预期成功 (admin_headers, test_user_permissions, 201), # 场景2:普通用户添加用户,预期失败 (normal_user_headers, test_user_permissions, 403), ] ) def test_add_user_scenarios(test_client, add_user, headers, user_data, expected_status): response = add_user(headers, user_data) assert response.status_code == expected_status
这里依然使用方案一中的add_user工厂fixture,每个场景执行后都会自动清理创建的用户。
内容的提问来源于stack exchange,提问作者BoroBoro
相关产品推荐
相关产品推荐

