ARTICLE DETAIL

资讯详情

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

Robot Framework 3.2 版本深度解析:新解析器、@library 装饰器与 inline Python 求值

Robot Framework 3.2 版本深度解析:新解析器、@library 装饰器与 inline Python 求值 测试RPA接口测试【免费下载链接】robotframeworkGeneric automation framework for acceptance testing and RPA项目地址https://gitcode.com/gh_mirrors/ro/robotframework点击查看免费下载本指南以官方发布说明 doc/releasenotes/rf-3.2.rst 为骨架系统梳理 Robot Framework 3.22020 年 4 月 27 日发布的核心增强、向后不兼容变更与弃用特性并结合当前仓库源码src/robot/api/deco.py、src/robot/parsing/、src/robot/variables/evaluation.py深入讲解其实现原理。读完本文你将掌握如何用library与not_keyword精细控制关键字暴露、如何用${{expression}}在测试数据中直接求值 Python 表达式、新解析器带来的语法与文件格式变化以及从 3.1 迁移到 3.2 时必须注意的兼容性清单。注意Robot Framework 3.2 存在两个严重回归regression官方建议所有用户升级到 2020 年 5 月 4 日发布的 Robot Framework 3.2.1。安装方式如果已安装 pip直接运行pip install --upgrade robotframework即可安装最新的稳定版如需精确安装此版本pip install robotframework3.2也可以从 PyPI 下载源码包手动安装。独立 jar 发行版可从 Maven Central 获取。更详细的安装方式参见仓库根目录的 INSTALL.rst。最重要的增强Most important enhancements全新的测试数据解析器3.2 中体量最大的新特性是完全重写的测试数据解析器issue #3076。虽然解析器从零重写但对绝大多数用户而言其行为与旧解析器几乎完全一致。重写的动机旧解析器架构上难以演进无法支撑后续新增语法。重写为的是在 Robot Framework 4.0 中引入IF/ELSE#3074、TRY/EXCEPT#3075以及嵌套控制结构#3079等能力。3.2 本身尚未引入任何新语法只是完成了地基铺设。对外部工具的 API 红利新解析器为编辑器、linter、代码格式化器等外部工具提供了远优于旧版的 API#3373官方 API 文档位于robot.parsing模块。代价是使用旧解析 API 的工具必须升级适配。新解析 API 已被robotframework-lsp项目采用——该项目通过语言服务器协议LSP把解析及其他能力暴露给编辑器/IDE并已提供 VSCode 集成。面向用户的直接改善解析时保留行号#549许多错误信息如今会明确指出错误发生在第几行极大提升排错体验保留省略号...行续接标记#1272Tidy 等工具不再破坏原始格式#2579。格式支持范围收窄新解析器只支持纯文本格式#3081——HTML 格式完全不再支持TSV 格式仅在“与纯文本格式完全兼容”时可用。且默认只解析*.robot文件#3084使用*.txt、*.tsv、*.rst的用户必须显式传入--extension选项。从仓库源码结构看新解析器由 src/robot/parsing/ 下的三个子模块组成lexer/词法分析含 tokens.py、lexer.py、tokenizer.py 等、model/语法树模型含 blocks.py、statements.py、以及parser/文件解析器含 fileparser.py、blockparsers.py。这种“词法 → 语句 → 块级语法树”的分层设计正是其能稳定承载未来新语法的基础。新的library装饰器library类装饰器#3019提供了一系列便捷能力核心是可集中配置库的作用域、版本、文档格式与监听器。例如下面两个库完全等价from robot.api.deco import library library(scopeGLOBAL, version3.2b1) class NewWay: # actual library code class OldWay: ROBOT_LIBRARY_SCOPE GLOBAL ROBOT_LIBRARY_VERSION 3.2b1 # actual library code从 src/robot/api/deco.py 的实现可以看到装饰器本质上就是把参数写入类的ROBOT_LIBRARY_SCOPE、ROBOT_LIBRARY_VERSION、ROBOT_LIBRARY_CONVERTERS、ROBOT_LIBRARY_DOC_FORMAT、ROBOT_LIBRARY_LISTENER属性仅当对应参数给出时写入并默认把ROBOT_AUTO_KEYWORDS置为False。强制使用keyword标记关键字#3221默认情况下使用library装饰后只有显式标注keyword的方法才会成为关键字from robot.api.deco import library, keyword library class Example: keyword def example_keyword(self): # ... def not_exposed_as_keyword(self): # ...对于模块可用模块级属性ROBOT_AUTO_KEYWORDS False开启同样的行为若在使用library时仍想保留自动发现可传入library(auto_keywordsTrue)。新的not_keyword装饰器not_keyword#3455是另一种告诉 Robot Framework“某个函数/方法不应视为关键字”的方式from robot.api.deco import not_keyword def example_keyword(): # ... not_keyword def not_exposed_as_keyword(): # ...实现上src/robot/api/deco.py它仅为函数设置robot_not_keyword True标记属性。该机制同样被用来标注旧keyword装饰器、新library装饰器以及not_keyword本身为“非关键字”#3454避免这些装饰器函数被意外暴露成关键字。Libdoc spec 文件的增强Libdoc 通常用于生成供人阅读的 HTML 库文档但也能生成供外部工具读取的 XML spec 文件。3.2 对这些 spec 文件做了大幅增强文档转 HTMLspec 文件中的库与关键字文档可用新格式--format XML:HTML转为 HTML#3301*.libspec扩展名#3491输出文件使用该扩展名时Libdoc 默认采用上述XML:HTML格式XSD 模式#3520spec 文件拥有官方 XSD schema可校验并完整定义格式见仓库 doc/schema/ 下的 libdoc.xsdspecversion属性#3523标明 spec 版本当前为 2后续变更时递增源码信息#3507包含库及每个关键字实现文件的相对路径与行号弃用标记弃用关键字自动获得deprecatedtrue属性#3498scope与namedargs由元素改为属性#3522scope统一为GLOBAL、SUITE、TEST#3532namedargs变为布尔值而非字符串yes/no为兼容旧工具旧的scope、namedargs元素仍会写入type属性值改为大写LIBRARY/RESOURCE#3534相关工具需更新generated属性改为 UTC 时间的xsd:dateTime#3528替代原先自定义格式的本地时间相关工具需更新。Inline Python 求值${{expression}}3.2 支持在变量语法的基础上直接用${{expression}}内联求值 Python 表达式#3179。表达式语法与 BuiltIn 库的Evaluate等关键字基本一致区别在于这些关键字总是求值因此无需${{}}包裹。主要使用场景表达式内使用 Robot Framework 变量${{len(${var}) 3}}、${{$var[0] if $var is not None else None}}创建非 Python 基础类型的值${{decimal.Decimal(0.11)}}、${{datetime.date(2020, 4, 27)}}动态创建值${{random.randint(0, 100)}}、${{datetime.date.today()}}构造集合含嵌套${{[1, 2, 3, 4]}}、${{ {id: 1, name: Example, children: [7, 9]} }}访问 Python 模块中的常量与属性${{math.pi}}、${{platform.system()}}。该功能与旧“扩展变量语法”extended variable syntax类似但更强可访问len()等内置函数与math等模块。表达式中既可用${var}求值前替换也可在求值期间用专门的$var语法引用变量。从 src/robot/variables/evaluation.py 的EvaluationNamespace实现看求值命名空间以RF_VAR_前缀包装变量通过variables[key[7:]]取值并实现了模块自动导入当名字不是内置对象且不在命名空间中时会尝试__import__(name)动态导入模块。这印证了配套变更——Evaluate及其他求值类 BuiltIn 关键字会自动导入表达式用到的模块#3349。FOR 循环原生迭代{dict}字典FOR 循环支持直接迭代{dict}变量#3485FOR ${key} ${value} IN {dict} Log Key is ${key} and value is ${value}. END可同时迭代多个字典并用keyvalue语法追加额外项FOR ${key} ${value} IN {first} {second} onemore Log Key is ${key} and value is ${value}. END同一 key 出现多次时取最后一次的值但键的原始顺序得以保留。后续版本会把该语法推广为“所有值都用keyvalue”也可迭代3.1 时代这种用法会触发弃用警告。用key\value转义可避免触发字典迭代。也可只用一个循环变量此时它成为键值对元组FOR ${item} IN {dict} Length Should Be ${item} 2 Log Key is ${item}[0] and value is ${item}[1]. END字典迭代同样适用于FOR IN ENUMERATEFOR ${index} ${key} ${value} IN ENUMERATE {dict} Log Key is ${key} and value is ${value} at index ${index}. END FOR ${item} IN ENUMERATE {dict} Length Should Be ${item} 3 Log Key is ${item}[1] and value is ${item}[2] at index ${item}[0]. END仓库测试覆盖可参考 atest/robot/running/for/ 下的用例。监听器Listener可在 start/end_test 中增删测试监听器本就是 Robot Framework 的强大能力3.2 更进一步此前 API v3 的监听器无法在start_test/end_test方法中新增或移除测试#3251如今该限制已被解除。这使得基于 Robot Framework 核心实现模型驱动测试model based testing等高级工具变得更加容易。正确读取“被包装”wrapped关键字的签名在库中实现关键字时有时会用 Python 装饰器修改函数而装饰器常常会改变函数签名干扰 Robot Framework 对参数含默认值与类型注解的自省。从 3.2 起Python 3 环境下只要用functools.wraps装饰装饰器本身#3027Robot Framework 就会自动“解包”读取真实的函数签名。Standalone jar 更新到 Jython 2.7.2独立 jar 发行版此前基于 Jython 2.7.0现升级为 Jython 2.7.2#3383带来该版本的全部特性与修复。jar 可从 Maven Central 获取。项目重新建立持续集成CI自 Nokia 时代之后Robot Framework 项目终于重新拥有了可用的 CI#3420基于 GitHub Actions 构建每次代码推送到仓库或开启拉取请求时自动运行测试。向后不兼容的变更Backwards incompatible changes3.2 的破坏性变更主要与解析相关请逐条核对迁移影响。HTML 与 TSV 格式不再受支持新解析器只支持纯文本格式#3076、#3081HTML 格式支持彻底移除TSV 仅在完全兼容纯文本格式时可用。默认只解析*.robot文件执行目录时3.2 默认只解析*.robot#3084。*.txt、*.tsv、*.rst用户需显式使用--extension如--extension tsv或--extension robot:tsv。执行单个文件时则不受扩展名限制任何扩展名都会被解析。对应 CLI 默认扩展名配置可在 src/robot/conf/settings.py 附近看到默认(.robot, .rbt, .robot.rst)。解析 API 被重写新解析 API#3373只保证“向前”稳定所有使用旧解析 API 的工具都需更新。视使用场景不同也可以改用变化较小的上层TestSuiteBuilder()接口。变量识别与求值方式变化花括号必须配对#3288查找变量时变量体内所有未转义花括号都须闭合。例如${foo{bar}zap}现在是一个完整变量而过去被拆成变量${foo{bar}加字面量zap}。变量项访问语法${var}[item]同理item部分未转义的方括号也须闭合。该变化是为支持${{expression}}#3179而铺路附带好处是包含自定义正则的嵌入参数可不再转义书写如${date:\d{4}-\d{2}-\d{2}}但旧语法${date:\d{4\}-\d{2\}-\d{2\}}不再有效。跨版本通用的替代写法是避开花括号${date:\d\d\d\d-\d\d-\d\d}。变量求值也有小幅变化限于变量体内转义字符的处理#3295预计影响不大。测试用例名称中的变量会被解析过去测试用例名称原样使用、不替换其中的变量现已被改变#2962。若需字面量请转义如Example \${name}。非 ASCII 空格的处理变化旧解析器对不间断空格no-break space等非 ASCII 空格处理不一致#3121新解析器修复了该问题同时带来三处语法变化任何空格字符都视为分隔符——过去仅 ASCII 空格与不间断空格算分隔符测试数据本身非分隔位置中的非 ASCII 空格不再被转换为普通空格——例如可以给参数传入含不间断空格的值管道分隔格式下连续空格不再折叠——普通空格同样受影响。管道分隔格式不再支持旧式 FOR 循环3.2 全面弃用旧式 FOR 循环在管道分隔格式下变化更大过去可写| :FOR | ${x} | IN | 1 | 2 | | Log | ${x}现在完全不再支持推荐改用新式语法:FOR换成FOR并显式加END| FOR | ${x} | IN | 1 | 2 | | Log | ${x} | END |更多细节见 issue #3108。更严格的 section 与 setting 名称语法Test Cases之类的 section 名、Test Setup之类的 setting 名现在对空格敏感#3082TestCases、TestSetup这类写法不再被识别。更严格的 FOR 循环分隔符语法FOR 循环分隔符IN、IN RANGE、IN ZIP、IN ENUMERATE现在大小写与空格都敏感#3083in、INZIP等写法不再被识别。同时再次强调旧 FOR 语法整体已弃用。Libdoc spec 文件格式变化如前述增强部分以下变化可能影响使用 spec 文件的工具type属性值改为大写LIBRARY/RESOURCE#3534generated属性改为 UTC 的xsd:dateTime#3528。预运行修饰器pre-run modifiers先于测试选择执行此前--test、--suite、--include、--exclude在预运行修饰器之前执行现在顺序反转——主要目的是让这些命令行选项也能匹配预运行修饰器生成的测试。依赖旧顺序的使用场景会受影响。其他向后不兼容变更变量项访问语法适用于所有序列#3182${var}[0]现在可用于包括字符串、bytes 在内的所有序列3.1 中对非类列表序列会报错更早版本则将其解析为变量${var}加字面量[0]。BuiltIn 关键字参数改名#3486Should Contain X Times与Get Count的参数名从item1, item2改为container, item以与其他类似关键字保持一致。仅当使用item2xxx这种命名参数语法时才受影响。String 库方法改名#3484convert_to_uppercase、convert_to_lowercase分别改名为convert_to_upper_case、convert_to_lower_case。测试数据中的Convert To Upper Case/Convert To Uppercase两种写法在所有版本都可用只有程序化调用这些 Python 方法的场景需要改动。自定义超时消息支持被移除#2291该功能自 3.0.1 起弃用如今正式删除。--escape选项被移除#3085命令行转义问题请改用 shell 的转义/引号机制。--warnonskippedfiles选项被移除#3086该选项早已无实际效果。{dict}用于 FOR 循环会触发字典迭代#3485如不希望如此请改用${dict}语法。弃用特性Deprecated features3.2 的弃用项不算多但 FOR 循环语法的变化预计会影响到大量用户。旧式 FOR 循环语法3.1 已增强 FOR 语法新写法FOR ${animal} IN cat dog cow Keyword ${animal} Another keyword END对比旧写法:FOR开头 循环内所有关键字用反斜杠转义:FOR ${animal} IN cat dog cow \ Keyword ${animal} \ Another keyword3.1 中两种写法都可用且无警告3.2 起使用:FOR代替FOR#3080以及不用显式END收尾#3078均被弃用旧语法将在 4.0 中彻底移除。迁移建议官方提供四条路径跑一遍测试观察弃用警告数量警告会指出旧语法位置——即便用其他方式查找跑测试也能确认是否全部捕获用 Tidy 工具自动更新Tidy 自 3.1.2 起会把旧 FOR 语法更新为新语法。注意它会连带改变其他格式建议审查变更、只提交与 FOR 循环相关的部分用操作系统搜索在测试数据中大小写不敏感地查找:FOR及可能的: FOR变体手工更新用外部命令行工具如 ackPerl或 pssPython。pss 可用如下命令pss -ai : ?FOR path/to/tests全keyvalue语法的 FOR 循环{dict}迭代#3485支持keyvalue追加项FOR ${key} ${value} IN {dict} anotheritem onemore Log Key is ${key} and value is ${value}. END未来将推广为即使没有{dict}变量也可全用keyvalue迭代FOR ${key} ${value} IN keyvalue anotheritem onemore Log Key is ${key} and value is ${value}. END3.2 中上面的写法仍可工作但会触发弃用警告仅当所有值都是xxxyyy形式时才触发。最简单的规避方法是对至少一个值转义如xxx\yyy。{var}[item]与{var}[item]访问已弃用3.1 增强了嵌套列表/字典项访问语法${var}[item]、${var}[nested][item]无论${var}是列表还是字典都可用。旧的类型专属语法{list}[item]、{dict}[item]仍能工作但已弃用#2974。Tidy 无法处理这类弃用但查找方式与 FOR 循环一致。pss 可用的命令pss -ai \{.\}\[ path/to/tests pss -ai \{.\}\[ path/to/tests忽略换行后的空格已弃用过去two\n lines被视为与two\nlines等价。该语法原本服务于 HTML 格式下的多行字符串构造如今 HTML 格式已不支持故弃用#3333。其使用范围预计不广。其他值得关注的修复与增强3.2 共处理 107 个 issue完整清单见原文档末尾表格。除上述核心内容外还包括新增Set Local Variable关键字#3091与Convert To Title Case关键字#2706Lists Should Be Equal支持忽略顺序比较#2703环境变量支持默认值语法%{EXAMPLEdefault}#3382Run Process在超时为零、负数或字符串None时忽略超时#3366并可完全禁用 stdout/stderr#3397Libdoc 支持按标签过滤关键字URL 查询参数#3440与生成robot format目录自动目录#3280动态 API 支持从get_keyword_arguments返回真实默认值#3514并新增get_keyword_source方法#3516监听器 API v2 暴露测试行号#3451YAML 变量文件新增支持.yml扩展名#3195ExecutionResultAPI 支持 bytes 输入#3194、日志与报告升级 jQuery#3202、Libdoc/TestDoc/Tidy 及 syslog 自动创建输出目录#2767等。总结Robot Framework 3.2 是一次以“解析器重建”为核心的架构性大版本它为 4.0 的 IF/ELSE、TRY/EXCEPT 等控制流语法奠定了稳定的解析基础同时通过library/not_keyword装饰器显著改善了库开发的体验${{expression}}内联求值则把 Python 能力直接注入测试数据。对使用者而言迁移的关键动作集中在三件事上将测试数据统一为纯文本*.robot格式、把旧式:FOR循环改为带END的新语法、并留意变量解析与 section/setting 名称的严格化。若已升级到 3.2请务必继续跟进到 3.2.1 以规避该版本的两个严重回归。赞分享测试RPA接口测试【免费下载链接】robotframeworkGeneric automation framework for acceptance testing and RPA项目地址https://gitcode.com/gh_mirrors/ro/robotframework点击查看免费下载相关推荐Robot Framework 3.2 beta 1 发布解读新解析器、library 装饰器与内联 Python 求值Robot Framework 3.2 beta 1 发布解读新解析器、library 装饰器与内联 Python 求值 本文基于 doc/releasen测试RPA接口测试Robot Framework 3.2 Beta 2 技术解读新解析器、library/not_keyword 装饰器与内联 Python 求值Robot Framework 3.2 Beta 2 技术解读新解析器、library/not_keyword 装饰器与内联 Python 求值 导读 R测试RPA接口测试Robot Framework 3.2 RC1 新特性与破坏性变更全解析新解析器、装饰器与内联 Python 求值Robot Framework 3.2 RC1 新特性与破坏性变更全解析新解析器、装饰器与内联 Python 求值 本指南以 Robot Framework测试RPA接口测试创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表