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

Pytest参数化同键字典,验证值的10倍关系问题求助

问题

我是pytest新手,使用Python 10。想要参数化两个键相同但值不同的字典,验证其中一个字典中某键的值是否是另一个字典同键值的10倍。需要通过参数化实现,让pytest根据每个键分别输出PASS或FAIL结果。

示例字典:

dict1 = {"a" : 1, "b" : 2, "c" : 3}
dict2 = {"a": 10, "c": 30, "b": 20}

尝试的测试代码:

@pytest.mark.parametrize("dict1_dict", dict1)
@pytest.mark.parametrize("dict2_dict", dict2)    
def test_by_ten(dict1_dict, dict2_dict):
   assert dict1_dict[key] == dict2_dict[key] * 10

不清楚这段代码是否可行,也不知道如何从两个字典中获取相同的键进行验证。

解决方案

你的代码存在两个核心问题:

  1. 直接遍历字典传递给parametrize,只会拿到字典的键,而不是键值对;
  2. 两层parametrize会生成笛卡尔积测试用例(比如a和a、a和b等组合),无法实现按相同键配对验证。

正确的做法是先提取两个字典的共同键,再将每个键对应的两组值作为测试用例参数传递,具体实现如下:

完整测试代码

import pytest

dict1 = {"a": 1, "b": 2, "c": 3}
dict2 = {"a": 10, "c": 30, "b": 20}

# 提取两个字典的共同键,确保只测试双方都存在的键
common_keys = dict1.keys() & dict2.keys()

# 构造参数化用例:每个用例包含键、dict1对应值、dict2对应值
test_cases = [(key, dict1[key], dict2[key]) for key in common_keys]

@pytest.mark.parametrize("key, val1, val2", test_cases)
def test_value_is_ten_times(key, val1, val2):
    # 根据示例验证dict2的值是dict1的10倍,若需求相反可调整断言顺序
    assert val2 == val1 * 10, f"Key {key}: {val2} is not 10 times {val1}"

代码说明

  • common_keys = dict1.keys() & dict2.keys():利用集合交集操作,快速获取两个字典都存在的键,避免因某键只存在于单个字典导致的KeyError;
  • test_cases列表推导式:将每个共同键及其对应两组值打包成元组,作为单个测试用例的参数;
  • @pytest.mark.parametrize("key, val1, val2", test_cases):将每个测试用例参数传递给测试函数,pytest会为每个元组生成独立的测试项;
  • 断言中添加自定义错误信息,方便快速定位失败的键。

测试结果

运行该测试后,pytest会为每个键生成单独的测试结果:

  • 所有键满足条件时,三个测试项全部PASS;
  • 若某键不满足(比如修改dict2["b"]为21),则对应test_value_is_ten_times[b]会显示FAIL,并输出自定义错误信息。

内容的提问来源于stack exchange,提问作者Lotusmeristem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:22:43