ARTICLE DETAIL

资讯详情

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

Robot Framework 4.0.2 beta 1 发布解析:Union 泛型类型转换回归修复与五大缺陷修补

Robot Framework 4.0.2 beta 1 发布解析:Union 泛型类型转换回归修复与五大缺陷修补 测试RPA接口测试【免费下载链接】robotframeworkGeneric automation framework for acceptance testing and RPA项目地址https://gitcode.com/gh_mirrors/ro/robotframework点击查看免费下载Robot Framework 4.0.2 是 4.0.x 维护系列中的第二个也是最后一个计划内的缺陷修复版本本文基于仓库中官方发布说明文档 rf-4.0.2b1.rst 展开系统梳理该 beta 版修复的 5 个缺陷、安装方式、修复背后的源码实现并给出可复现的类型提示与资源文件操作示例。读完本文你将掌握 4.0.x 系列遗留回归问题的成因与修复思路并能直接使用 4.0.2 修复后的功能写出更健壮的库与测试。版本背景与发布时间线Robot Framework 4.0.2 beta 1beta 版第一个预发布于2021 年 5 月 6 日周四发布最终版 4.0.2 计划于2021 年 5 月 11 日周二发布正好是 Robot Framework 4.0 正式发布2021 年 3 月 11 日之后的整整两个月。该版本承接了 4.0.1 的遗留问题4.0.1 在自动参数转换中已接受类型之一时避免转换这一优化上引入了回归issue #39314.0.2 beta 1 的首要任务就是修复这批已报告的问题。beta 版发布时说明明确若在最终版之前发现更多问题仍会继续修补从 4.0.x 系列整体看4.0.2 之后该系列还推出了 4.0.3见 rf-4.0.3.rst官方建议使用最新版。安装与版本锁定文档给出了两种最直接的安装方式。若已安装pip安装最新可用版本含预发布版本pip install --pre --upgrade robotframework或安装精确版本4.0.2 beta 1pip install robotframework4.0.2b1也可以从 PyPI 下载源码分发包手动安装。更多安装方式参见仓库根目录的 INSTALL.rst原文档内部链接../../INSTALL.rst即指向此处。需要注意--pre参数用于拉取预发布版本若只想用稳定版直接pip install --upgrade robotframework即可。最重要的修复Union包含泛型作为类型提示的回归问题背景Robot Framework 4.0 引入了基于类型提示type hint的自动参数转换功能。4.0.1 进一步细化了Union用作类型提示时的转换行为——其优化方向是若传入参数已经是 Union 中某个被接受类型则避免转换。改动本身合理却引入了回归issue #3931被标记为critical严重级别当Union中包含订阅泛型subscribed generics即带类型参数的泛型如List[int]时会直接报错例如from typing import Union, List, Dict def example(arg: Union[List[int], Dict[str, int]]): # ... pass源码级成因回归的根源可以从当前仓库的转换链路中看到。类型提示会先经 typeinfo.py 的TypeInfo.from_type_hint解析当检测到is_union(hint)时将hint.__args__中的每个成员递归构造为嵌套的TypeInfotypeinfo.py得到TypeInfo(Union, nested[TypeInfo(List[int]), TypeInfo(Dict[str, int])])。随后 typeconverters.py 中的UnionConvertertypeconverters.py负责实际转换。其no_conversion_needed方法typeconverters.py逐个遍历嵌套类型def no_conversion_needed(self, value): for converter, info in zip(self.converters, self.type_info.nested): if converter: if converter.no_conversion_needed(value): return True else: try: if isinstance(value, info.type): return True except TypeError: pass return False这里正是 4.0.1 改动触及的地方对没有专门 converter 的嵌套类型例如参数化后的List[int]、Dict[str, int]这类typing泛型其类型并非可直接用于isinstance的普通类代码尝试用isinstance(value, info.type)做判断。在修复前这种针对泛型 origin 的调用会抛出TypeError且该异常未被正确处理导致整个转换链路崩溃。修复后可见于上文中try/except TypeError的兜底逻辑异常被捕获并跳过该分支继续尝试下一个嵌套类型。UnionConverter的_convert方法typeconverters.py也体现了对无法识别的泛型类型的宽容处理遍历所有子 converter若某个转换抛ValueError则继续尝试下一个若存在无法识别无对应 converter的嵌套类型则原样返回传入值而不报错def _convert(self, value): unrecognized_types False for converter in self.converters: if converter: try: return converter.convert(value) except ValueError: pass else: unrecognized_types True if unrecognized_types: return value raise ValueError验证与使用修复后上述example这类函数即可正常作为库关键字使用。仓库的自动参数转换测试覆盖在 atest/robot/keywords/type_conversion/ 目录下含 18 个 .robot 用例与配套的 Python 库单元层面则可参考 utest/running/test_typeinfo.py 对类型信息解析与转换的验证。实际使用中Union[List[int], Dict[str, int]]这类多候选结构类型提示会自动把传入的字符串按literal_eval解析并做逐项类型转换或在其无法转换时安全返回原值避免误伤。其余四项缺陷修复详解Libdoc 恢复支持 PYTHONPATH 中的资源文件#39294.0.1 破坏了 Libdoc 对位于PYTHONPATH中的资源文件resource file的支持4.0.2 beta 1 修复了该问题。从当前源码看Libdoc 的资源文档构建由 robotbuilder.py 中的ResourceDocBuilder负责。其查找逻辑_find_resource_filerobotbuilder.py清晰地体现了修复后的行为def _find_resource_file(self, path): if os.path.isfile(path): return os.path.normpath(os.path.abspath(path)) for dire in [item for item in sys.path if os.path.isdir(item)]: candidate os.path.normpath(os.path.join(dire, path)) if os.path.isfile(candidate): return os.path.abspath(candidate) raise DataError(fResource file {path} does not exist.)即首先按字面路径判断文件是否存在若不存在则遍历sys.path运行时即包含PYTHONPATH注入的目录中每个目录拼接候选路径逐一查找全部失败才抛出DataError。因此修复后可以这样使用# 将资源文件所在目录加入 PYTHONPATH然后直接用资源文件名相对该目录生成文档 export PYTHONPATH/path/to/resources python -m robot.libdoc my_resource.resource doc.htmlLibdoc 的入口与构建流程可进一步查阅 libdocpkg/builder.pyLibraryDocumentation入口、DocumentationBuilder以及RESOURCE_EXTENSIONS对resource/robot/txt/tsv/rst/rest扩展名的识别。Rebot 不再丢弃kw的sourcename属性#3941社区贡献者 miktuy 修复了 Rebot 处理输出文件时丢失sourcename属性的问题issue #3941原先 Rebot 重新生成 output.xml 时会把kw元素上的sourcename属性记录含内嵌参数的关键字原始名称移除。当前仓库中该属性的完整生命周期如下写入执行日志器 output/xmllogger.py 的_get_start_keyword_attrsxmllogger.py在关键字开始时将sourcename写入 XMLdef _get_start_keyword_attrs(self, kw): attrs {name: kw.kwname, library: kw.libname} if kw.type ! KEYWORD: attrs[type] kw.type if kw.source_name: attrs[sourcename] kw.source_name return attrs读取Rebot 解析 XML 时result/xmlelementhandlers.py 的_get_keyword_attrsxmlelementhandlers.py同时兼容新旧属性名def _get_keyword_attrs(self, elem): # library and sourcename are RF 7 compatibility. return { name: elem.get(name, ), owner: elem.get(owner) or elem.get(library), source_name: elem.get(source_name) or elem.get(sourcename) }模型结果模型 result/model.py 中Keyword以source_name为正式字段model.py注释明确Original name of keyword with embedded arguments并保留sourcename兼容属性model.py注释标注Deprecated since Robot Framework 7.0。4.0.2 的修复确保了 Rebot 在合并/处理输出时保留该属性使含内嵌参数的关键字在重新生成的 output.xml 中仍能追溯原始名称。注意该属性对应 RF 7.0 之前的字段命名体系后续版本已迁移为source_name阅读旧版输出时两者皆被接受。Run Keyword If Test Failed在测试被跳过时不再误执行#39514.0.1/4.0.2 期间的缺陷当测试被跳过skipped时Run keyword if test failedRun Keyword If Test Failed仍会执行关键字——这显然是错误行为因为跳过并不等于失败。beta 1 发布说明将其描述为 Run keyword if test failed executes keywords if test was skipped最终版 4.0.2 的说明则补充了细节当测试被跳过且该关键字不是 teardown 中第一个关键字时行为不正确。当前源码中该关键字定义于 libraries/BuiltIn.pyrun_keyword_variant(resolve0, dry_runTrue) def run_keyword_if_test_failed(self, name, *args): Runs the given keyword with the given arguments, if the test failed. This keyword can only be used in a test teardown. Trying to use it anywhere else results in an error... test self._get_test_in_teardown(Run Keyword If Test Failed) if test.failed: return self.run_keyword(name, *args)其判定核心是test.failed——只有测试状态为失败时才执行指定关键字。被跳过的测试状态为 SKIPPEDfailed为 False因此修复后不会触发执行。Skip/Skip If等关键字同文件_Control.skipBuiltIn.py通过raise SkipExecution(msg)跳过剩余步骤并保留 teardown 执行所制造的跳过场景如今不会再与if failed分支混淆。该行为在验收测试 atest/robot/running/skip.robot 等用例中有覆盖。类型提示为 ABC 抽象基类时的参数转换问题#3958当类型提示使用abcPython 标准库collections.abc/numbers等抽象基类时4.0.x 早期版本的参数转换会出问题issue #3958。例如用collections.abc.Sequence、numbers.Integral、numbers.Real、os.PathLike等作为提示时需要能正确匹配到对应的转换器。当前 typeconverters.py 中各转换器通过abc类属性登记自己的抽象基类归属例如IntegerConvertertype intabc Integraltypeconverters.pyFloatConvertertype floatabc Realtypeconverters.pyPathConvertertype Pathabc PathLiketypeconverters.pyListConverter/DictionaryConverter/SetConverter分别对应abc Sequence/Mapping/Settypeconverters.py、typeconverters.py、typeconverters.pyTypeConverter.handles类方法typeconverters.py负责匹配classmethod def handles(cls, type_info: TypeInfo) - bool: handled (cls.type, cls.abc) if cls.abc else cls.type return isinstance(type_info.type, type) and issubclass(type_info.type, handled)而converter_fortypeconverters.py在精确类型未命中时会遍历所有已注册转换器逐一调用handles做兜底匹配。4.0.2 修复了该匹配链路中 ABC 类型无法被正确识别与转换的问题使def f(x: Sequence)、def g(x: Real)这类基于 ABC 的提示也能获得正确的自动转换。完整修复清单ID类型优先级摘要加入版本#3931bugcritical使用包含泛型的Union作为类型提示导致错误beta 1#3929bugmediumLibdoc 无法再处理 PYTHONPATH 中的资源文件beta 1#3941bugmediumRebot 从 output.xml 的kw中移除sourcename属性beta 1#3951bugmediumRun keyword if test failed 在测试被跳过时仍执行关键字beta 1#3958bugmedium类型提示为 ABC 抽象基类时参数转换出错beta 1总计 5 个问题其中 1 个 critical、4 个 medium全部在 beta 1 阶段修复。与此前版本4.0.1相比4.0.2 beta 1 未引入新功能专注缺陷修补保证 4.0 系列的稳定性。致谢与社区贡献Robot Framework 4.0.2 的开发由 Robot Framework Foundation 及其近 50 家成员组织赞助。此外开源社区贡献者 miktuy 修复了sourcename属性在 Rebot 生成的 output.xml 中丢失的问题#3941这是本版本唯一一项来自社区的外部代码贡献。发布说明由 Robot Framework 首席开发者 Pekka Klärck 签署。延伸从 beta 到正式版与后续维护按照发布计划4.0.2 最终版于 2021 年 5 月 11 日发布对应文档 rf-4.0.2.rst并随后被 4.0.3 取代。若对比两个文档可发现最终版对 #3951 的描述补充了仅当该关键字不是 teardown 中第一个关键字且测试被跳过的精确触发条件——这说明 beta 阶段的问题复现与诊断仍在继续。对于生产环境官方建议使用最新发布版本若需锁定 4.0.2 系列则pip install robotframework4.0.2b1或后续正式版pip install robotframework4.0.2均可作为固定版本写入 CI 与依赖清单。4.0.2 所修复的若干问题——尤其是 Union 泛型转换、ABC 类型匹配、跳过状态与 teardown 关键字的交互——在今天仍具有参考价值它们都涉及自动参数转换与执行状态判定的边界情况其修复模式异常兜底、sys.path回退查找、状态字段的精确语义在后续版本的类型转换体系如 typeinfo.py 中Union、Literal、TypedDict的解析与校验中得以延续和加强。赞分享测试RPA接口测试【免费下载链接】robotframeworkGeneric automation framework for acceptance testing and RPA项目地址https://gitcode.com/gh_mirrors/ro/robotframework点击查看免费下载相关推荐Robot Framework 4.0.2 缺陷修复版本全解析Union 泛型回归修复与 Rebot、Libdoc 关键补丁Robot Framework 4.0.2 缺陷修复版本全解析Union 泛型回归修复与 Rebot、Libdoc 关键补丁 Robot Framework测试RPA接口测试Robot Framework 4.0.3 beta 1 发布解析TypedDict 类型注解回归的最终修复与配套缺陷修补Robot Framework 4.0.3 beta 1 发布解析TypedDict 类型注解回归的最终修复与配套缺陷修补 导读 本文围绕 Robot Fra测试RPA接口测试Robot Framework 4.0.1 Beta 1 版本解析关键缺陷修复与参数类型转换逻辑变更Robot Framework 4.0.1 Beta 1 版本解析关键缺陷修复与参数类型转换逻辑变更 Robot Framework 4.0.1 beta 1测试RPA接口测试创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表