Robot Framework字典类型不匹配:本地通过Jenkins失败的原因与解决
问题解答
1. 为何仅在Jenkins上出现该问题?
核心原因是本地与Jenkins环境的类型检查严格度不一致:
- 本地使用的Robot Framework或相关测试库版本,对字典值的比较做了宽松处理(自动隐式转换类型后再比较),所以即使类型不同但数值相同也能通过。
- Jenkins环境使用的版本启用了严格类型匹配规则,
Dictionary Should Contain Item关键字要求值的类型和内容完全一致才判定匹配,因此int类型的2和字符串类型的"2"会被判定为不相等。 - 也有可能是Jenkins构建过程中,变量传递或执行环境的差异,导致手动创建字典时
columns=2被隐式转换为字符串类型(比如shell环境的参数处理逻辑影响)。
2. 解决方法
方案一:统一手动字典的类型为整数
创建字典时显式指定columns为整数类型,避免Robot默认解析为字符串:
${columns_val} Convert To Integer 2 &{param2} Create Dictionary title=${name_w2} description=Description ${rndString} ... font_color=f5aef5 back_color=303030 columns=${columns_val}
或更简洁的写法:
&{param2} Create Dictionary title=${name_w2} description=Description ${rndString} ... font_color=f5aef5 back_color=303030 columns=${2}
方案二:修改比较逻辑为宽松数值匹配
替换Dictionary Should Contain Item的严格匹配,改用支持类型转换的数值比较关键字:
Compare Widget's Params As Dictionaries [Arguments] &{param} <...> IF 'columns' in &{param} ${actual_col} Get From Dictionary ${param.result} columns ${expected_col} Get From Dictionary ${param} columns Should Be Equal As Numbers ${actual_col} ${expected_col} END
Should Be Equal As Numbers会自动将两边的值转换为数值类型后比较,只要数值相同就判定匹配,忽略原始类型差异。
方案三:全局调整比较规则(谨慎使用)
如果需要全局启用宽松比较,可以在测试用例开头添加:
Library Collections strict_mode=False
注意:此设置会影响所有Collections库中字典、列表相关的比较操作,需评估对其他测试用例的影响。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

