
Robot Framework 默认将变量(如 ${appList})作为字符串传递,导致 Python 关键字接收到的是字符串形式的 "[\"app1\", \"app2\"]" 而非真实列表;需改用 @{appList} 语法显式声明为列表参数,才能保持原始数据结构。
robot framework 默认将变量(如 `${applist}`)作为字符串传递,导致 python 关键字接收到的是字符串形式的 `"[\"app1\", \"app2\"]"` 而非真实列表;需改用 `@{applist}` 语法显式声明为列表参数,才能保持原始数据结构。
在 Robot Framework 中,变量引用语法直接影响参数的实际类型传递方式。${var} 表示标量(scalar),无论 YAML 中定义的是列表还是字典,都会被序列化为字符串后传入 Python;而 @{var} 表示列表展开(list unpacking),&{var} 表示字典展开(dict unpacking)——这才是保持原生数据结构的关键。
以你的场景为例,应修改测试用例与关键字调用如下:
# ✅ 正确:使用 @{appList} 将列表元素逐个传入,Robot 自动构造 list 对象
${filter} = Create Filter with apps @{appList}对应关键字定义也需同步调整(注意参数名无需加 @,仅调用时需要):
*** Keywords ***
Create Filter with apps
[Arguments] @{list} # ← 这里声明接收可变数量的位置参数,Robot 会自动组装为 Python list
${app_filter} = Generate app filters ${list}Python 端函数保持不变:
def generate_app_filters(app_list=None):
if app_list is None:
app_list = []
for app in app_list:
print(app) # 输出:app1 ↵ app2⚠️ 注意事项:
- YAML 中定义的变量必须格式正确(如 - app1, - app2 或 [app1, app2]),且需通过 Variables 设置正确加载;
- 不要尝试在 Python 中用 ast.literal_eval() 或 json.loads() 解析 ${appList} 字符串——这是反模式,既不安全也不符合 Robot 的设计哲学;
- 若需传递字典,同样应使用 &{dictVar} 调用 + [Arguments] &{dict} 声明;
- 混合参数时顺序固定:标量(${})→ 列表(@{})→ 字典(&{}),例如:My Keyword ${name} @{items} &{config}。
总结:Robot Framework 的类型传递由调用语法而非变量定义决定。坚持使用 @{} 处理列表、&{} 处理字典,是确保 Python 关键字获得预期数据结构的唯一可靠方式。

















