Robot Framework 4.1 RC1 深度解析:continue-on-failure 标签控制、参数转换增强与兼容性变更指南
2026/9/24 0:54:37 网站建设 项目流程
  • 测试
  • RPA
  • 接口测试

【免费下载链接】robotframework

Generic automation framework for acceptance testing and RPA

项目地址:https://gitcode.com/gh_mirrors/ro/robotframework
点击查看免费下载

导读

本文基于 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 之前,这项能力只能通过两种途径开启:

  1. 库关键字使用特殊异常(continuable exception)主动声明失败可续跑;
  2. 调用 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-failurerobot:recursive-stop-on-failurerobot:stop-on-failure的交互。

核心增强二:自动参数转换的三项改进

支持 IntEnum 与 IntFlag

自动参数转换现在支持 Python 的派生枚举IntEnumIntFlag(#3910)。与其他枚举一样,参数可以传成员名;由于IntEnum/IntFlag同时是整数类型,参数还可以直接传成员的整数值

在 src/robot/running/arguments/typeconverters.py 的EnumConverter中可以找到依据:value_types在枚举是int子类时扩展为(str, int),转换失败后还会回退到按整数值查找成员(_find_by_int_value)。这意味着一个类型为IntEnum的参数,传入'MEMBER''member'(归一化匹配,忽略下划线与连字符)或170这类整数都能得到正确成员。

数字分隔符:空格与下划线

intfloatDecimal的数字转换现在支持空格与下划线作为分隔符,例如2 000 000(#4026)。实现位于TypeConverter._remove_number_separators(typeconverters.py),转换前统一剥离字符串中的空格与下划线,FloatConverterDecimalConverterIntegerConverter均复用了这一逻辑。

整数进制的显式书写

整数转换支持十六进制、八进制、二进制前缀:

  • 十六进制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_uppercaseshould_be_lowercase分别更名为should_be_upper_caseshould_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 TagsRemove Tags修改标签并反映到 dryrun 日志中(#3985)。
  • 变量与参数校验:支持${var}[key]语法作用于同时允许按键访问的列表(#4037);解析器检测用户关键字定义中的非法参数,如@{varargs}带默认值不再静默(#4034、#3946)。
  • Libdoc:修复关键字文档在窄浏览器窗口下的滚动条问题(#4012)、数据类型文档多余缩进(#4030)、全部测试被跳过时日志未正确展开(#4035)等。

4.1 RC1 完整 Issue 清单(28 项)

下表为发布说明记录的完整问题列表(ID 为原文档编号,可按里程碑在 issue tracker 检索):

ID类型优先级摘要
#4009bughighRebot 在--removekeywords与用例级 IF 组合时生成无效 output.xml
#4036bughigh--expandkeywords且测试含ELSE分支时日志生成失败
#2285enhancementhigh支持用测试/关键字标签控制 continue-on-failure 模式
#3910enhancementhigh自动参数转换支持IntEnumIntFlag
#3798bugmedium安装 wxPython 时 Screenshot 库阻碍执行优雅终止
#3973bugmedium监听器判定测试失败时--exitonfailure未启动
#3985bugmediumdryrun 日志中不显示用关键字设置的标签
#3994bugmedium套件 teardown 失败导致 skipped 测试显示为 fail
#3996bugmediumteardown 中测试被跳过时错误触发--exitonfailure
#4012bugmedium小浏览器窗口下关键字文档滚动条问题
#4030bugmediumLibdoc 数据类型文档带多余缩进
#4034bugmedium用户关键字@{varargs}带默认值未正确报错
#3209enhancementmediumWait Until Keyword Succeeds支持严格间隔重试
#3398enhancementmediumteardown 中关键字超时后应继续执行
#3818enhancementmediumRebot 合并结果时不应计入 SKIP 状态
#3884enhancementmediumBuiltIn 比较关键字支持折叠空白
#3909enhancementmediumint参数转换支持二进制/八进制/十六进制
#3934enhancementmediumRemote 二进制转换支持 0-255 Unicode 字符
#3946enhancementmedium解析器检测用户关键字定义中的非法参数
#4004enhancementmedium弃用内置 Tidy,改用外部 RoboTidy
#4008enhancementmedium支持--doc--metadata从文件读取
#4026enhancementmedium参数转换支持空格/下划线数字分隔符
#4037enhancementmedium${var}[key]支持可按键访问的列表
#4027buglowskip-on-failure 生效时 teardown 中失败的错误信息有误
#4035buglow全部测试被跳过时日志未正确展开
#3890enhancementlowString 库should_be_uppercase更名为should_be_upper_case(lower 同理)
#3991enhancementlow正式移除 Settings 段冒号(:)用法
#4003enhancementlow清理安装说明中的过时信息

总结与升级建议

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

项目地址:https://gitcode.com/gh_mirrors/ro/robotframework
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询