ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Robot Framework 6.1 Alpha 1 技术详解:JSON 数据格式、执行期扁平化与 FOR IN ZIP 新模式

Robot Framework 6.1 Alpha 1 技术详解:JSON 数据格式、执行期扁平化与 FOR IN ZIP 新模式 Robot Framework 6.1 Alpha 1 技术详解JSON 数据格式、执行期扁平化与 FOR IN ZIP 新模式【免费下载链接】robotframeworkGeneric automation framework for acceptance testing and RPA项目地址: https://gitcode.com/gh_mirrors/ro/robotframework本文基于 Robot Framework 官方 6.1 alpha 1 发布说明doc/releasenotes/rf-6.1a1.rst系统梳理该版本引入的核心新特性与破坏性变更。读者将掌握如何用TestSuite.to_json/from_json在进程与机器间传递测试套件、如何通过robot:flatten标签在执行期压缩 output.xml、FOR IN ZIP的mode配置如何避免自动化假阳性以及 6.1 中所有面向工具开发者的 API 变化为升级兼容性评估提供完整依据。Robot Framework 6.1 alpha 1 于 2023 年 3 月 17 日发布是一个以 JSON 数据格式为核心的新特性版本同时包含所有计划中的破坏性变更backwards incompatible changes与弃用特性deprecated features。该 alpha 版尤其面向两类人群一是希望抢先测试 JSON 序列化的工具开发者二是需要验证自身测试、任务或工具兼容性的现有用户。本文结合当前仓库源码src/robot与utest对每项特性做源码级印证。安装与版本获取如果你已安装 pip可直接安装最新可用版本含预发布版本pip install --pre --upgrade robotframework或者精确安装此版本pip install robotframework6.1a1也可以从 PyPI 下载源码分发包手动安装其他安装方式参见仓库根目录的 INSTALL.rst。最重要的新特性JSON 数据格式6.1 最大的新特性是支持将测试/任务数据转换为 JSON并可从 JSON 还原issue #3902。该功能面向三类主要使用场景跨进程与跨机器传递套件在一台机器上将套件序列化为 JSON再到另一台机器上重建单文件化持久化把从文件系统构建的套件可能是嵌套套件保存为单个 JSON 文件解析更快替代数据格式为外部工具生成测试或任务提供一种新的数据交换格式。该特性主要面向工具开发者而非普通用户。虽然功能尚未最终定型但以下三件事已经可用1. 使用TestSuite.to_json序列化套件不带参数调用时返回 JSON 字符串也接受一个路径或已打开的文件对象用于写入 JSON同时支持与 JSON 格式化相关的配置选项from robot.api import TestSuite suite TestSuite.from_file_system(path/to/tests) suite.to_json(tests.rbt)从源码看to_json定义在模型基类 src/robot/model/modelobject.py其签名完整支持如下格式化参数默认值与 Python 标准库json不同fileNone返回字符串、已打开的文件对象、或pathlib.Path/字符串路径以 UTF-8 编码写入ensure_asciiFalse是否保证输出全 ASCIIindent0缩进空格数separators(,, :)自定义分隔符。实现上先通过to_dict()把模型对象转换为字典再由内部JsonDumper序列化。反向路径from_dict则通过cls().config(**data)重建对象。2. 使用TestSuite.from_json重建套件from robot.api import TestSuite suite TestSuite.from_json(tests.rbt)from_json见 src/robot/model/modelobject.py同时支持 JSON 字符串与 JSON 文件路径。有一个需要注意的细节如果传入的是字符串且包含{字符会被判定为 JSON 数据若路径本身含{请改用pathlib.Path实例传入。数据先经JsonLoader加载为字典再调用from_dict创建对象。3..rbt文件自动解析使用robot命令正常运行时会自动解析.rbt扩展名的 JSON 文件包括robot tests.rbt直接运行单个文件以及运行包含.rbt文件的目录。仓库源码提供了配套的套件构建入口TestSuite.from_file_system、TestSuite.from_model以及 6.1 新增的TestSuite.from_string见 src/robot/running/model.py三者均可通过配置项控制解析行为方便工具开发者以多种数据源构造套件再统一导出为 JSON。用户关键字同时使用嵌入参数与普通参数从 6.1 起用户关键字可以混合使用嵌入参数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}.目前该能力仅对用户关键字生效若社区有需求后续版本可扩展到库关键字。仓库验收测试位于 atest/robot/keywords/embedded_arguments.robot 附近的相关用例。执行期扁平化关键字结构robot:flatten标签嵌套的关键字结构尤其是递归调用与 WHILE/FOR 循环会让日志文件层级复杂难读同时显著增大 output.xml 体积。例如一个简单关键字*** Keywords *** Keyword Log Robot Log Framework在 output.xml 中会生成这样一段内容kw nameKeyword kw nameLog libraryBuiltIn argRobot/arg docLogs the given message with the given level./doc msg timestamp20230103 20:06:36.663 levelINFORobot/msg status statusPASS starttime20230103 20:06:36.663 endtime20230103 20:06:36.663/ /kw kw nameLog libraryBuiltIn argFramework/arg docLogs the given message with the given level./doc msg timestamp20230103 20:06:36.663 levelINFOFramework/msg status statusPASS starttime20230103 20:06:36.663 endtime20230103 20:06:36.664/ /kw status statusPASS starttime20230103 20:06:36.663 endtime20230103 20:06:36.664/ /kw此前已有--flattenkeywords命令行选项用于扁平化此类结构关键字被扁平化后其子关键字与控制结构被移除但所有消息msg元素得以保留。--flattenkeywords不影响执行时生成的 output.xml而是在解析 output.xml 时执行扁平化可节省大量内存配合 Rebot 使用时还能生成新的扁平化 output.xml。例如上述结构用--flattenkeywords扁平化Keyword后变为kw nameKeyword doc_*Content flattened.*_/doc msg timestamp20230103 20:06:36.663 levelINFORobot/msg msg timestamp20230103 20:06:36.663 levelINFOFramework/msg status statusPASS starttime20230103 20:06:36.663 endtime20230103 20:06:36.664/ /kw从 6.1 起issue #4584同样的扁平化可以在执行期间完成且无需命令行选项只需给关键字打上robot:flatten标签*** Keywords *** Keyword [Tags] robot:flatten Log Robot Log Framework此时 output.xml 的结果为kw nameKeyword tagrobot:flatten/tag msg timestamp20230317 00:54:34.772 levelINFORobot/msg msg timestamp20230317 00:54:34.772 levelINFOFramework/msg status statusPASS starttime20230317 00:54:34.771 endtime20230317 00:54:34.772/ /kwrobot:flatten相比--flattenkeywords的核心优势是在执行期间就生效直接产出更小的 output.xml 文件而--flattenkeywords的配置选项更丰富支持for|while|iteration|name:pattern|tag:pattern等匹配方式见 src/robot/rebot.py 与 src/robot/conf/settings.py 中的校验逻辑robot:flatten后续可根据需求增强。源码层面执行器在 src/robot/output/outputfile.py 中通过检测结果的tags.robot(flatten)来维护一个flatten_level计数器从而在写入时决定是否省略子关键字细节。自定义参数转换器可访问库实例自定义参数转换器custom argument converters自 5.0 引入issue #4088后被证明非常实用。6.1 增强为转换器可以轻松访问到包含所调用关键字的库library对象从而基于库的状态完成转换issue #4510。做法很简单——创建一个接受两个参数的转换器即可第一个参数是数据中的原始值与以前完全一致第二个是库实例或模块def converter(value, library): ...只接受一个参数的转换器继续按原方式工作未来也没有强制改造它们的计划。源码层面src/robot/running/arguments/customconverters.py 的ConverterInfo.for_converter会解析转换器的参数规格当spec.minargs 2或存在可变位置参数*args时设置pass_libraryTrue随后convert方法在持有 library 时调用self.converter(value, self.library.instance)否则回退为self.converter(value)。同时该校验器限制转换器最多只能有两个必需参数且不允许必需的 keyword-only 参数保证两参数约定的规范性。JSON 变量文件支持长期以来变量文件除了 Python 之外还支持 YAML6.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变量文件导入器根据扩展名分派——.yaml/.yml走YamlImporter.json走JsonImporter其余走PythonImporter。JsonImporter._import同文件 L130-L136要求 JSON 顶层必须是映射mapping否则抛出DataError提示 JSON variable file must be a mapping。变量文件支持与 JSON 变量文件相关的验收测试可参考 atest/robot/variables/json_variable_file.robot。新增CONSOLE伪日志级别测试或任务运行时常常需要向控制台输出日志。部分关键字开箱即用支持此外还有独立的Log To Console关键字。6.1 新增的CONSOLE伪日志级别issue #4536把这种能力扩展到任何接受日志级别的关键字例如 Collections 库的Log List和 SeleniumLibrary 的Page Should Contain。使用该级别时消息会同时写入控制台和日志文件日志文件中以INFO级别记录。源码佐证在 src/robot/api/logger.py 中LOGLEVEL类型包含CONSOLE其映射与HTML一样落到logging.INFO内置库文档src/robot/libraries/BuiltIn.py也明确说明CONSOLE与HTML均以 INFO 记录且Log关键字支持consoleyes或CONSOLE级别两种等价写法。若消息不应写入日志文件或需要特殊格式则仍应使用Log To Console。多套件运行时配置虚拟根套件执行多个套件如robot first.robot second.robot时Robot Framework 会创建一个包含这些子套件的虚拟根套件virtual root suite。此前只能用--name等命令行选项配置它6.1 起可以在调用中加入普通的套件初始化文件__init__.robot来完成配置issue #4015robot __init__.robot first.robot second.robot根套件将基于该初始化文件中的数据完成配置。这一增强最重要的价值是可以为根套件指定套件级 setup 和 teardown这在以前完全不可能。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} ENDPython 本身有同样问题Python 3.10 为zip新增了可选参数strict见 PEP 618且长期提供itertools.zip_longest可遍历所有值并对较短列表补值。为对齐 Python 能力Robot Framework 的FOR IN ZIP新增可选的mode配置项issue #4682接受三个值STRICT各列表长度必须一致否则执行失败。等价于 Pythonzip(strictTrue)SHORTEST较长列表的多余元素被忽略只要有一个列表耗尽即结束此模式支持无限长列表。这是当前默认行为LONGEST由最长列表决定迭代次数较短列表缺失的值用fill选项指定的值补齐未指定则为None。等价于 Python 的zip_longest区别是 Robot 用fill而非fillvalue。以下示例展示了全部三种模式*** 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} modeSTRICT Log ${c}: ${n} END SHORTEST mode [Documentation] This loop executes three times. FOR ${c} ${n} IN ZIP ${CHARACTERS} ${NUMBERS} modeSHORTEST 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} modeLONGEST 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} modeLONGEST fill- Log ${c}: ${n} END源码层面FOR 循环模型对象在 src/robot/model/control.py 中新增了mode与fill槽位to_dict仅在值非None时输出对应字段保证旧格式兼容。该增强让严格校验易于启用、避免假阳性但默认行为SHORTEST仍存在问题官方计划在Robot Framework 7.0中将默认值改为STRICT希望继续使用SHORTEST的用户需要显式声明。向后不兼容的变更6.1 在非大版本中尽量规避破坏性变更但仍有部分特性与修复不完全向后兼容。这些变更在正常使用中不应造成问题但使用 Robot Framework 的工具尤其可能受影响。output.xml 的变化语法错误如无效设置[Setpu]、错位的END现在能被更好地报告issue #4683。作为变更的一部分无效结构以error元素存储进 output.xml。遍历所有元素处理 output.xml 的工具需要把error元素纳入考虑而仅用 xpath 表达式等查询信息的工具一般不受影响。另一处变化是FOR IN ENUMERATE循环的for元素可能带start属性issue #4684FOR IN ZIP循环的for元素可能带mode与fill属性issue #4682。这会影响到处理所有属性的工具但此类工具应当极为罕见。TestSuite模型结构的变化为更好地处理无效语法issue #4683模型结构也做了相应调整语法错误现在以Error对象表示可能出现在TestCase、Keyword等模型对象的body中。与TestSuite结构交互的工具应把Error对象纳入考虑但使用 visitor API 的工具一般不受影响。另一相关变化robot.running.Keyword对象的doc、tags、timeout、teardown属性被移除issue #4589。这些属性是历史遗留、Robot Framework 自身并未使用访问它们的工具需要更新。最后TestSuite.source属性现在是pathlib.Path实例而非字符串issue #4596。解析模型parsing model的变化无效的节头如*** Bad ***现在以InvalidSection对象表示此前是通用的Error对象issue #4689。同时引入了新的ReturnSetting对象作为Return的别名issue #4656。目前尚未改变任何行为但未来Return将用于其他用途使用Return的工具应迁移到ReturnSetting。Libdoc 规范文件的变化此前 Libdoc 不能正确处理list[int]这类参数化类型。修复该问题需要在规范文件中把嵌套类型信息与顶层类型一并存储issue #4538。除参数化类型外联合类型unions的处理方式也有变化但普通类型无变化JSON 规范文件改动较小XML 规范文件改动较大具体改动细节见 issue #4538 的评论。参数转换的变化如果一个参数有多个类型Robot Framework 会从左到右依次尝试用所有类型做参数转换直到其中一个成功。此前若某个类型完全无法识别则直接原样返回该值不再尝试剩余类型。例如def example(arg: Union[UnknownType, int]): ...若以Example 42调用之前整数转换根本不会尝试关键字拿到的是字符串42。现在改为跳过无法识别的类型继续尝试因此上述场景会执行整数转换issue #4648关键字拿到的值变成整数——这显然改变了传入值。另一处参数转换变化Any类型现在被显式识别任何值都不做转换即被接受issue #4647。该变化基本向后兼容但有一种特殊情况当参数带默认值且类型为Any如arg: Any 1时行为会变。之前Any不被识别会基于默认值类型尝试转换现在Any被识别且明确不做转换因此也不再基于默认值类型转换。若想避免行为变化可用arg: Union[int, Any] 1这在类型标注上也更规范。影响执行的变化测试和关键字中的无效设置如[Tasg]现在被视为语法错误并在执行时导致失败issue #4683。此前它们也会被报告但不影响执行。资源文件中的所有无效节都被视为阻止导入该资源文件的语法错误issue #4689。此前资源文件中出现*** Test Cases ***节头会报错但其他无效节头仅作为错误报告、导入仍可成功。弃用的特性Python 3.7 支持Python 3.7 将于 2023 年 6 月到达生命周期终点end-of-life。Robot Framework 决定在 6.1 及后续 6.x 版本中继续支持它但7.0 将不再支持issue #4637。这与此前 Python 3.6 的处理方式一致3.6 已于 2021 年 12 月弃用原因是它是仍受积极支持的 Red Hat Enterprise Linux 8 的默认 Python 版本。Libdoc 规范文件中的旧元素Libdoc 规范文件在近几个版本中持续增强。为向后兼容旧信息仍被保留但所有这些数据将在 Robot Framework 7.0 中移除详见 issue #4667。其他弃用项解析模型中的Return节点已弃用应改用ReturnSettingissue #4656TestSuite.from_model的name参数已弃用未来将移除issue #4598robot.utils.timestr_to_secs的accept_plain_values参数已弃用未来将移除issue #4522。6.1 相关工具开发 API 补充除发布说明重点介绍的特性外从 6.1 的修复与增强清单可以看到一批面向工具开发者的 API 升级为动态库 API 与监听器 API 新增可选的类型化基类issue #4567、#4568、为 visitor API 增加类型信息issue #4569、新增robot.running.TestSuite.from_stringissue #4601、新增公开 API 查询Robot 是否在运行 / 是否处于 dry-run 模式issue #4666、支持带连字符的长命令行选项如--pre-run-modifierissue #4547以及当${var}求值失败时提示改用$var语法issue #4676。这些能力与 JSON 序列化共同构成了 6.1 面向外部工具开发者的完整工具链。小结与升级建议Robot Framework 6.1 alpha 1 的核心收益可以归纳为三点数据交换标准化.rbtJSON 格式打通了套件跨进程、跨机器传输与外部工具生成测试的通路to_json/from_json/from_string形成完整的模型读写 API执行可控性提升robot:flatten在执行期压缩输出体积FOR IN ZIP mode消除了自动化假阳性隐患并预告 7.0 默认改为 STRICT兼容性预警output.xml 新增error元素与for属性、模型对象属性调整、参数转换语义变化都是工具维护者需要优先验证的点。所有计划中的破坏性变更与弃用特性均已包含在本 alpha 版本中建议依赖 Robot Framework 做二次开发的团队尽早用pip install --pre --upgrade robotframework在真实环境中验证兼容性并将反馈提交到 issue tracker以便在 6.1 正式版发布前完成修正。【免费下载链接】robotframeworkGeneric automation framework for acceptance testing and RPA项目地址: https://gitcode.com/gh_mirrors/ro/robotframework创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表