- 测试
- RPA
- 接口测试
【免费下载链接】robotframework
Generic automation framework for acceptance testing and RPA
导读
本文基于 doc/releasenotes/rf-4.1rc1.rst 发布说明,系统梳理 Robot Framework 4.1 首个候选版本(RC1)的核心特性:用测试/关键字标签驱动 continue-on-failure 失败续跑模式、自动参数转换的三大增强,以及--doc/--metadata文件读取等向后不兼容变更与 Python 2、内置 Tidy 的弃用预告。文章将发布说明与仓库源码、验收测试一一对应,读者读完既可掌握 4.1 的新能力与升级迁移清单,也能从 src/robot/running/context.py、src/robot/running/arguments/typeconverters.py 等实现层面理解其底层原理。
版本概览与安装方式
Robot Framework 4.1 是 4.0 之后的功能版本(feature release),RC1 于 2021 年 7 月 9 日发布,最终正式版计划于 2021 年 7 月 19 日发布。该候选版本包含 4.1 的全部计划变更,主要亮点集中在continue-on-failure 模式的可标签化控制与自动参数转换(argument conversion)上,同时附带一批 bug 修复。
安装最新可用预发布版本:
pip install --pre --upgrade robotframework或精确安装本版本:
pip install robotframework==4.1rc1也可以从 PyPI 下载源码分发包手动安装。更详细的安装途径参见仓库根目录的 INSTALL.rst。由于是 RC 版本,升级前建议先在测试环境验证,再决定是否用于生产(后文"向后不兼容变更"一节会给出具体排查点)。
核心增强一:用标签控制 continue-on-failure 模式
背景:从"库关键字专属"到"人人可用"
Robot Framework 长期支持所谓的"可续跑失败"(continuable failures):测试用例失败后仍允许继续执行后续步骤。在 4.1 之前,这项能力只能通过两种途径开启:
- 库关键字使用特殊异常(continuable exception)主动声明失败可续跑;
- 调用 BuiltIn 库的
Run Keyword And Continue On Failure关键字。
也就是说,能否"失败后继续"完全取决于关键字实现方,普通测试作者很难按自己的意愿控制。
新增的两个特殊标签
4.1 引入两个保留标签,让续跑模式的使用门槛大幅降低(对应 issue #2285,由社区贡献者 Oliver Boehmer 实现):
robot:continue-on-failure:在带有该标签的测试用例或用户关键字内启用续跑模式。只要其中任意关键字失败,下一个关键字仍会照常执行。该模式不会向更低层级的关键字传播——即带标签的测试调用了一个不带标签的用户关键字,那么该用户关键字内部失败后会立即停止,执行回到带标签的测试或关键字层级才恢复续跑。robot:recursive-continue-on-failure:如果希望续跑行为递归生效(即穿透到下层用户关键字内部),使用该标签。
此外,标签名大小写不敏感,也支持变量替换。例如在测试数据 atest/testdata/running/continue_on_failure_tag.robot 中可以看到,Set Tags ROBOT:CONTINUE-ON-${FAILURE}(其中${FAILURE}为变量)与直接在[Tags]中写robot:continue-on-failure效果相同。
源码视角:标签如何驱动续跑决策
续跑模式的判定逻辑集中在 src/robot/running/context.py 的continue_on_failure()方法中。其核心思路是:沿当前执行栈自内向外收集"父级"(用户关键字实现 + 当前测试),依次检查每个父级的标签,命中即返回决策:
def continue_on_failure(self, default=False): parents = [result for _, result, implementation in reversed(self.steps) if implementation and implementation.type == 'USER KEYWORD'] if self.test: parents.append(self.test) for index, parent in enumerate(parents): robot = parent.tags.robot if index == 0 and robot('stop-on-failure'): return False if index == 0 and robot('continue-on-failure'): return True if robot('recursive-stop-on-failure'): return False if robot('recursive-continue-on-failure'): return True return default or self.in_teardown从该实现可以读出几个关键行为:
- 标签优先级:
stop-on-failure/recursive-stop-on-failure用于显式关闭续跑,且停跑标签优先于续跑标签被检查(代码中先判定 stop 再判定 continue)。 - 就近原则:
robot:continue-on-failure只对最内层(index == 0)的父级生效,这正是"不向下传播"的代码根源;而robot:recursive-continue-on-failure会在任意层级的父级上生效,从而实现递归续跑。 - teardown 特例:当没有命中任何特殊标签时,处于 teardown(套件/测试/关键字清理)阶段默认继续执行(
return default or self.in_teardown),与 4.1 中"teardown 中关键字超时后应继续执行"(#3398)的改进相呼应。
与之配套,异常对象在 src/robot/errors.py 中通过dont_continue属性标记是否阻断续跑,并支持向子异常传播;库关键字产生的续跑失败最终在错误聚合时合并为"多个失败"(multiple failures)报告。
验收测试覆盖
仓库的验收测试 atest/robot/running/continue_on_failure_tag.robot 系统验证了该特性在各种执行结构下的行为,包括:
- 测试用例带标签、通过
Set Tags动态设置标签(含大小写/变量替换); - 用户关键字带标签、测试带标签而用户关键字不带标签(验证不传播);
- 嵌套用户关键字带与不带标签的组合;
- FOR 循环、IF 结构、
Run Keywords内的续跑行为; robot:recursive-continue-on-failure与robot:recursive-stop-on-failure、robot:stop-on-failure的交互。
核心增强二:自动参数转换的三项改进
支持 IntEnum 与 IntFlag
自动参数转换现在支持 Python 的派生枚举IntEnum和IntFlag(#3910)。与其他枚举一样,参数可以传成员名;由于IntEnum/IntFlag同时是整数类型,参数还可以直接传成员的整数值。
在 src/robot/running/arguments/typeconverters.py 的EnumConverter中可以找到依据:value_types在枚举是int子类时扩展为(str, int),转换失败后还会回退到按整数值查找成员(_find_by_int_value)。这意味着一个类型为IntEnum的参数,传入'MEMBER'、'member'(归一化匹配,忽略下划线与连字符)或170这类整数都能得到正确成员。
数字分隔符:空格与下划线
int、float和Decimal的数字转换现在支持空格与下划线作为分隔符,例如2 000 000(#4026)。实现位于TypeConverter._remove_number_separators(typeconverters.py),转换前统一剥离字符串中的空格与下划线,FloatConverter、DecimalConverter、IntegerConverter均复用了这一逻辑。
整数进制的显式书写
整数转换支持十六进制、八进制、二进制前缀:
- 十六进制
0x,如0xAA; - 八进制
0o,如0o252; - 二进制
0b,如0b 1010 1010(可与分隔符叠加)。
以上三种写法都等价于十进制整数170(#3909)。对应实现是IntegerConverter._get_base(typeconverters.py):先剥离分隔符,再匹配0x/0o/0b前缀(允许正负号前缀),确定进制后调用int(value, base)完成转换。转换失败(如精度丢失)时给出明确的错误信息,保证失败可诊断。
向后不兼容变更与迁移要点
Robot Framework 4.1 整体上与 4.0 保持兼容,但以下两处变化可能影响部分用户,升级前务必核对:
--doc与--metadata支持从文件读取值(#4008)
如果--doc或--metadata传入的值恰好指向一个已存在的文件,4.1 会读取该文件内容作为实际值;而早期版本会直接把路径字符串当作值。这主要影响 metadata 场景(文档路径不太常见)。
实现位于 src/robot/conf/settings.py 的_process_doc:当值为Path对象,或值为文件路径且与自身去除空白后的内容一致时,按 UTF-8 读取文件内容,读失败会抛出Reading documentation from '<path>' failed: <error>的明确错误。
如果确实想以"文件路径字符串"作为真正的值,只需给值追加额外内容(哪怕一个空格)以规避路径识别,例如:
--metadata "Example: file.txt"String 库方法重命名(#3890)
String 库的should_be_uppercase与should_be_lowercase分别更名为should_be_upper_case与should_be_lower_case,以保持命名一致性。由于 Robot Framework 的关键字匹配对下划线不敏感(underscore insensitive),正常的关键字调用不受影响;只有以编程方式直接调用这两个 Python 方法(如from robot.libraries.String import String; String().should_be_uppercase(...))的代码需要更新。
另外,4.1 正式移除在 Settings 段使用冒号(:)的旧式支持(#3991),如仍有旧格式配置需一并调整。
弃用预告:为 5.0 做准备
Python 2 支持(#3457)
Robot Framework 4.1 是最后一个支持 Python 2 的版本:4.1 的后续 bug 修复版本仍会兼容 Python 2,但 Robot Framework 5.0 将要求 Python 3.6 及以上。相应地,Jython 与 IronPython 的支持也随之弃用——除非这些项目未来发布兼容 Python 3.6+ 的版本,否则不会再恢复支持。仍在 Python 2 上的团队应尽快规划迁移。
内置 Tidy 弃用(#4004)
内置的 Tidy 工具(数据格式整理工具)被弃用,官方推荐迁移到功能更强大的外部工具 RoboTidy。内置 Tidy 将在 Robot Framework 5.0 中彻底移除。已把 Tidy 集成进 CI/脚本的团队需要在此之前切换。
值得关注的其余修复与增强
除两大核心特性外,RC1 还修复/增强了一批高频问题:
- Rebot 相关:修复
--removekeywords与用例级 IF 结构组合时生成无效 output.xml 的问题(#4009,high);修复--expandkeywords遇到ELSE分支时日志生成失败(#4036,high);合并结果时不再考虑 SKIP 状态(#3818)。 - 执行行为:修复
--exitonfailure未在监听器(listener)判定测试失败时生效(#3973)以及在 teardown 中被跳过时误触发(#3996)两个问题;teardown 中关键字超时后应继续执行(#3398);修复套件 teardown 失败导致 skipped 测试显示为 fail(#3994)。 - 内置库增强:
Wait Until Keyword Succeeds支持严格重试间隔(retry time with strict interval,#3209);Should Be Equal等比较关键字支持折叠空白(#3884);Screenshot 库修复 wxPython 安装环境下阻碍执行优雅终止的问题(#3798);Remote 库二进制转换支持 0-255 全范围 Unicode 字符(#3934)。 - dry-run 模式:允许通过
Set Tags、Remove Tags修改标签并反映到 dryrun 日志中(#3985)。 - 变量与参数校验:支持
${var}[key]语法作用于同时允许按键访问的列表(#4037);解析器检测用户关键字定义中的非法参数,如@{varargs}带默认值不再静默(#4034、#3946)。 - Libdoc:修复关键字文档在窄浏览器窗口下的滚动条问题(#4012)、数据类型文档多余缩进(#4030)、全部测试被跳过时日志未正确展开(#4035)等。
4.1 RC1 完整 Issue 清单(28 项)
下表为发布说明记录的完整问题列表(ID 为原文档编号,可按里程碑在 issue tracker 检索):
| ID | 类型 | 优先级 | 摘要 |
|---|---|---|---|
| #4009 | bug | high | Rebot 在--removekeywords与用例级 IF 组合时生成无效 output.xml |
| #4036 | bug | high | --expandkeywords且测试含ELSE分支时日志生成失败 |
| #2285 | enhancement | high | 支持用测试/关键字标签控制 continue-on-failure 模式 |
| #3910 | enhancement | high | 自动参数转换支持IntEnum与IntFlag |
| #3798 | bug | medium | 安装 wxPython 时 Screenshot 库阻碍执行优雅终止 |
| #3973 | bug | medium | 监听器判定测试失败时--exitonfailure未启动 |
| #3985 | bug | medium | dryrun 日志中不显示用关键字设置的标签 |
| #3994 | bug | medium | 套件 teardown 失败导致 skipped 测试显示为 fail |
| #3996 | bug | medium | teardown 中测试被跳过时错误触发--exitonfailure |
| #4012 | bug | medium | 小浏览器窗口下关键字文档滚动条问题 |
| #4030 | bug | medium | Libdoc 数据类型文档带多余缩进 |
| #4034 | bug | medium | 用户关键字@{varargs}带默认值未正确报错 |
| #3209 | enhancement | medium | Wait Until Keyword Succeeds支持严格间隔重试 |
| #3398 | enhancement | medium | teardown 中关键字超时后应继续执行 |
| #3818 | enhancement | medium | Rebot 合并结果时不应计入 SKIP 状态 |
| #3884 | enhancement | medium | BuiltIn 比较关键字支持折叠空白 |
| #3909 | enhancement | medium | int参数转换支持二进制/八进制/十六进制 |
| #3934 | enhancement | medium | Remote 二进制转换支持 0-255 Unicode 字符 |
| #3946 | enhancement | medium | 解析器检测用户关键字定义中的非法参数 |
| #4004 | enhancement | medium | 弃用内置 Tidy,改用外部 RoboTidy |
| #4008 | enhancement | medium | 支持--doc与--metadata从文件读取 |
| #4026 | enhancement | medium | 参数转换支持空格/下划线数字分隔符 |
| #4037 | enhancement | medium | ${var}[key]支持可按键访问的列表 |
| #4027 | bug | low | skip-on-failure 生效时 teardown 中失败的错误信息有误 |
| #4035 | bug | low | 全部测试被跳过时日志未正确展开 |
| #3890 | enhancement | low | String 库should_be_uppercase更名为should_be_upper_case(lower 同理) |
| #3991 | enhancement | low | 正式移除 Settings 段冒号(:)用法 |
| #4003 | enhancement | low | 清理安装说明中的过时信息 |
总结与升级建议
Robot Framework 4.1 RC1 是一次"体验导向"的功能版本:robot:continue-on-failure/robot:recursive-continue-on-failure让失败续跑从库实现细节变成测试作者的日常工具;参数转换对枚举、分隔符与进制的支持让数据驱动测试的数据表达更自然。升级路径上需重点核查两处不兼容点(--doc/--metadata文件读取、String 库方法重命名),并为 Python 2 与内置 Tidy 的 5.0 移除提前制定迁移计划。建议先在预发布环境跑一遍 atest 目录下的相关验收测试场景(如 continue_on_failure_tag.robot),确认既有套件行为符合预期后再全面升级。
- 测试
- RPA
- 接口测试
【免费下载链接】robotframework
Generic automation framework for acceptance testing and RPA
相关推荐
Robot Framework 4.1 版本特性详解:continue-on-failure 标签控制与参数转换增强
Robot Framework 4.1 版本特性详解:continue on failure 标签控制与参数转换增强 导读 Robot Framework 4.
测试RPA接口测试Robot Framework 4.0 alpha 2 深度解析:全新 SKIP 状态、Libdoc JSON 规格与参数转换增强
Robot Framework 4.0 alpha 2 深度解析:全新 SKIP 状态、Libdoc JSON 规格与参数转换增强 Robot Framewor
测试RPA接口测试Robot Framework 7.1 版本特性详解:Listener 增强、VAR 语法演进与兼容性变更
Robot Framework 7.1 版本特性详解:Listener 增强、VAR 语法演进与兼容性变更 Robot Framework 7.1 于 2024
测试RPA接口测试
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考