Robot Framework 7.0 发布指南:Listener V3 增强、VAR 原生语法与 JSON 结果格式全面解析
Robot Framework 7.0 发布指南:Listener V3 增强、VAR 原生语法与 JSON 结果格式全面解析
本篇技术指南以 Robot Framework 7.0 首个发布候选版本(rc 1,2023-12-21 发布)的官方发布说明为骨架,系统梳理 7.0 的核心新特性与破坏性变更:包括 listener 接口第 3 版支持关键字与控制结构、原生 VAR 变量语法、库关键字混合嵌入式/普通参数、JSON 结果格式、Literal 与字符串化类型转换,以及 output.xml 时间戳/属性格式升级等。读者读完可以掌握 7.0 的新语法与新 API 用法,理解 output.xml、结果模型、解析模型的迁移要点,并借助 --legacy-output 平滑过渡。
版本概览
Robot Framework 7.0 是一个全新的大版本(major release),主要围绕以下能力展开:
- 增强的 listener 接口(#3296):listener 版本 3 从仅支持 suite/test 扩展为同时支持关键字与控制结构;
- 原生
VAR语法(#3761):在测试与关键字内部动态创建变量; - 库关键字混合嵌入式与普通参数(#4710);
- JSON 结果格式(#4847):结果序列化支持扩展至执行结果;
- 其他多项增强与缺陷修复。
运行环境要求:Robot Framework 7.0 要求 Python 3.8 或更新版本(#4294),这是 7.0 的硬性前提。最后一个支持 Python 3.6/3.7 的版本是 Robot Framework 6.1.1。
rc 1 包含最终版本计划内的全部特性与修复,最终版本原定于 2024 年 1 月 8 日发布。如果计划在生产环境使用新特性,或担心破坏性变更影响既有测试、任务、工具与库,建议基于 rc 版本先行验证。
安装
如果已安装 pip,直接运行:
pip install --pre --upgrade robotframework
即可安装最新可用版本(包含 rc 版本);或者使用精确版本号安装:
pip install robotframework==7.0rc1
也可以从 PyPI 下载安装包手动安装。更多安装方式参见仓库根目录的 INSTALL.rst。注意 --pre 参数用于安装预发布版本,正式版发布后使用普通的 pip install --upgrade robotframework 即可。
最重要的新特性
Listener 接口大幅增强:版本 3 支持关键字与控制结构
listener 是 Robot Framework 执行期间的"事件订阅机制",可以获取执行过程中各类事件的回调通知,并且允许在运行期修改数据与结果。普通用户通常不直接编写 listener,但他们使用的很多工具(如日志增强、报告聚合、CI 集成插件)都构建在 listener 之上。
此前 listener API 版本 2 只能"接收通知",功能更强的版本 3 又只支持 suite 与 test/task,这是 listener 体系最大的局限。7.0 中版本 3 扩展到了关键字与控制结构,这是整个 7.0 最大的单项增强。例如,下面的 listener 会打印已启动的关键字信息以及已结束的 WHILE 循环信息:
from robot.running import Keyword as KeywordData, While as WhileData
from robot.result import Keyword as KeywordResult, While as WhileResult
def start_keyword(data: KeywordData, result: KeywordResult):
print(f"Keyword '{result.full_name}' used on line {data.lineno} started.")
def end_while(data: WhileData, result: WhileResult):
print(f"WHILE loop on line {data.lineno} ended with status {result.status} "
f"after {len(result.body)} iterations.")
对于关键字,还能获取关于实际执行关键字的更多信息。例如下面的 listener 打印被执行的库关键字及其所属库的信息:
from robot.running import Keyword as KeywordData, LibraryKeyword
from robot.result import Keyword as KeywordResult
def start_library_keyword(data: KeywordData,
implementation: LibraryKeyword,
result: KeywordResult):
library = implementation.owner
print(f"Keyword '{implementation.name}' is implemented in library "
f"'{library.name}' at '{implementation.source}' on line "
f"{implementation.lineno}. The library has {library.scope.name} "
f"scope and the current instance is {library.instance}.")
如上面的例子所示,listener 甚至可以拿到实际的库实例(library instance),这意味着 listener 可以检查库的内部状态,也可以修改它。对于用户关键字,listener 甚至可以修改关键字本身,或通过 owner 资源文件修改该资源文件中的任何其他关键字。
listener 也可以修改结果(result),例如隐藏敏感信息、基于外部数据源为结果补充细节等。需要注意的是:虽然 listener 可以更改任何已执行关键字或控制结构的状态,但这不会直接改变所属测试的状态;总体而言 listener 不能直接使关键字失败从而中断执行,也不能处理失败使执行继续——这类能力未来视需求可能会加入。
listener v3 新方法覆盖面广,官方发布说明无法逐一展开。仓库中的验收测试(acceptance tests)展示了这些方法各种有趣乃至"疯狂"的用法,可参考 atest/robot/output/listener_interface 目录下的相关测试,例如 start_keyword/end_keyword、start_while/end_while 等方法与运行期模型的交互。
版本 3 成为默认 listener 版本
此前 listener 需要用 ROBOT_LISTENER_API_VERSION 属性显式声明 API 版本。随着版本 3 获得新方法、能力远超版本 2,7.0 将版本 3 设为默认版本(#4910)。这在源码中有直接印证——src/robot/output/listeners.py 中通过 getattr(listener, 'ROBOT_LISTENER_API_VERSION', 3) 读取版本,未声明时默认按 3 处理:
def _get_version(self, listener):
version = getattr(listener, 'ROBOT_LISTENER_API_VERSION', 3)
try:
version = int(version)
if version not in (2, 3):
raise ValueError
except (ValueError, TypeError):
raise DataError(f"Unsupported API version '{version}'.")
return version
版本 2 依然可用,但需要像以前一样显式声明版本。目前没有废弃版本 2 的计划,但官方强烈建议尽可能使用版本 3。在 src/robot/api/interfaces.py 与 src/robot/api/interfaces.py 中可以看到两个版本的基类分别定义 ROBOT_LISTENER_API_VERSION = 2 与 = 3。
库可用字符串 SELF 注册自身为 listener
listener 通常通过命令行启用,但库也可以注册 listener。很多库希望自己充当 listener,此前需要在 __init__ 中写 self.ROBOT_LIBRARY_LISTENER = self。7.0 支持使用字符串 SELF(大小写不敏感)达到同样目的(#4910),这样 listener 可以作为类属性声明,而不必局限在 __init__ 中。结合 @library 装饰器尤其方便:
from robot.api.deco import keyword, library
@library(listener='SELF')
class Example:
def start_suite(self, data, result):
...
@keyword
def example(self, arg):
...
对应实现见 src/robot/output/listeners.py:当启用者是库且 listener 来源为字符串 SELF(大写比较)时,直接使用库实例作为 listener:
if library and isinstance(listener, str) and listener.upper() == 'SELF':
listener = library.instance
路径以 pathlib.Path 对象传给版本 3 listener
listener 有 output_file、log_file 等结果文件就绪时的回调方法,参数为文件路径。此前路径是字符串,7.0 起版本 3 listener 的方法收到的是更便捷的 pathlib.Path 对象(#4988)。如需字符串,用 str(path) 转换即可;大多数场景两者可互换,该变更极少引起问题。
原生 VAR 语法
新 VAR 语法(#3761)允许在执行期间动态创建本地变量,以及全局、套件、测试/任务作用域变量。其动机是提供比 Set Variable 关键字更便捷的本地变量创建方式,并统一不同作用域下创建变量的语法。除必须的 VAR 标记外,语法与 Variables 段创建变量完全一致。看示例:
*** Test Cases ***
Example
# Create a local variable `${local}` with a value `value`.
VAR ${local} value
# Create a variable that is available throughout the whole suite.
# Supported scopes are GLOBAL, SUITE, TEST, TASK and LOCAL (default).
VAR ${suite} value scope=SUITE
# Validate created variables.
Should Be Equal ${local} value
Should Be Equal ${suite} value
Example continued
# Suite level variables are seen also by subsequent tests.
Should Be Equal ${suite} value
从解析层源码可以看到 VAR 语句支持的选项全集(src/robot/parsing/model/statements.py):
class Var(Statement):
type = Token.VAR
options = {
'scope': ('LOCAL', 'TEST', 'TASK', 'SUITE', 'SUITES', 'GLOBAL'),
'separator': None
}
scope可选LOCAL(默认)、TEST、TASK、SUITE、SUITES、GLOBAL;separator用于控制多行标量值的拼接分隔符。
创建 ${scalar} 且值较长时,可以把值拆成多行,默认以空格拼接,可通过 separator 配置项修改;与 Variables 段一样,也可以创建 @{list} 与 &{dict} 变量。与 Variables 段不同的是,变量可以用 IF/ELSE 结构条件创建:
*** Test Cases ***
Long value
VAR ${long}
... This value is rather long.
... It has been split to multiple lines.
... Parts will be joined together with a space.
Multiline
VAR ${multiline}
... First line.
... Second line.
... Last line.
... separator=\n
List
# Creates a list with three items.
VAR @{list} a b c
Dictionary
# Creates a dictionary with two items.
VAR &{dict} key=value second=item
Normal IF
IF 1 > 0
VAR ${x} true value
ELSE
VAR ${x} false value
END
Inline IF
IF 1 > 0 VAR ${x} true value ELSE VAR ${x} false value
配套说明:BuiltIn 标准库的 Set Variable 等关键字的文档在 7.0 中也加入了推荐使用 VAR 语法的提示,例如 src/robot/libraries/BuiltIn.py:
*NOTE:* The ``VAR`` syntax introduced in Robot Framework 7.0 is generally
recommended over this keyword. ...
| VAR ${hi} Hello, world!
| VAR ${hi2} I said: ${hi}
库关键字支持混合嵌入式与普通参数
用户关键字早在 Robot Framework 6.1 就支持同时使用嵌入式参数与普通参数(#4234),7.0 把这一支持带给了库关键字(#4710)。规则是:实现关键字的函数/方法如果接受的参数多于嵌入式参数数量,剩余参数可作为普通参数传入。例如:
@keyword('Number of ${animals} should be')
def example(animals, count):
...
用法:
*** Test Cases ***
Example
Number of horses should be 2
Number of horses should be count=2
Number of dogs should be 3
JSON 结果格式
Robot Framework 6.1 已支持将 test/task 数据转换为 JSON 并可还原,7.0 把 JSON 序列化支持扩展到执行结果(#4847)。数据序列化最初的核心用途是便于跨进程、跨机器传输数据,现在结果也能方便地回传。
内置的 Rebot 工具(用于结果后处理)在输入与输出两侧都支持 JSON 文件:
- 创建 JSON 输出文件:使用普通
--output选项,指定文件扩展名为.json即可:
rebot --output output.json output.xml
- 读取输出文件时,按扩展名自动识别 JSON:
rebot output.json
rebot output1.json output2.json
- 组合(combine)或合并(merge)结果时,可以混用 JSON 与 XML 文件:
rebot output1.xml output2.json
rebot --merge original.xml rerun.json
JSON 输出文件的结构由 result.json schema 文件定义,schema 相关说明见 doc/schema/README.rst。未来计划进一步增强 JSON 输出支持(例如执行期间直接生成 JSON),详见 issue #3423。
参数转换增强
自动参数转换是库开发者避免手工转换参数、并获得更完善 Libdoc 文档的强大特性,7.0 有两项重要增强。
支持 Literal
Python 的 Literal 类型可以约束参数只能取某些值。例如下面的函数只接受字符串 x、y、z:
def example(arg: Literal['x', 'y', 'z']):
...
Robot Framework 现在会校验具有 Literal 类型的参数只能使用指定值(#4633),例如上面实现的关键字传入 xxx 会失败。除校验外,参数还会被转换:例如参数类型为 Literal[-1, 0, 1] 时,传入的字符串会先转为整数再校验。字符串匹配对大小写、空格、下划线、连字符不敏感,但精确匹配始终优先,最终传给关键字的参数保证是 Literal 中使用的精确格式。
Literal 转换与 Robot Framework 早已支持的 Enum 转换在很多方面相似。Enum 支持自定义文档、同一类型多处复用时通常更合适;简单场景下直接写 arg: Literal[...] 而不必定义新类型则非常便捷。相关实现位于 src/robot/running/arguments/typeinfo.py,包括对 Literal 的解析、校验(Literal 不能为空、只支持整数/字符串/字节等成员)与嵌套类型(union、参数化类型)处理。
支持"字符串化"类型:'list[int]' 与 'int | float'
Python 类型标注语法演进出了可参数化的泛型(如 list[int],Python 3.9 起)与联合类型(如 int | float,Python 3.10 起)。在更老的 Python 版本中使用这些构造会报错,但类型检查器支持"字符串化"类型提示(如 'list[int]'、'int | float'),与 Python 版本无关。
Robot Framework 的参数转换新增了对字符串化泛型与联合类型的支持(#4711)。例如下面的类型标注现在在 Python 3.8 上也能工作:
def example(a: 'list[int]', b: 'int | float'):
...
这些字符串化类型同样兼容 Remote 库 API 及其他无法使用真实类型的场景。从 src/robot/running/arguments/typeinfo.py 可以看到 type_converters 表中明确注册了 'union': Union 与 'literal': Literal。
全局标签可用 -tag 语法移除
单个测试和关键字现在可以用自己的 [Tags] 设置中的 -tag 语法移除 Settings 段中由 Test Tags 或 Keyword Tags 设置的标签(#4374)。例如下面的测试 T1、T3 获得标签 all 与 most,而测试 T2 获得 all 与 one:
*** Settings ***
Test Tags all most
*** Test Cases ***
T1
No Operation
T2
[Tags] one -most
No Operation
T3
No Operation
对于测试,此前可以通过 Default Tags 设置并在需要处覆盖实现同样效果,但该语法已被视为废弃(#4365),推荐使用新的 -tag 语法;对于关键字,此前完全没有类似功能。
动态与混合库 API 支持异步执行
动态(dynamic)与混合(hybrid)库现在支持异步执行,实践中 get_keyword_names、run_keyword 等特殊方法可以实现为 async 方法(#4803)。普通静态库 API 的异步支持在 Robot Framework 6.1 已加入(#4089)。同时修复了优雅停止执行时异步关键字处理相关的缺陷(#4808)。
结果模型与 output.xml 使用标准时间戳格式
此前结果模型与 output.xml 中存储的时间戳使用自定义格式(如 20231107 19:57:01.123)。非标准格式通常不是好主意,而且解析这种自定义格式速度较慢。
7.0 起结果模型将时间戳存储为标准 datetime 对象、耗时存储为 timedelta(#4258),创建与操作时间更加方便且快得多。新对象可通过 start_time、end_time、elapsed_time 属性访问——这三个属性早在 Robot Framework 6.1 就已作为前向兼容加入(#4765)。旧信息仍可通过 starttime、endtime、elapsedtime 属性获取,因此这一变更完全向后兼容。
output.xml 中的时间戳格式也由自定义的 YYYYMMDD HH:MM:SS.mmm 改为 ISO 8601 兼容的 YYYY-MM-DDTHH:MM:SS.mmmmmm。标准格式让 output.xml 更易处理,也带来了显著的性能收益:由于结果模型直接存储 datetime 对象,使用内置的 isoformat() 与 fromisoformat() 格式化/解析比自定义格式化快得多。
另一个相关变更:output.xml 不再为每个执行项存储起止时间,而是存储开始时间与耗时,耗时以秒为单位的浮点数表示。直接拿到耗时比根据起止时间计算方便得多,且存储空间更小。得益于这些改动,结果模型与 output.xml 中的时间精度从毫秒提升到了微秒;日志与报告仍使用毫秒,未来如有需要再行调整。output.xml 的这些变更属于向后不兼容,会影响所有处理时间戳的外部工具。
报告与日志支持深色模式
报告(report)与日志(log)新增深色模式(#3725)。默认根据浏览器与操作系统偏好自动启用,也提供切换按钮手动切换。
向后不兼容的变更
Python 3.6 与 3.7 不再受支持
Robot Framework 7.0 要求 Python 3.8 或更新版本(#4294)。最后一个支持 Python 3.6/3.7 的版本是 6.1.1。
output.xml 变更
output.xml 以多种方式发生变化,在外部工具更新之前,Robot Framework 7.0 与处理 output.xml 的外部工具不兼容。官方尽量避免这类破坏性变更,但尤其是时间戳相关改动非常重要,迟早要做。由于改动较大,外部工具完成适配需要时间;如果用户依赖不兼容的工具又想用上 7.0,可以执行时或配合 Rebot 工具使用新的 --legacy-output 选项,生成与旧版本兼容的 output.xml。该选项在配置层(src/robot/conf/settings.py)与结果写出层(src/robot/result/executionresult.py)均有实现——save(target, legacy_output=False) 在 legacy_output=True 时使用 LegacyOutputWriter 而非 OutputWriter。
时间戳相关变更
output.xml 最大的变化在时间戳(#4258)。旧版本中执行项的开始/结束时间与日志消息时间戳使用自定义 YYYYMMDD HH:MM:SS.mmm 格式,现在为 ISO 8601 兼容的 YYYY-MM-DDTHH:MM:SS.mmmmmm。另外,原来存到 starttime、endtime 属性及消息的 timestamp 属性,现在改为存储到 start 与 elapsed 属性,消息时间存到 time。示例如下:
<!-- Old format -->
<msg timestamp="20231108 15:36:34.278" level="INFO">Hello world!</msg>
<status status="PASS" starttime="20231108 15:37:35.046" endtime="20231108 15:37:35.046"/>
<!-- New format -->
<msg time="2023-11-08T15:36:34.278343" level="INFO">Hello world!</msg>
<status status="PASS" start="2023-11-08T15:37:35.046153" elapsed="0.000161"/>
新格式符合标准、时间信息更详细、耗时直接可得,且 <status> 元素比原来短 10% 以上。这些好处都很实在,但官方也对给 output.xml 工具开发者带来的额外工作表示歉意。
关键字名称相关变更
output.xml 中关键字名称的存储方式也略有变化(#4884)。每个执行的关键字会同时存储关键字名称与所在库/资源文件名称:旧版本中后者存储在 library 属性(资源文件也是),现在属性更名为通用的 owner。owner 名称更贴切,也与结果模型中新引入的 owner 属性一致。另一变化是:使用嵌入式参数的关键字,其原始名称从 sourcename 属性改存到 source_name 属性,与结果模型保持一致。示例:
<!-- Old format -->
<kw name="Log" library="BuiltIn">...</kw>
<kw name="Number of horses should be" sourcename="Number of ${animals} should be" library="my_resource">...</kw>
<!-- New format -->
<kw name="Log" owner="BuiltIn">...</kw>
<kw name="Number of horses should be" source_name="Number of ${animals} should be" owner="my_resource">...</kw>
其他变更
关键字与控制结构现在可以有消息(message),消息表示为 <status> 元素的文本内容(此前只有测试与套件有此能力)。与此相关,控制结构不能再有 <doc>(#4883)。这些变更通常不会给处理 output.xml 的工具造成问题,但每个失败关键字与控制结构都存储消息可能增大 output.xml 体积。
Schema 更新
output.xml schema 已更新,见 doc/schema 目录(含 result.xsd 与 result.json 等)。
结果模型变更
结果模型有一些变更会影响使用它的外部工具,主要动机是为 JSON 表示做准备而清理模型(#4847)。
关键字名称相关变更
最大的变更与关键字名称有关(#4884)。此前 Keyword 对象有 name 属性,包含完整关键字名称(如 BuiltIn.Log);实际关键字名称与所属库/资源文件名分别位于 kwname 与 libname;使用嵌入式参数的关键字还有包含原始名称的 sourcename 属性。7.0 的变更如下:
- 旧
kwname更名为name,与执行侧的Keyword保持一致; - 旧
libname更名为通用的owner; - 新增
full_name取代旧name(返回owner.name格式); sourcename更名为source_name;kwname、libname、sourcename保留为属性(已废弃,但访问暂不产生警告)。
向后不兼容的部分是 name 属性语义的变化:它曾经是返回 BuiltIn.Log 这种完整名称的只读属性,现在是一个普通属性,只包含 Log 这样的实际关键字名称。其他旧属性都作为属性保留,使用它们的代码无需立即更新。源码印证见 src/robot/result/model.py:full_name 通过 f'{self.owner}.{self.name}' 构造,kwname/libname/sourcename 均标记为 "Deprecated since Robot Framework 7.0" 并转发到新属性。
已废弃属性被移除
以下自 Robot Framework 4.0 起就废弃的属性在 7.0 被移除(#4846):
TestSuite.keywords→ 改用TestSuite.setup与TestSuite.teardown;TestCase.keywords→ 改用TestCase.body、TestCase.setup与TestCase.teardown;Keyword.keywords→ 改用Keyword.body与Keyword.teardown;Keyword.children→ 改用Keyword.body与Keyword.teardown;TestCase.critical→ 整个 criticality 概念已移除。
此外,TestSuite.keywords 与 TestCase.keywords 也已在执行模型中移除。
解析模型变更
解析模型也有一些变更:
- 表示已废弃
[Return]设置的节点由Return更名为ReturnSetting;同时,表示RETURN语句的节点由ReturnStatement更名为Return(#4939)。为平滑迁移,ReturnSetting自 Robot Framework 6.1 起就是Return的别名(#4656),现在ReturnStatement也保留为别名;ModelVisitor基类对visit_ReturnSetting与visit_ReturnStatement有特殊处理,使其在 6.1 及更新版本中都能与新旧节点配合。源码侧 src/robot/parsing/model/statements.py 的注释明确写道:"This class namedReturnStatementprior to Robot Framework 7.0. The old name still exists as a backwards compatible alias." - 表示
Test Tags设置及已废弃Force Tags设置的节点由ForceTags更名为TestTags(#4385)。ModelVisitor对visit_ForceTags方法有特殊处理,变更后仍可工作。 - 库导入中
AS(或WITH NAME)使用的 token 类型变更为Token.AS(#4375),Token.WITH_NAME仍作为Token.AS的别名存在。 - 语句的
type与tokens从_fields移动到_attributes(#4912),可能影响模型调试。
Libdoc spec 文件变更
以下废弃构造已从 Libdoc spec 文件中移除(#4667):
- XML 或 JSON spec 文件中的
datatypes已移除(早在 Robot Framework 5.0 就废弃,改用typedocs,#4160); - XML spec 不再把类型名称写入
<type>元素内容,自 Robot Framework 6.1 起名称通过<type>元素的name属性提供(#4538); - JSON spec 中参数的
types与typedocs属性已移除,改用 RF 6.1 引入的type属性(#4538)。
Libdoc schema 文件已更新,见 doc/schema 目录下的 libdoc.json 与 libdoc.xsd。
--suite、--test 与 --include 选择测试的行为变更
有两项与测试选择相关的变更:
- 同时使用
--test与--include时,匹配任一选项的测试都会被选中(#4721),此前需要同时匹配两个选项; - 使用父套件作为前缀选择套件(如
--suite parent.suite)时,给定名称必须匹配完整套件名称(#4720),此前只需前缀匹配最近的父套件。
其他向后不兼容变更
- Process 库
stdin默认值变更(#4103):从subprocess.PIPE改为None,以避免某些情况下进程挂起;依赖旧行为的用户需显式使用stdin=PIPE。 - 字符串类型提示格式限制(#4711):字符串形式类型提示必须为
type、type[param]、type[p1, p2]或t1 | t2格式,其他格式会导致关键字启用时报错。实际中问题多出现在[、]、,、|出现在意外位置时,例如arg: "Hello, world!"会因逗号报错。 - Remote 接口的日期时间对象传输方式变化(#4784):此前
datetime、date、timedelta都转为字符串;现在datetime原样发送,date转为datetime后发送,timedelta通过total_seconds()转为float发送。 - 移除
collections.abc.ByteString的参数转换支持(#4983):ByteString已废弃且将在 Python 3.14 移除。若在使用,把arg: ByteString改为arg: bytes | bytearray即可保持功能不变。 - listener v3 方法路径参数类型变化(#4988):
output_file、log_file等方法的路径参数从字符串改为pathlib.Path对象,通常可互换,如需字符串用str(path)转换。 robot.utils.normalize不再支持 bytes(#4936)。timestr_to_secs工具函数移除已废弃的accept_plain_values参数(#4861)。
废弃(Deprecations)说明
[Return] 设置
[Return] 设置(用于指定用户关键字返回值)被"大声"废弃(#4876)。它自 Robot Framework 5.0 引入功能更强的 RETURN 设置起(#4078)就处于"静默"废弃状态,现在使用它会产生废弃警告。计划至少保留到 Robot Framework 8.0。如果数据量很大,最简单的方式是用 Robotidy 工具自动把 [Return] 转换为 RETURN;如果数据还需要在不支持 RETURN 的旧版本上运行,可改用 Return From Keyword 关键字(该关键字最终也会被废弃并移除)。
单数形式段标题
使用单数形式的段标题(如 *** Test Case *** 或 *** Setting ***)现在会产生废弃警告(#4432)。这类写法在 Robot Framework 6.0 已静默废弃,原因见 issue #4431。
解析、运行与结果模型中的废弃属性
- 解析模型中,
For.variables、ForHeader.variables、Try.variable、ExceptHeader.variable废弃,改用新的assign属性(#4708); - 运行与结果模型中,
For.variables与TryBranch.variable废弃,改用assign(#4708); - 结果模型中,控制结构(如
FOR)此前被建模得类似关键字,如今被视为完全不同的对象,其关键字专属属性name、kwnane、libname、doc、args、assign、tags、timeout均已废弃(#4846); - 结果模型中的
starttime、endtime、elapsedtime属性被静默废弃(#4258),访问暂不产生警告,建议改用 Robot Framework 6.1 起提供的start_time、end_time、elapsed_time; - 结果模型
Keyword对象的kwname、libname、sourcename属性被静默废弃(#4884),新代码应使用name、owner、source_name。
其他废弃特性
- 嵌入式参数与变量:使用不匹配自定义嵌入式参数模式的变量作为嵌入式参数,现在会产生废弃警告(#4524),此前总是接受而不管值是否匹配;
FOR IN ZIP默认模式:长度不同的列表使用FOR IN ZIP循环而不显式声明mode=SHORTEST已被废弃(#4685),未来长度必须匹配的严格模式将成为默认;robot.utils中不再使用的工具函数(包括整个 Python 2/3 兼容层)被废弃(#4501),需要时可自行复制到自己的工具或库中,此变更可能影响生态中的既有库与工具;- Collections 与 String 库参数改名:部分关键字的
case_insensitive、whitespace_insensitive参数废弃,改用ignore_case、ignore_whitespace(新参数为了一致性引入,#4954),旧参数暂时仍可用; elapsed_time_to_string工具函数:以毫秒传时间已被废弃(#4862)。
7.0 修复与增强一览
7.0 共合入 85 个 issue。除上述特性外,值得关注的高优先级修复与增强还包括:
#4659(高):Run Keyword且关键字名包含变量时的性能回退已修复;#4921(高):robot:flatten的日志级别不生效问题已修复;#4964(中):Set Suite Variable配合children=True设置的变量无法正确覆盖的问题已修复;#4930(中):BuiltIn 新增Reset Log Level关键字,用于将日志级别重置为原始值;#4979(中):新增robot.result.TestSuite.to/from_xml方法;#4942(中):为库与其他工具新增公开的参数转换 API;#4877(中):XML 库Elements Should Be Equal支持忽略元素顺序;#4975(中):WHILE的limit支持times与x后缀,与Wait Until Keyword Succeeds更兼容;#4960(中):整数转换支持'1.0'、'2e10'这类表示整数值浮点的字符串;#4872(中):可通过递归与非递归标签组合控制 continue-on-failure 模式;#4545(中):支持基于另一变量创建赋值变量名,如${${var}} = Keyword;#4903(中):动态变量文件支持参数转换与命名参数;#4905(中):Variables 段支持基于另一变量创建变量名,如${${VAR}};#4747(中):用户关键字支持[Setup]。
完整的 85 个 issue 清单(含类型、优先级、引入阶段)可查阅本文件末尾的完整表格,或直接在官方 issue tracker 中按 milestone v7.0 查看。
致谢与社区
Robot Framework 的开发由 Robot Framework Foundation 及其 60 多家成员组织赞助。7.0 团队由 Pekka Klärck 与 Janne Härkönen(兼职)组成,社区贡献者包括:Ygor Pontelo(动态/混合库 API 异步支持、优雅停止时异步关键字修复)、Topi Tuulensuu(Run Keyword 性能回退修复)、Pasi Saikkonen(报告与日志深色模式)、René(Libdoc HTML 输出返回类型信息、DotDict 相等比较修复、深色模式收尾)、Robin(robot.api 公共包类型注解)、Mark Moberts(Collections 库大小写不敏感列表与字典比较)、Daniel Biehl(ModelVisitor 遍历解析模型性能优化)等。
总结:Robot Framework 7.0 通过 listener v3 的关键字/控制结构支持、原生 VAR 语法、库关键字混合参数、JSON 结果格式等特性大幅提升了自动化框架的表达力与工具生态的可扩展性;同时以 ISO 8601 时间戳、owner/source_name 属性重命名等标准化改造重塑了结果与解析模型。升级前务必对照本文"向后不兼容的变更"与"废弃说明"检查既有工具链,必要时用 --legacy-output 生成兼容 output.xml 平滑过渡。