如何对pytest fixture进行多参数参数化并解决相关运行报错
问题修复方案
第一个报错原因
你定义的parametrize参数名只有2个(get_settings、expected),但每个测试用例的元组里填了3个值,参数数量不匹配才报错。这个问题和get_user无关,get_user是独立fixture,会自动注入不需要写在parametrize的参数名列表里。
第二个报错原因
你后来把TOKEN_KEY和TOKEN_PASSWORD打包成元组传给get_settings的request.param,但fixture里直接把整个元组赋值给了两个Settings字段,Settings要求这两个字段是字符串类型,传入元组自然触发pydantic类型校验失败。
完整修复步骤
1. 修改fixture,拆分request.param的打包参数
把request.param里打包的两个参数拆出来分别赋值给对应字段:
@pytest.fixture def get_settings(request): with mock.patch("helpers.helpers.get_settings") as mocked_settings: # request.param是传入的(TOKEN_KEY, TOKEN_PASSWORD)元组,拆分赋值 token_key, token_pwd = request.param mocked_settings.return_value = Settings( TOKEN_KEY=token_key, TOKEN_PASSWORD=token_pwd ) yield
2. 修改parametrize参数配置
每个测试用例的元组按「get_settings打包参数、expected预期值」的顺序写,数量和参数名对应:
# 第一个参数给get_settings的是(FAKE_TOKEN_KEY, '')元组,第二个是预期值None # 第二个用例给get_settings的是(FAKE_TOKEN_KEY, '1')元组,第二个是预期值None @pytest.mark.parametrize('get_settings, expected', [ ((FAKE_TOKEN_KEY, ''), None), ((FAKE_TOKEN_KEY, '1'), None) ], indirect=["get_settings"]) def test_generate_new_token(get_user, get_settings, expected): assert generate_new_token(user=get_user) == expected
内容的提问来源于stack exchange,提问作者Ghasem
相关产品推荐
相关产品推荐

