如何在Robot Framework中创建可正常操作、不会被识别为字符串的空列表
Robot Framework 空列表创建的常见报错与正确实现
报错根因
执行抛出TypeError: Expected argument 1 to be a list or list-like, got string instead,本质是列表变量被框架自动重赋值为字符串类型,触发原因有两个:
- 静态变量区(
*** Variables ***)提前引用内置@{EMPTY}初始化列表时,受框架变量解析时序影响,本该是列表类型的变量会被识别为空字符串,彻底失去列表属性。 - 创建列表、设置作用域变量时的传参逻辑错误:
- 给
Create List传入${EMPTY}空字符串时,会生成包含1个空字符串元素的非空列表,并非真正的空列表 - 调用
Set Suite Variable等全局变量设置关键字时,用@{变量名}的展开形式传值:如果对应的是空列表,展开后没有任何参数传递,会导致设置关键字只接收到要定义的变量名、没收到对应的值,框架默认给变量赋值为空字符串,直接触发类型退化。
- 给
可正常运行的实现方法
方法1:测试用例内直接创建空列表
无需额外的全局实例化步骤,直接无参数调用Create List生成空列表即可:
*** Settings *** Library Collections *** Test Cases *** 向空列表追加元素 # 无参数调用Create List即可生成纯空列表 ${target_list}= Create List Append To List ${target_list} Test Log 追加后列表内容: ${target_list}
注意:不要在
Create List后面传${EMPTY}或@{EMPTY}作为参数,只要传了值,空列表就会被塞入对应元素,失去空列表属性。内置@{EMPTY}的正确使用场景是需要将空列表作为可变长参数展开传递给其他关键字时,而非单独用来创建列表变量。
方法2:套件级复用空列表的正确写法
如果需要在多个测试用例中共享同一个空列表,不要在静态变量区提前定义映射,需在套件初始化关键字中完成创建与赋值:
*** Settings *** Library Collections Suite Setup Init Global Empty List *** Test Cases *** 跨用例操作共享空列表 Append To List ${shared_list} 用例1添加的元素 Log 当前列表内容: ${shared_list} *** Keywords *** Init Global Empty List ${empty_list}= Create List # 传值时用$前缀传递*整个列表对象*,*不要用@展开传参* Set Suite Variable ${shared_list} ${empty_list}
原示例代码的逐点错误对照
对比可正常运行的写法,原示例的错误点为:
- 静态变量区定义
@{shouldBeList}= @{EMPTY},提前解析内置变量导致类型直接变为字符串 Re-instantiate List关键字中给Create List传入${EMPTY},生成的列表实际包含空字符串元素- 调用
Set Suite Variable时用@{shouldBeList}展开传值,空列表展开后没有参数传递,导致变量被默认赋值为空字符串
内容的提问来源于stack exchange,提问作者rook218
相关产品推荐
相关产品推荐

