Robot Framework 5.1 Beta 2 版本解析本地化、标签重构与嵌入参数冲突自动解决【免费下载链接】robotframeworkGeneric automation framework for acceptance testing and RPA项目地址: https://gitcode.com/gh_mirrors/ro/robotframeworkRobot Framework 5.1 Beta 2 深度解读本地化机制、标签体系重构与嵌入式参数冲突自动解决本文基于 Robot Framework 5.1 beta 2 发布说明 整理而成。5.1 是 Robot Framework 启动本地化localization工作的特性版本同时引入了标签设置体系重构、嵌入式参数embedded arguments冲突自动解决、continue-on-failure 模式的可关闭开关等多项增强。读完本文你将掌握--language与language:数据内语言配置的完整用法、新旧标签设置Test Tags/Keyword Tags/Force Tags/Default Tags的迁移路径以及 5.1 中关键词命名空间与执行控制的底层变化。版本背景说明Robot Framework 5.1 因新增内容过多最终被重新定级为重大版本major release5.1 beta 2 之后的下一个正式候选版本即为 RF 6.0 rc 1。5.1 beta 2 发布于 2022 年 9 月 21 日星期三。本文描述的功能与行为以该 beta 版本为准部分设置如Force Tags、Default Tags在后续 6.0 中会进入正式弃用流程使用时请留意版本差异。安装与版本获取如果本机已安装 pip可直接安装最新可用预发布版本pip install --pre --upgrade robotframework如需精确安装 5.1 beta 2 这个版本pip install robotframework5.1b2也可以从 PyPI 下载源码发行包手动安装。更完整的安装方式参见仓库根目录的 INSTALL.rst。注意--pre参数用于安装预发布版本正式环境仍建议使用稳定版本。本地化Localization让 Robot Framework 说你的语言可翻译的内容范围Robot Framework 5.1 启动本地化工作使数据文件中使用的各类标记可以被翻译。目前支持翻译的内容包括表格标题header例如Test Cases设置项名称setting例如DocumentationBDD 场景中使用的Given/When/Then前缀布尔参数转换中使用的 true / false 字符串如True/False。未来的版本可能进一步支持翻译IF/FOR等语法、日志与报告内容、错误消息等。也就是说当前本地化覆盖的是数据标记层而非语法关键字与运行期输出。命令行指定语言--language语言通过命令行选项--language在启动执行时指定。--language接受语言代码或语言名称例如robot --language fi tests.robot robot --language Finnish tests.robot也可以指定自定义语言文件的路径或模块名详见下文自定义语言文件一节robot --language MyLang.py tests.robot需要同时支持多种语言时--language可以多次使用robot --language de --language uk tests.robot从源码看--language在 src/robot/run.py 中被定义为可重复选项其值最终汇集到 src/robot/conf/settings.py 中的Language配置项并由Languages类统一加载与合并见 src/robot/conf/languages.py 中Languages.__init__的add_englishTrue默认行为——即使指定了其他语言英语也会被自动附加保证英文标记始终可用。数据文件内指定语言language:语法除了命令行还可以在数据文件首个表格之前使用language: lang语法按文件指定语言其中lang是语言代码或名称language: fi *** Asetukset *** Dokumentaatio Example using Finnish.上面的示例中*** Asetukset ***设置表和Dokumentaatio说明设置都是芬兰语标记对应英文的*** Settings ***与Documentation。注意出于技术原因这种按文件的语言配置也会影响后续文件的解析该行为未来可能改变不应依赖。要么在每个解析的文件中都写language: lang要么统一用命令行指定语言。内置语言列表Robot Framework 5.1 beta 2 除英语自动支持外内置支持以下语言语言代码波斯尼亚语 BosnianBS捷克语 CzechCS荷兰语 DutchNL芬兰语 FinnishFI法语 FrenchFR德语 GermanDE波兰语 PolishPL葡萄牙语 PortuguesePT巴西葡萄牙语 Brazilian PortuguesePT-BR俄语 RussianRU简体中文 Simplified ChineseZH-CN西班牙语 SpanishES泰语 ThaiTH土耳其语 TurkishTR乌克兰语 UkrainianUK这些翻译全部由社区提供。如果你希望贡献新的语言翻译可在 Crowdin 平台robotframework.crowdin.com 的 robot-framework 项目协作相关讨论可加入官方 Slack 的#localization频道。源码视角语言是如何被加载与合并的语言机制的核心实现在 src/robot/conf/languages.pyLanguage是语言定义的基类通过类属性声明settings_header、test_cases_header、given_prefixes、true_strings、false_strings等翻译映射。语言代码由类名推导如PtBr→pt-BR语言名称取自类 docstring 的第一行见Language.code与Language.name两个classproperty。每种内置语言Cs、Nl、Bs、Fi、Fr、De、PtBr、Pt、Th、Pl、Uk、Es、Ru、ZhCn、ZhTw、Tr等都是Language的子类。例如芬兰语类Fi的 docstring 为 Finnish代码推导为fi简体中文类ZhCn的代码推导为zh-CN其given_prefixes [假定]、when_prefixes [当]、then_prefixes [那么]。Languages负责存储多种语言并统一翻译headers、settings、bdd_prefixes、true_strings、false_strings会以集合/字典形式合并_add_language方法因此可以同时叠加多种语言。BDD 前缀匹配通过bdd_prefix_regexp属性构造正则表达式实现各语言前缀以|连接后编译见 src/robot/conf/languages.py 中bdd_prefix_regexp属性且要求前缀后必须有空格——这正是 5.1 向后不兼容变更中BDD 前缀后必须加空格issue #4379的源码体现。布尔转换的 true/false 字符串是集合化的true_strings默认含True、1false_strings默认含False、0、None、空字符串叠加语言翻译后如简体中文的真/假、是/否、开/关、空参与 Boolean 参数转换。自定义语言文件如果内置语言不满足需求可以创建自定义语言文件Python 模块其中定义Language的子类然后通过--language MyLang.py或--language MyLang模块名加载。Languages.add_language/_import_language_module会使用Importer导入该模块并通过inspect.getmembers收集模块内所有Language的非抽象子类src/robot/conf/languages.py 中_import_language_module与is_language过滤逻辑。标签体系重构Test Tags、Keyword Tags与弃用路线新设置Keyword Tags5.1 新增Keyword Tags设置可以为某个文件中的所有关键字统一设置标签issue #4373。该设置在资源文件以及测试用例/用例集初始化文件suite initialization files中都有效用于初始化文件时只影响该文件内的关键字不会向下传播到低层级的用例集。*** Settings *** Keyword Tags smoke slow *** Keywords *** Example Keyword Log This keyword gets tags smoke and slow.Force Tags更名为Test TagsForce Tags设置被重命名为Test Tagsissue #4368动机是让与测试相关的设置命名更一致Test Setup、Test Timeout、Test Tags……同时更好地区分测试标签与关键字标签设置一致的命名也有利于翻译工作。旧的Force Tags仍然有效但已被标记为未来弃用。创建任务RPATask 模式时可以使用Task Tags作为Test Tags的别名。这一点在 src/robot/conf/languages.py 的En类中有体现test_tags_setting Test Tags、task_tags_setting Task Tags、keyword_tags_setting Keyword Tags三者并存且映射到同一内部标识。Default Tags也进入弃用流程为简化标签设置Default Tags设置同样将被弃用。它提供的功能给部分而非全部测试设置标签未来将由[Tags]设置配合-tag语法实现在[Tags]中写-tag表示该测试不应获得标签tag。该语法未来也会与新的Keyword Tags配合使用详见 issue #4374。需要说明的是在 5.1 beta 2 中上述弃用尚无可见的弃用警告警告将从 Robot Framework 6.0 开始发出最终移除这些设置issue #4368。嵌入式参数Embedded Arguments关键词的两大增强冲突自动解决选择最佳匹配使用嵌入式参数时一个调用常常匹配多个关键词实现。例如下面例子中Execute ls with -lh同时匹配两个关键词*** Test Cases *** Automatic conflict resolution Execute ls Execute ls with -lh *** Keywords *** Execute ${cmd} Log Running command ${cmd}. Execute ${cmd} with ${opts} Log Running command ${cmd} with options ${opts}.此前出现此类冲突时执行会因存在多个匹配关键词而失败5.1 起 Robot Framework 会尝试找出最佳匹配并使用它issue #4454。在上面的例子中Execute ${cmd} with ${opts}被认为是比更通用的Execute ${cmd}更好的匹配因此示例可以成功执行。但仍有无法判定唯一更优匹配的情况此时冲突无法自动解决执行会像以前一样失败。从源码看该逻辑位于 src/robot/running/namespace.py关键词解析时会调用_select_best_matches在多个匹配中挑选最佳结合_prioritize_same_file_or_public的同文件优先/公开优先筛选从而让更具体的嵌入式模式胜出。Run Keyword系列不再把参数强制转成字符串另一个与嵌入式参数相关的增强当通过Run Keyword或其变体调用嵌入式参数关键词时参数不再总是被转换为字符串issue #1595。这允许传递包含其他值如对象、列表等的变量作为参数增强了动态调用的灵活性。该问题同时也带来了一个向后不兼容的变化BuiltIn.run_keyword()现在会在要执行的关键词名称中自行解析变量而此前是由 Robot Framework 在调用该关键词之前解析见向后不兼容变更一节。关键词命名空间Keyword Namespaces增强私有关键词robot:private标签资源文件中的关键词可以通过添加robot:private标签标记为私有issue #430。若该关键词被同文件之外的关键词调用会发出警告这些私有关键词也会从 Libdoc 生成的 HTML 库文档中排除。*** Keywords *** Internal helper [Tags] robot:private Log Only callable from the same file.源码支撑KeywordImplementation.private属性判断关键词标签中是否含robot命名空间下的private标签src/robot/running/keywordimplementation.py 中private属性命名空间解析时会把私有关键词从候选集中剔除src/robot/running/namespace.py 中_prioritize_same_file_or_public的matches [kw for kw in keywords if not kw.private]而 src/robot/running/userkeywordrunner.py 会在调用私有关键词时触发警告实际警告信息由 src/robot/running/context.py 的warn_on_invalid_private_call生成。同文件关键词优先于导入关键词如果某关键词与其调用者位于同一资源文件则优先使用它即使其他资源文件中存在同名关键词issue #4366。此前这种情况会导致冲突。这正对应_prioritize_same_file_or_public中的逻辑parent_source与调用者源文件相同的关键词matches优先返回。已弃用的旧行为如果关键词存在于资源文件中且与调用者同文件但同时测试用例文件中也有同名关键词那么目前仍按旧行为优先使用测试用例文件中的关键词该行为已被标记为弃用未来本地关键词在这些场景中也将获得最高优先级。关闭 continue-on-failure 模式robot:stop-on-failure与robot:recursive-stop-on-failureRobot Framework 默认在出现失败时停止执行关键词或测试用例。例外情况包括teardown、模板templates以及显式启用了 continue-on-failure 模式的场景通过robot:continue-on-failure或robot:recursive-continue-on-failure标签。5.1 新增了在需要时禁用隐式或显式 continue-on-failure 模式的标签issue #4303robot:stop-on-failure停止当前层级的继续执行robot:recursive-stop-on-failure递归地停止继续执行影响嵌套层。从源码看执行上下文 src/robot/running/context.py 的continue_on_failure方法会遍历当前执行栈上的用户关键词与测试最内层index 0优先检查stop-on-failure与continue-on-failure外层检查recursive-stop-on-failure与recursive-continue-on-failure返回值兜底为default or self.in_teardown即 teardown 中默认继续执行。这也印证了文档中的另一个补充说明issue #4404即使 continue-on-failure 模式生效失败的测试 setup 仍会停止执行。Listener API v2start/end_keyword获得控制结构上下文使用 Listener API v2 时start_keyword与end_keyword方法不只用于关键词也用于所有控制结构FOR、IF、WHILE、TRY/EXCEPT等。此前这些方法总是获得完全相同的信息5.1 起控制结构会携带额外的上下文特定信息issue #4335例如在start/end_keyword中可以通过data或result对象的类型字段区分普通关键词与控制结构。相关接口定义可参考 src/robot/api/interfaces.py 中 Listener V2 相关方法签名。执行性能与 Python 版本支持用户关键词执行开销降低issue #4388执行用户关键词的开销被减少尤其是频繁失败场景如使用Wait Until Keyword Succeeds或带TRY/EXCEPT的循环收益明显。Python 3.11 官方支持issue #44015.1 正式支持即将发布的 Python 3.11不兼容点不多因此早期版本在 3.11 上也能基本正常工作。Python 3.6 弃用issue #4295Python 3.6 已于 2021 年 12 月到达生命周期终点。5.1 及所有 RF 5.x 仍支持它但 Robot Framework 6.0 将不再支持建议尽早升级到更新的 Python 版本。向后不兼容变更清单BDD 前缀后必须有空格issue #4379Given/When/Then前缀用于 BDD 场景时前缀与后续文本之间必须留一个空格源码中bdd_prefix_regexp的正则rf({prefixes})\s明确要求前缀后紧跟空白。Collections 字典类关键词要求继承Mappingissue #4413Collections库中字典相关的关键词对传入值更严格要求字典继承Mapping接口。Dictionary Should Contain Item不再先转字符串再比较issue #4408此前该关键词会把值转为字符串后再比较5.1 起直接比较原值。Libdoc 规格文件的生成时间格式变更issue #4262XML 与 JSON 规格文件spec files中的生成时间统一为2022-05-27T19:07:1500:00格式。XML 规格此前用2022-05-27T19:07:15Z与新格式等价JSON 规格此前完全不含时区信息格式为2022-05-27 19:07:15。这一改动是为了支持通过SOURCE_DATE_EPOCH环境变量生成确定性可复现的库文档。BuiltIn.run_keyword()变量解析时机变化issue #1595run_keyword()现在在自身内部解析要执行关键词名称中的变量而此前由 Robot Framework 在调用前解析。这影响以编程方式使用且名称中包含变量或反斜杠的场景该改动是为了配合嵌入式参数关键词与BuiltIn.run_keyword()的协作增强。弃用特性汇总5.1 起标记6.0 起警告弃用项替代方案相关 issueForce Tags设置Test Tags任务场景用Task Tags#4368Default Tags设置[Tags]配合-tag语法#4374[Tags]中-tag形式的字面量标签转义格式\-tag#4380测试用例文件关键词优先于资源文件本地关键词未来本地关键词始终最高优先级#4366库导入别名标记WITH NAMEAS与 Python 一致与TRY/EXCEPT复用同一标记#4371单数表格标题如Test Case复数标题Test Cases#4431嵌入式参数变量值不匹配自定义正则未来校验更严格#4462Python 3.6升级到更新的 Python#4295细节说明WITH NAME改为ASissue #4371为导入库设置别名时使用的WITH NAME标记将更名为AS动机是与 Python 的as保持一致且AS已用于TRY/EXCEPT复用同一标记与内部 token 可简化语法减少标记数量也有利于翻译。5.1 中两者都可用WITH NAME视为弃用可见的弃用警告同样要到 6.0 才发出。源码中两处均已识别WITH NAME与ASsrc/robot/parsing/lexer/settings.py 的库导入解析以及 src/robot/libraries/BuiltIn.py 的Import Library处理src/robot/utils/escaping.py 也将两者列入控制词集合。单数表格标题弃用issue #4431Robot Framework 一直同时接受复数如Test Cases与单数如Test Case表格标题。单数形式自 5.1 起弃用未来将移除支持。嵌入式参数变量不匹配自定义正则issue #4462以变量形式传递嵌入式参数时变量值不会与自定义正则表达式匹配校验这与关键词不应接收其显式不接受的参数相悖为兼容性目前仅弃用未来校验会更严格。文档也指出自定义正则此前常被用来规避嵌入式参数冲突而由于 5.1 已能自动解决冲突#4454这一需求已变小。[Tags]中连字符开头的标签issue #4380因为计划引入-tag语法替代Default Tags功能[Tags]中使用连字符开头的标签如-tag现在被弃用如确需字面量值可使用转义格式\-tag。其他值得关注的增强与修复摘要5.1 beta 2 共包含 52 个 issue 的修复与增强。除上述重点外还有若干高价值变更Get From Dictionary支持默认值issue #4398字典中不存在键时返回指定的默认值。正则相关关键词支持显式flags参数issue #4429允许向正则匹配类关键词传递显式标志。pathlib.Path自动参数转换issue #4461与标准库对Path对象的支持issue #4455。None作为自定义参数转换器以启用严格类型校验issue #4440。YAML 变量文件中列表内的字典会转换为DotDictissue #4418。Get Time修复给定输入时间恰好匹配 epoch 时不再返回当前时间issue #4438。--include/--exclude/--test/--suite空值回归修复issue #4441。Rebot 合并用例集时复制文档与元数据issue #4354。Libdoc 类型提示与 JavaScript 变量/关键词重名问题修复issue #4464、#4471。Keyword Should Exist未找到关键词时性能提升issue #4470通过跳过可能的推荐建议查找实现。对于用户关键词执行性能issue #4353与解析性能issue #4353/#4388社区贡献者 Fabio Zadrozny 与 J. Foederer 等均有代码贡献详见发布说明的鸣谢Acknowledgements部分。升级建议与实操要点翻译功能试用若团队希望使用非英文数据标记可从--language fi等简单场景开始注意language:文件内配置会级联影响后续文件务必每个文件都声明或统一用命令行指定。标签设置迁移新项目直接使用Test Tags与Keyword Tags存量项目尽早从Force Tags/Default Tags迁移避免 6.0 引入弃用警告后被动调整。[Tags]中需要连字符开头标签时改用\-tag转义。嵌入式参数冲突5.1 能自动选择更具体的匹配此前依赖自定义正则规避冲突的写法可以逐步简化但仍需注意变量值不再校验自定义正则这一弃用行为未来校验会收紧。运行环境优先使用 Python 3.75.1 支持 3.11Python 3.6 用户应尽快升级6.0 将不再支持。别名标记库导入别名统一改用ASWITH NAME仅为兼容保留。如需验证上述行为可参考仓库中的相关实现文件src/robot/conf/languages.py、src/robot/running/context.py、src/robot/running/namespace.py、src/robot/running/keywordimplementation.py相关的机器人数据测试用例可查阅 atest/robot/parsing/translations.robot 与 atest/testdata/parsing/translations/ 目录。【免费下载链接】robotframeworkGeneric automation framework for acceptance testing and RPA项目地址: https://gitcode.com/gh_mirrors/ro/robotframework创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考