Robot Framework 6.1 版本特性深度解析:JSON 数据格式、外部 Parser API 与执行引擎全面增强
2026/9/23 21:46:02 网站建设 项目流程

Robot Framework 6.1 版本特性深度解析:JSON 数据格式、外部 Parser API 与执行引擎全面增强

【免费下载链接】robotframeworkGeneric automation framework for acceptance testing and RPA项目地址: https://gitcode.com/gh_mirrors/ro/robotframework

本指南以 Robot Framework 6.1 rc1(首个候选发布版,2023 年 6 月 5 日发布,最终版定于 2023 年 6 月 12 日)官方发布说明为核心,系统梳理 6.1 的全部新特性、向后不兼容变更与弃用项。6.1 是面向验收测试与 RPA 的通用自动化框架 Robot Framework 的又一特性版本,最大的亮点是支持将测试/任务数据与 JSON 互相转换、全新的外部 Parser API,以及允许用户关键字混合使用嵌入式参数与普通参数,此外还为工具开发者带来大量 API 层面的增强。读完本文,你将掌握 JSON 套件序列化/反序列化的完整用法、自定义解析器的三种实现形态、WHILE/FOR IN ZIP 循环的新配置项,以及升级 6.1 前必须了解的破坏性变更清单。

版本概况与安装方式

Robot Framework 6.1 是一个特性版本(feature release),支持把 Robot Framework 数据转换为 JSON 及反向转换、提供新的外部 Parser API、允许在用户关键字中混合嵌入式参数与普通参数,并包含面向普通用户与外部工具开发者的多项新功能。rc1 包含所有计划中的修复与特性,官方希望所有用户在实际环境中测试,以在正式版发布前发现可能的回归。

如果你已安装 pip,可通过以下命令安装最新可用版本:

pip install --pre --upgrade robotframework

或精确安装 6.1rc1 版本:

pip install robotframework==6.1rc1

也可以从 PyPI 下载源码分发包手动安装。更详细的安装方式参见仓库根目录的 INSTALL.rst。需要注意的是,本文所有特性描述以 6.1 时间节点的 rc1 为准,个别行为(如FOR IN ZIP的默认模式)在后续版本中另有演进,仓库源码中已带有相应注释(详见下文)。

最重要的新特性(Most important enhancements)

JSON 数据格式:套件与 JSON 互转

Robot Framework 6.1 最大的新特性是支持把测试/任务数据转换为 JSON,并可从 JSON 重建套件(issue #3902)。该功能主要有三大应用场景:

  • 跨进程、跨机器传输数据:在一台机器上把套件转换为 JSON,在另一台机器上重建。
  • 保存快速解析的单文件套件:把由普通 Robot Framework 数据构建的套件保存为单个 JSON 文件,解析更快。
  • 供外部工具生成测试/任务的备选数据格式

该特性更多是为工具开发者而非普通用户设计。核心功能如下:

  1. 序列化套件为 JSON:使用TestSuite.to_json方法。无参数调用时返回 JSON 字符串,也接受路径或已打开的文件用于写入 JSON 数据,并支持 JSON 格式化相关配置选项:
from robot.running import TestSuite # 基于文件系统数据构建套件 suite = TestSuite.from_file_system('/path/to/data') # 以字符串形式获取 JSON 数据 data = suite.to_json() # 以自定义缩进保存 JSON 到文件 suite.to_json('data.rbt', indent=2)

如果希望先处理 Python 数据结构、再自行转换为 JSON 或其他格式,可以改用TestSuite.to_dict。其底层实现在 src/robot/model/testsuite.py:套件名称、文档、元数据、source、rpa 模式、setup/teardown、tests、suites 等属性会按需写入字典。

  1. 从 JSON 创建套件:使用TestSuite.from_json,同时支持 JSON 字符串与 JSON 文件路径:
from robot.running import TestSuite # 从文件中的 JSON 数据创建套件 suite = TestSuite.from_json('data.rbt') # 从 JSON 字符串创建套件 suite = TestSuite.from_json('{"name": "Suite", "tests": [{"name": "Test"}]}')

如果数据是 Python 字典,可改用TestSuite.from_dict。在仓库的模型层,ForTryBranch等控制结构的from_dict还专门保留了 RF 6.1 的兼容逻辑(如把旧字段variables迁移为assign),见 src/robot/running/model.py。

  1. 命令行自动解析.rbt文件:正常使用robot命令时,带.rbt扩展名的 JSON 文件会被自动解析。这包括运行单个 JSON 文件(如robot tests.rbt)以及运行包含.rbt文件的目录。

在源码中,.rbt.json均已注册进内置解析器表,见 src/robot/running/builder/builders.py('rbt': json_parser, 'json': json_parser),其解析器实现JsonParser位于 src/robot/running/builder/parsers.py。同时默认识别扩展名列表(.robot.rbt.robot.rst)定义于 src/robot/conf/settings.py 与 src/robot/parsing/suitestructure.py。

跨机器传输时的 source 处理

TestSuite.to_json/to_dict得到的套件 source 信息是绝对路径格式。如果套件之后在另一台机器上重建,source 可能与该机器的目录结构不匹配。为此提供了新的TestSuite.adjust_source方法:在导出前把套件 source 改为相对路径,重建后再补上正确的根目录:

from robot.running import TestSuite # 创建套件、调整 source 并转换为 JSON suite = TestSuite.from_file_system('/path/to/data') suite.adjust_source(relative_to='/path/to') suite.to_json('data.rbt') # 在别处重建套件并相应调整 source suite = TestSuite.from_json('data.rbt') suite.adjust_source(root='/new/path/to')

该方法的实现见 src/robot/model/testsuite.py:relative_to参数内部调用pathlib.Path.relative_to()生成相对路径(无法生成时抛ValueError);root参数把给定路径设为 source 的新根目录(source 为绝对路径时抛ValueError),并会递归调整所有子套件。

JSON 数据格式本身由 doc/schema/running.json schema 文件定义。官方也表示 JSON 序列化支持会在未来版本继续增强。

外部 Parser API:自定义数据格式解析器

Parser API 是另一个面向工具开发者的重要新接口(issue #1283)。它允许创建自定义解析器来支持自己的数据格式,甚至可以覆盖 Robot Framework 自带的解析器。

解析器通过新的--parser命令行选项启用,用法与 listeners 类似,支持以名称或路径指定解析器、向解析器类传参等:

robot --parser MyParser tests.custom robot --parser path/to/MyParser.py tests.custom robot --parser Parser1:arg --parser Parser2:a1:a2 path/to/tests

在源码层面,--parser选项传入后会经由Importer按名称或路径导入解析器类/模块,并用split_args_from_name_or_path切分参数(见 src/robot/running/builder/builders.py)。

形式一:模块式解析器(最简形态)

简单场景下解析器可以实现为模块,只需具备两个要素:一个EXTENSION(或extension)属性声明支持的扩展名;一个parse方法接收源文件路径作为参数:

from robot.api import TestSuite EXTENSION = '.example' def parse(source): suite = TestSuite(name='Example', source=source) test = suite.tests.create(name='Test') test.body.create_keyword(name='Log', args=['Hello!']) return suite

如上例所示,parse方法必须返回一个TestSuite实例。上例中套件只包含一些演示数据,并未真正解析源文件。

形式二:类式解析器(可保持状态并接收命令行参数)

解析器也可以实现为类,这样既能保存状态,又能从命令行接收参数。下面的例子不仅演示了这一点,还真正处理了源文件:

from pathlib import Path from robot.api import TestSuite class ExampleParser: def __init__(self, extension: str): self.extension = extension def parse(self, source: Path) -> TestSuite: suite = TestSuite(TestSuite.name_from_source(source), source=source) for line in source.read_text().splitlines(): test = suite.tests.create(name=line) test.body.create_keyword(name='Log', args=['Hello!']) return suite
形式三:继承可选 Parser 基类(支持 parse_init 与 defaults)

如前面示例所示,解析器无需继承任何显式基类或接口。但存在一个可选的Parser基类可以继承,示例中有两个与其他示例不同的地方:

  • 解析器带有可选的parse_init方法,用于解析套件初始化文件。
  • parseparse_init都接受可选的defaults参数。当存在这第二个参数时,parse方法会收到一个包含测试相关默认值(setup、teardown、tags、timeout)的TestDefaults实例,这些值来自初始化文件;parse_init也能收到它,其对默认值所做的修改会被后续调用的parse方法看到。
from pathlib import Path from robot.api import TestSuite from robot.api.interfaces import Parser, TestDefaults class ExampleParser(Parser): extension = ('example', 'another') def parse(self, source: Path, defaults: TestDefaults) -> TestSuite: """Create a suite and set possible defaults from init files to tests.""" suite = TestSuite(TestSuite.name_from_source(source), source=source) for line in source.read_text().splitlines(): test = suite.tests.create(name=line, doc='Example') test.body.create_keyword(name='Log', args=['Hello!']) defaults.set_to(test) return suite def parse_init(self, source: Path, defaults: TestDefaults) -> TestSuite: """Create a dummy suite and set some defaults. This method is called only if there is an initialization file with a supported extension. """ defaults.tags = ('tags', 'from init') defaults.setup = {'name': 'Log', 'args': ['Hello from init!']} return TestSuite(TestSuite.name_from_source(source.parent), doc='Example', source=source, metadata={'Example': 'Value'})
实战:用 Parser 做 Robot 数据预处理

最后一个解析器示例充当 Robot Framework 数据文件的预处理器,支持=== Test Cases ===格式的标题(除了标准的*** Test Cases ***)。这种用法下,用TestSuite.from_stringTestSuite.from_modelTestSuite.from_file_system工厂方法构建返回的套件会很方便:

from pathlib import Path from robot.running import TestDefaults, TestSuite class RobotPreprocessor: extension = '.robot' def parse(self, source: Path, defaults: TestDefaults) -> TestSuite: data = source.read_text() for header in 'Settings', 'Variables', 'Test Cases', 'Keywords': data = data.replace(f'=== {header} ===', f'*** {header} ***') suite = TestSuite.from_string(data, defaults=defaults) return suite.config(name=TestSuite.name_from_source(source), source=source)

用户关键字可混合嵌入式参数与普通参数

用户关键字如今可以同时使用嵌入式参数(embedded arguments)和普通参数(issue #4234)。例如:

*** Test Cases *** Example Number of horses is 2 Number of dogs is 3 *** Keywords *** Number of ${animals} is [Arguments] ${count} Log to console There are ${count} ${animals}.

目前该能力仅对用户关键字生效;如果社区有需求,未来版本可扩展支持库关键字。

支持向列表和字典项赋值

Robot Framework 6.1 允许把关键字返回值直接赋给列表项和字典项(issue #4546):

${list}[0] = Keyword ${dict}[key] = Keyword ${result}[users][0] = Keyword

这在需要就地修改嵌套数据结构时非常实用。

执行期间压平关键字结构:robot:flatten标签

嵌套的关键字结构——尤其是递归关键字调用以及 WHILE/FOR 循环——会让日志文件因多层嵌套而难以阅读,同时也会增大 output.xml 的体积。例如下面这个简单关键字:

*** Keywords *** Example Log Robot Log Framework

在 output.xml 中就会产生这么多内容:

<kw name="Example"> <kw name="Log" library="BuiltIn"> <arg>Robot</arg> <doc>Logs the given message with the given level.</doc> <msg timestamp="20230103 20:06:36.663" level="INFO">Robot</msg> <status status="PASS" starttime="20230103 20:06:36.663" endtime="20230103 20:06:36.663"/> </kw> <kw name="Log" library="BuiltIn"> <arg>Framework</arg> <doc>Logs the given message with the given level.</doc> <msg timestamp="20230103 20:06:36.663" level="INFO">Framework</msg> <status status="PASS" starttime="20230103 20:06:36.663" endtime="20230103 20:06:36.664"/> </kw> <status status="PASS" starttime="20230103 20:06:36.663" endtime="20230103 20:06:36.664"/> </kw>

此前已有的--flattenkeywords选项可以"压平"这类结构,效果很好:关键字被压平时,其子关键字和控制结构被移除,但所有消息(<msg>元素)都会保留。不过--flattenkeywords不影响执行期间生成的 output.xml,压平发生在 output.xml 被解析时,可以节省大量内存。当--flattenkeywords与 Rebot 配合使用时,可以生成新的压平后的 output.xml。例如上述结构在压平Example关键字后变为:

<kw name="Keyword"> <doc>_*Content flattened.*_</doc> <msg timestamp="20230103 20:06:36.663" level="INFO">Robot</msg> <msg timestamp="20230103 20:06:36.663" level="INFO">Framework</msg> <status status="PASS" starttime="20230103 20:06:36.663" endtime="20230103 20:06:36.664"/> </kw>

从 Robot Framework 6.1 开始,这类压平可以在执行期间完成,且无需命令行选项——只需使用新的关键字标签robot:flatten(issue #4584),压平会自动进行。例如把前面的Keyword改为:

*** Keywords *** Example [Tags] robot:flatten Log Robot Log Framework

output.xml 中的结果就会是:

<kw name="Example"> <tag>robot:flatten</tag> <msg timestamp="20230317 00:54:34.772" level="INFO">Robot</msg> <msg timestamp="20230317 00:54:34.772" level="INFO">Framework</msg> <status status="PASS" starttime="20230317 00:54:34.771" endtime="20230317 00:54:34.772"/> </kw>

使用robot:flatten而非--flattenkeywords的主要好处是:压平发生在执行期间,产出的 output.xml 更小。不过--flattenkeywords有更多配置选项,robot:flatten未来可按需增强。

公共 API 增加类型信息

Robot Framework 有多个供库开发者与工具开发者使用的公共 API,这些 API 如今都带有类型提示(type hints),使使用更加容易:

  • TestSuite结构(供 listeners、model modifiers、外部解析器及各种工具使用,issue #4570)
  • Listener API(issue #4568)
  • 动态库与混合库 API(issue #4567)
  • Parsing API(issue #4740)
  • Visitor API(issue #4569)

自定义参数转换器可访问所属库

自定义参数转换器(custom argument converters)自 Robot Framework 5.0 引入(issue #4088)以来非常实用。6.1 对其增强:转换器现在可以轻松访问包含所用关键字的库,从而基于库的状态进行转换(issue #4510)。做法很简单——创建一个接受两个值的转换器:第一个值是数据中使用的值(与之前完全相同),第二个是库实例或模块:

def converter(value, library): ...

只接受一个参数的转换器保持原有行为不变,官方没有计划强制要求它们改为接受两个值。

JSON 变量文件支持

Robot Framework 长期以来支持用 YAML 和 Python 创建变量文件,6.1 起也支持 JSON 变量文件(issue #4532)。例如一个 JSON 文件包含:

{ "STRING": "Hello, world!", "INTEGER": 42 }

可以这样使用:

*** Settings *** Variables example.json *** Test Cases *** Example Should Be Equal ${STRING} Hello, world! Should Be Equal ${INTEGER} ${42}

底层实现在 src/robot/variables/filesetter.py:变量文件按扩展名路由,.json结尾的路径走 JSON 分支,用json.load解析,并要求顶层必须是映射(mapping),否则抛出DataError。此外,JSON 变量文件不支持命令行参数传递(issue 相关行为见该文件中JSON variable files do not accept arguments的报错)。

WHILE 循环多项增强

Robot Framework 的 WHILE 循环在多个方面得到增强:

  • 最大的增强是新增可选的on_limit配置选项,用于控制在达到配置的循环limit时如何处理(issue #4562)。默认执行会失败,但把该选项设为PASS可以改变这一行为。例如下面的循环运行十次后继续执行:
*** Test Cases *** WHILE with 'limit' and 'on_limit' WHILE True limit=10 on_limit=PASS Log to console Hello! END Log to console Hello once more!
  • 循环条件现在可省略(issue #4576)。例如上面的循环头可简化为:
WHILE limit=10 on_limit=PASS
  • 新增on_limit_message配置选项,用于设置在循环超过 limit 而失败时使用的消息(issue #4575)。
  • 修复了 teardown 中循环 limit 失效的 bug(issue #4744)。

在源码 src/robot/running/bodyrunner.py 中可以看到,on_limit接受PASS/FAIL两个值,on_limit_message用于自定义失败消息,limit 支持迭代次数限制与时长限制两种形态。

FOR IN ZIP循环长度不匹配行为可配置

Robot Framework 的FOR IN ZIP循环行为类似 Python 的zip函数:列表长度不一致时,较长列表中多余的元素会被忽略。例如下面的循环只执行两次:

*** Variables *** @{ANIMALS} dog cat horse cow elephant @{ELÄIMET} koira kissa *** Test Cases *** Example FOR ${en} ${fi} IN ZIP ${ANIMALS} ${ELÄIMET} Log ${en} is ${fi} in Finnish END

这种默认行为在遍历自动化系统返回的条目时可能引发问题。例如下面的测试,只要Get something返回的条目与期望值匹配,无论返回多少项都会通过——如果前三个匹配,哪怕返回十项也会成功;更糟的是,即使Get something什么都没返回,测试也会通过:

*** Test Cases *** Example Validate something expected 1 expected 2 expected 3 *** Keywords **** Validate something [Arguments] @{expected} @{actual} = Get something FOR ${act} ${exp} IN ZIP ${actual} ${expected} Validate one thing ${act} ${exp} END

这很糟糕,因为它可能造成"自动化成功但其实什么都没做"的假阳性。Python 自身也有同样的问题,Python 3.10 为zip增加了可选参数strict;此外 Python 长期提供独立的zip_longest函数,会遍历所有值并可能为较短列表补值。

为支持与 Python 相同的特性,Robot Framework 的FOR IN ZIP循环新增了可选的mode配置选项,接受三个值(issue #4682):

  • STRICT:列表长度必须相等,否则执行失败。等价于 Pythonzipstrict=True
  • SHORTEST:较长列表中的元素被忽略。该模式下只要有一个列表耗尽,无限长的列表也被支持。这是当前的默认行为。
  • LONGEST:最长列表决定迭代次数。较短列表缺失的值用fill选项指定的值填充,未指定时用None。等价于 Python 的zip_longest(区别是它用fillvalue参数而非fill)。

所有模式示例如下:

*** Variables *** @{CHARACTERS} a b c d f @{NUMBERS} 1 2 3 *** Test Cases *** STRICT mode [Documentation] This loop fails due to lists lengths being different. FOR ${c} ${n} IN ZIP ${CHARACTERS} ${NUMBERS} mode=STRICT Log ${c}: ${n} END SHORTEST mode [Documentation] This loop executes three times. FOR ${c} ${n} IN ZIP ${CHARACTERS} ${NUMBERS} mode=SHORTEST Log ${c}: ${n} END LONGEST mode [Documentation] This loop executes five times. ... On last two rounds `${n}` has value `None`. FOR ${c} ${n} IN ZIP ${CHARACTERS} ${NUMBERS} mode=LONGEST Log ${c}: ${n} END LONGEST mode with custom fill value [Documentation] This loop executes five times. ... On last two rounds `${n}` has value `-`. FOR ${c} ${n} IN ZIP ${CHARACTERS} ${NUMBERS} mode=LONGEST fill=- Log ${c}: ${n} END

该增强让启用严格校验、避免假阳性变得容易。但默认行为仍存在隐患,官方计划在未来把默认值改为STRICT;希望继续使用SHORTEST模式的用户需要显式启用它。仓库源码 src/robot/running/bodyrunner.py 中实现了这三种模式:LONGESTitertools.zip_longest并支持fill值,STRICT先校验各列表长度,未设置模式时保持原有zip行为;同时运行时会给出警告,提示FOR IN ZIP默认模式将在 Robot Framework 8.0 中从SHORTEST改为STRICT

新的伪日志级别CONSOLE

测试或任务运行期间,经常需要向控制台输出日志。部分关键字开箱即用地支持此功能,也有独立的Log To Console关键字。新的CONSOLE伪日志级别(issue #4536)为任何接受日志级别的关键字(如 Collections 库的Log List、SeleniumLibrary 的Page Should Contain)都加上了这种能力。使用该级别时,消息会同时输出到控制台和以INFO级别写入日志文件。在源码 src/robot/api/logger.py 中,LOGLEVEL字面量类型已包含CONSOLE,且映射为logging.INFO级别;src/robot/libraries/BuiltIn.py 中Log关键字的文档也明确说明了HTMLCONSOLE两个伪级别。

运行多套件时可配置虚拟根套件

执行多个套件(如robot first.robot second.robot)时,Robot Framework 会创建一个包含被执行套件作为子套件的虚拟根套件。此前该虚拟套件只能通过--name等命令行选项配置,如今可以使用普通的套件初始化文件(__init__.robot)来配置(issue #4015)。如果调用中包含初始化文件:

robot __init__.robot first.robot second.robot

根套件将基于其中包含的数据进行配置。该增强最重要的作用是:可以为虚拟根套件指定套件 setup 与 teardown——这在以前完全不可能。

异步函数与方法可作为关键字

如今可以像普通函数一样,把用async def创建的异步函数用作关键字(issue #4089)。例如下面的异步函数可作为关键字Gather SomethingAsync Sleep

from asyncio import gather, sleep async def gather_something(): print('start') await gather(something(1), something(2), something(3)) print('done') async def async_sleep(time: int): await sleep(time)

zipapp兼容性

Robot Framework 6.1 兼容zipapp(issue #4613)。这使得可以仅使用zipapp模块、或借助 PDM 等外部打包工具创建独立分发。

Python 3.12 兼容性

Python 3.12 计划于 2023 年 10 月发布,其中包含一项影响 Robot Framework Python 求值逻辑的 tokenization 细微变更(当使用特殊的$var语法时)。该问题已修复,Robot Framework 6.1 在其他方面也与 Python 3.12 兼容(issue #4771)。

向后不兼容变更(Backwards incompatible changes)

官方总体尽量避免向后不兼容的变更,尤其在非主版本中;但有些特性与修复无法完全向后兼容。这些变更不应在正常使用中引发问题,但尤其使用 Robot Framework 的工具可能受到影响。

output.xml 的变更

语法错误(如无效设置[Setpu]或放错位置的END)如今能得到更好的报告(issue #4683)。该变更的一部分是把无效构造存储为 output.xml 中的<error>元素。以遍历全部元素方式处理 output.xml 的工具需要把<error>元素纳入考虑,但仅用 xpath 表达式或其他方式查询信息的工具一般不受影响。

另一项变更是:FOR IN ENUMERATE循环的<for>元素可能获得start属性(issue #4684),FOR IN ZIP循环可能获得modefill属性(issue #4682)。这会影响处理所有可能属性的工具,不过这类工具应当非常罕见。

TestSuite模型结构的变更

前述为更好处理无效语法所做的增强(issue #4683)也要求修改TestSuite模型结构。语法错误如今以Error对象表示,可能出现在TestCaseKeyword及其他此类模型对象的body中。与TestSuite结构交互的工具应把Error对象纳入考虑,而使用 visitor API 的工具通常不受影响。

另一相关变更是:doctagstimeoutteardown属性已从robot.running.Keyword对象移除(issue #4589)。它们是被意外遗留的,Robot Framework 自身从未使用。访问这些属性的工具需要更新。

最后,TestSuite.source属性如今是pathlib.Path实例,而非字符串(issue #4596)。该变化在 src/robot/model/testsuite.py 的 setter 中体现:非Path值会被自动包装为Path

Parsing 模型的变更

无效的区段标题(如*** Bad ***)如今在 parsing 模型中表示为InvalidSection对象,此前它们是通用的Error对象(issue #4689)。

新的ReturnSetting对象作为Return的别名被引入。这暂时不改变任何行为,但未来Return将用于其他用途,使用它的工具应改用ReturnSetting(issue #4656)。

使用--suite选项时不再排除文件解析

此前使用--suite选项时,不匹配指定套件名的文件会整个被排除在解析之外。这个性能优化在较大套件结构中很方便,但必须移除(issue #4688),因为新的Name设置(issue #4583)使得无法仅凭文件名得知套件名。受此变更影响的用户可以使用新的--parseinclude选项,显式指定要解析哪些文件(issue #4687)。

Libdoc spec 文件的变更

Libdoc 此前不能正确处理list[int]这类参数化类型。修复该问题要求在 spec 文件中把嵌套类型信息与顶层类型一起存储。此外,union 类型的处理方式也与之前不同,但普通类型没有变化。JSON spec 文件变化很小,XML spec 文件则需要稍大一些的改动。详见 issue #4538。

参数转换的变更

如果参数有多个类型,Robot Framework 会从左到右尝试用所有类型做参数转换,直到其中一个成功。此前如果某个类型完全无法识别,使用的值会原样返回,不再尝试用剩余类型转换。例如对如下关键字:

def example(arg: Union[UnknownType, int]): ...

Example 42调用时,整数转换不会被执行,关键字拿到的是字符串42。该行为已改为跳过无法识别的类型,上述场景下会执行整数转换(issue #4648),关键字拿到的值变为整数。

另一个参数转换变更是Any类型现在被识别,任何值都被接受且不转换(issue #4647)。该变更大体向后兼容,但在参数带默认值(如arg: Any = 1)的特殊情况下行为有变:此前Any不被识别,会基于默认值类型做转换;现在Any被识别且明确不转换,因此也不会基于默认值做转换。可通过arg: Union[int, Any] = 1规避行为变化——这本身也是更好的类型标注方式。

影响执行的变更

测试与关键字中的无效设置(如[Tasg])如今被视为语法错误,会在执行时导致失败(issue #4683)。此前它们也会被报告,但不影响执行。

资源文件中所有无效区段都被视为语法错误,阻止导入该资源文件(issue #4689)。此前资源文件含*** Test Cases ***标题会引发此类错误,但其他无效标题仅被报告为错误、导入仍成功。

弃用的特性(Deprecated features)

Python 3.7 支持

Python 3.7 将于 2023 年 6 月达到生命周期终点。官方决定 Robot Framework 6.1 及其 bug 修复版本继续支持它,但 Robot Framework 7.0 将不再支持(issue #4637)。此前 Python 3.6(2021 年 12 月 EOL)也以同样方式被弃用,之所以继续支持是因为它是 Red Hat Enterprise Linux 8 的默认 Python 版本,而 RHEL 8 仍在积极支持期内。

Libdoc spec 文件中的旧元素

Libdoc spec 文件在最近几个版本中持续增强。为向后兼容,旧信息被保留,但所有这些数据将在 Robot Framework 7.0 中移除。详见 issue #4667。

其他弃用特性

  • Parsing 模型中的Return节点已弃用,应改用ReturnSetting(issue #4656)。
  • TestSuite.from_modelname参数已弃用,未来将移除(issue #4598)。
  • robot.utils.timestr_to_secsaccept_plain_values参数已弃用,未来将移除(issue #4522)。

完整修复与增强列表

6.1 里程碑共包含74 个 issue,覆盖 enhancement 与 bug 两类。除上文详述的重点功能外,其余值得关注的高优先级与中优先级条目包括:

critical 级(5 项):外部 Parser API(#1283,beta 1 加入)、可执行套件序列化为 JSON(#3902,alpha 1)、用户关键字混合嵌入式与普通参数(#4234,alpha 1)、Python 3.12 兼容(#4771,rc 1)。

high 级(14 项):使用list[int]等泛型且传入对象而非字符串时条目不转换的 bug 修复(#4705)、WHILE limit 在 teardown 中失效的修复(#4744)、支持用__init__.robot配置多套件运行的虚拟套件(#4015)、支持异步函数/方法作为关键字(#4089)、自定义转换器可访问库(#4510)、JSON 变量文件支持(#4532)、新增CONSOLE伪日志级别(#4536)、支持列表/字典项赋值(#4546)、WHILE 达 limit 后可继续执行(#4562)、TestSuite结构类型信息(#4570)、robot:flatten标签(#4584)、zipapp兼容(#4613)、弃用 Python 3.7(#4637)、FOR IN ZIP长度行为可配置(#4682)。

medium 级(25 项):Libdoc 参数化类型(#4538)、跳过所有测试时仍执行套件 setup/teardown 的修复(#4571)、移除robot.running.Keyword未用属性(#4589)、Run Keyword执行的关键字缺少 source 信息(#4604)、Python 3.11 及更早版本None默认值转换不一致(#4626)、Windows 上Dialogs无焦点(#4635)、参数转换遍历所有可能类型(#4648)、Documentation.from_params(...).value失效(#4670)、Windows 上 User Guide 生成损坏(#4680)、parsing 模型无效区段表示(#4689)、ELSE IF条件未传给 listeners(#4692)、id属性访问可能抛ValueError(#4695)、嵌套变量解析错误(#4716)、HTML 输出返回导航失效(#4754)、跳过测试内失败关键字未展开(#4756)、Dictionaries Should Be Equal支持忽略键(#2717)、--include/--exclude选择测试性能增强(#3579)、解析期错误检测增强(#4210)、支持带连字符的长命令行选项如--pre-run-modifier(#4547)、动态库 API 可选类型化基类(#4567)、listener API 可选类型化基类(#4568)、visitor API 类型信息(#4569)、WHILEon_limit_message选项(#4575)、WHILE 条件可省略(#4576)、Name设置自定义套件名(#4583)、TestSuite.from_string方法(#4601)、关键字冲突先按搜索顺序解决(#4609)、Any显式转换器不做转换(#4647)、动态 API 支持仅位置参数(#4660)、查询是否运行中/是否 dry-run 的公共 API(#4666)、$var语法建议(#4676)、日志中语法错误更好报告(#4683)、FOR IN ENUMERATE起始索引解析期处理(#4684)、限制解析文件的命令行选项(#4687)、--suite不再排除文件(#4688)、文档中保留前导与内部空格(#4729)、parsing API 类型提示(#4740)、结果对象新增前向兼容的start_time/end_time/elapsed_time属性(#4765)、自动解析.robot.rst文件(#4777)、支持仅接受*varargs的自定义转换器(#4627)。

low 级(15 项):部分单测无法独立运行(#4611)、Dialogs对话框不居中且最小尺寸过小(#4634)、裸Union注解处理不当(#4638)、空元组()注解的错误消息不佳(#4646)、BuiltIn.Log文档缺陷(#4663)、文档中反斜杠换行可能形成\n转义序列(#4736)、Process 库Split/Join Command Linepathlib.Path对象配合问题(#4749)、Libdoc 未检测到文档格式时崩溃(#4780)、Libdoc 的TypedDict类型信息未列出Mapping(#4781)、弃用timestr_to_secsaccept_plain_values(#4522)、TestSuite.source改为pathlib.Path(#4596)、弃用TestSuite.from_modelname参数(#4598)、Dialogs绑定Enter键到OK按钮(#4619)、对话框按钮获得键盘快捷键(#4636)、弃用 parsing 模型Return节点(#4656)、NormalizedDict增加__repr__()(#4709)。

致谢与开发背景

Robot Framework 的开发由 Robot Framework Foundation 及其 60 多家成员组织赞助。6.1 团队由基金会资助的 Pekka Klärck 与 Janne Härkönen(兼职)组成,同时社区贡献了大量工作:@Serhiy1TestSuite结构补充类型信息(#4570);@Vincema实现带连字符的长命令行选项(#4547)与列表/字典项赋值(#4546);@sunday2实现 JSON 变量文件支持(#4532)并修复 Windows 上 User Guide 生成(#4680);Tatu Aalto 为动态库 API 增加仅位置参数支持(#4660);@otemek用新的Name设置实现套件自定义命名(#4583);@franzhaas让 Robot Framework 兼容zipapp(#4613);Ygor Pontelo 支持异步函数/方法作为关键字(#4089);@ursa-h增强关键字冲突解决使库搜索顺序优先级更高(#4609);Jonathan Arns 与 Fabian Zeiher 实现限制解析文件范围的初始版本(#4687);@asaout为 WHILE 循环增加on_limit_message(#4575);@turunenm实现CONSOLE伪日志级别(#4536);Yuri Verweij 增强Dictionaries Should Be Equal支持忽略键(#2717)。

升级建议小结

对普通用户:重点关注robot:flatten标签、WHILE 的on_limit/on_limit_messageFOR IN ZIPmode选项、JSON 变量文件与CONSOLE伪日志级别,这些都能直接改善日常测试脚本的质量与可维护性;同时注意无效设置如今会在执行时报错、TestSuite.source变为pathlib.Path等行为变化。对工具与库开发者:JSON 套件序列化(.rbt)、外部 Parser API、公共 API 类型信息、--parseinclude选项以及 output.xml/模型结构的调整是升级重点,建议在升级前核对本文"向后不兼容变更"一节所列条目,并在仓库的 atest、utest 目录中寻找对应测试用例验证自身工具的兼容性。

【免费下载链接】robotframeworkGeneric automation framework for acceptance testing and RPA项目地址: https://gitcode.com/gh_mirrors/ro/robotframework

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

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

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

立即咨询