
测试RPA接口测试【免费下载链接】robotframeworkGeneric automation framework for acceptance testing and RPA项目地址https://gitcode.com/gh_mirrors/ro/robotframework点击查看免费下载Robot Framework 6.1 于 2023 年 6 月 12 日发布是 6.x 系列中极具里程碑意义的功能版本它引入了测试数据与 JSON 互转的完整能力、面向工具开发者的外部解析器 API并允许用户关键字混用内嵌参数与普通参数。本文以官方发布说明doc/releasenotes/rf-6.1.rst为主线结合仓库源码src/robot逐一拆解这些新特性的使用方式、底层实现与向后兼容性影响帮助普通用户与外部工具开发者快速掌握 6.1 的迁移要点与新能力。安装与版本概览如果已安装pip直接升级到最新可用版本pip install --upgrade robotframework或精确安装 6.1 版本pip install robotframework6.1也可以从 PyPI 下载源码发行包手动安装其他安装方式参见仓库根目录的安装说明。Robot Framework 6.1 已被 6.1.1 版本 取代建议在正式环境中跟进补丁版本。最重要的新特性JSON 数据格式套件与 JSON 的双向转换6.1 中最大的新功能是将测试/任务数据转换为 JSON 并反向还原issue #3902主要服务于三个场景在进程与机器之间传输数据在一台机器上将套件转成 JSON在另一台机器上重建将普通 Robot Framework 数据构造出的套件包括嵌套套件保存为单个 JSON 文件后续解析更快为外部工具提供生成测试/任务的替代数据格式。该功能主要面向工具开发者。核心 API 全部集中在robot.running.TestSuite上实现见 src/robot/running/model.py 与其基类 src/robot/model/testsuite.py。1. 序列化TestSuite.to_json与TestSuite.to_dict无参调用时返回 JSON 字符串也可以传入路径或已打开的文件对象写入数据并支持 JSON 格式化配置from robot.running import TestSuite # 基于文件系统数据构造套件 suite TestSuite.from_file_system(/path/to/data) # 以字符串形式获取 JSON 数据 data suite.to_json() # 写入文件并使用自定义缩进 suite.to_json(data.rbt, indent2)如果希望先拿到 Python 字典、再自行转换为 JSON 或其他格式可以改用TestSuite.to_dict。2. 反序列化TestSuite.from_json与TestSuite.from_dictfrom_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。所有模型对象包括FOR/WHILE/IF/TRY等控制结构都实现了to_dict/from_dict序列化时通过Body注册机制统一转换底层序列化入口在 src/robot/model/modelobject.py。3. 命令行直接运行.rbt文件使用robot命令执行时带有自定义扩展名.rbt的 JSON 文件会被自动解析包括运行单个文件robot tests.rbt以及运行包含.rbt文件的目录。这一点可以从解析层的默认扩展名列表得到印证src/robot/parsing/suitestructure.py默认扩展名为(.robot, .rbt, .robot.rst)。4. 跨机器传输时的adjust_sourceto_json/to_dict生成的套件 source 信息是绝对路径格式若套件在其他机器上重建source 可能与目标机器的目录结构不匹配。为此新增了TestSuite.adjust_source方法实现见 src/robot/model/testsuite.py在导出前将 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)JSON 数据格式本身使用running.jsonschema 描述其生成器与说明见 doc/schema/running_json_schema.py 与 doc/schema/README.rst。需要注意该序列化能力在后续版本中仍可能增强遇到问题或改进建议应提交 issue。外部解析器 API为自定义数据格式而生的--parser解析器 API 是另一个面向工具开发者的重要新接口issue #1283它可以创建自定义解析器处理自有数据格式甚至可以覆盖 Robot Framework 自带的解析器。命令行启用方式通过新增的--parser选项启用用法与--listener一致——支持名称或路径、可向解析器类传参等robot --parser MyParser tests.custom robot --parser path/to/MyParser.py tests.custom robot --parser Parser1:arg --parser Parser2:a1:a2 path/to/tests从命令行帮助文本src/robot/run.py可以看到--parser接收自定义解析器类或模块解析器类的参数传递方式与--listener相同。模块形式的简单解析器只需要一个指定所支持扩展名的EXTENSION或extension属性以及一个接收源文件路径的parse方法from robot.api import TestSuite EXTENSION .example def parse(source): suite TestSuite(nameExample, sourcesource) test suite.tests.create(nameTest) test.body.create_keyword(nameLog, 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), sourcesource) for line in source.read_text().splitlines(): test suite.tests.create(nameline) test.body.create_keyword(nameLog, args[Hello!]) return suite继承可选的Parser基类并处理初始化文件解析器不需要显式继承任何基类或接口但有一个可选的Parser基类可以继承定义见 src/robot/api/interfaces.py。基类要求必须提供extension属性可为字符串或字符串序列模块形式通常命名为EXTENSION和parse方法parse_init可选。与之前示例相比还有两点差异解析器可提供可选的parse_init方法用于解析套件初始化文件parse与parse_init都可接受可选的defaults参数。当存在第二个参数时parse方法会拿到一个TestDefaults实例定义于 src/robot/running/builder/settings.py其中包含来自初始化文件的测试相关默认值setup、teardown、tags 与 timeoutparse_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: 创建套件并把来自 init 文件的默认值设置到测试上。 suite TestSuite(TestSuite.name_from_source(source), sourcesource) for line in source.read_text().splitlines(): test suite.tests.create(nameline, docExample) test.body.create_keyword(nameLog, args[Hello!]) defaults.set_to(test) return suite def parse_init(self, source: Path, defaults: TestDefaults) - TestSuite: 创建占位套件并设置一些默认值。 仅当存在受支持扩展名的初始化文件时才会调用此方法。 defaults.tags (tags, from init) defaults.setup {name: Log, args: [Hello from init!]} return TestSuite(TestSuite.name_from_source(source.parent), docExample, sourcesource, metadata{Example: Value})实战作为 Robot Framework 数据文件预处理器的解析器。最后一个示例展示了如何用解析器预处理标准数据文件——支持 Test Cases 这类表头标准格式为*** Test Cases ***。这种场景下适合用TestSuite.from_string、TestSuite.from_model或TestSuite.from_file_system工厂方法构造返回的套件这些方法均在 src/robot/running/model.py 及同文件后续段落实现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, defaultsdefaults) return suite.config(nameTestSuite.name_from_source(source), sourcesource)Python 3.12 兼容性Python 3.12 于 2023 年 10 月发布其中包含一个影响 Robot Framework Python 求值的细微 tokenization 变更与特殊$var语法相关。该问题已在 6.1 中修复6.1 在其他方面也与 Python 3.12 兼容issue #4771。用户关键字可同时使用内嵌参数与普通参数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}.目前该能力仅限用户关键字若社区有需求未来版本可能扩展到库关键字。返回值可直接赋值给列表与字典元素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 nameExample 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扁平化Example后会变成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 开始这种扁平化可以在执行期间完成且无需任何命令行选项——只需给关键字打上新标签robot:flattenissue #4584*** Keywords *** Example [Tags] robot:flatten Log Robot Log Framework此时 output.xml 的结果为kw nameExample 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的配置选项更多robot:flatten未来可按需增强。相关扁平化逻辑可在 src/robot/result/flattenkeywordmatcher.py 与 src/robot/conf/settings.py 中查看。公共 API 补充类型信息Robot Framework 提供多个供库与工具开发者使用的公共 API6.1 为以下 API 增加了类型提示type hints使调用更简单、IDE 提示更友好TestSuite结构listeners、model modifiers、外部解析器及各种工具使用issue #4570Listener APIissue #4568Dynamic 与 hybrid 库 APIissue #4567Parsing APIissue #4740Visitor APIissue #4569。例如 src/robot/api/interfaces.py 中就包含了ListenerV2第 423 行、ListenerV3第 519 行等带完整类型标注的可选基类。自定义参数转换器可访问所在库自定义参数转换器custom argument converters自 5.0 引入issue #4088以来非常实用。6.1 的增强是让转换器可以方便地拿到使用该关键字的库实例从而基于库状态进行转换issue #4510。做法很简单创建一个接受两个值的转换器——第一个值是数据中的值与之前完全一致第二个值是库实例或模块def converter(value, library): ...只接受一个参数的转换器继续照常工作官方也没有强制它们改为接受两个值的计划。转换器注册与解析逻辑见 src/robot/running/arguments/customconverters.py。JSON 变量文件支持很久以前除了 Python 之外YAML 也被支持用作变量文件现在 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.load而 src/robot/running/namespace.py 在按路径导入变量文件时也将.json与.yaml/.yml一并纳入识别范围。WHILE 循环的多项增强WHILE 循环在 6.1 中得到多方面增强新增可选的on_limit配置项issue #4562控制达到配置的循环limit时如何处理。默认执行失败设置为PASS则改变该行为。例如下面的循环执行十次后继续执行*** Test Cases *** WHILE with limit and on_limit WHILE True limit10 on_limitPASS Log to console Hello! END Log to console Hello once more!循环条件现在可选issue #4576上面循环头可以简化为WHILE limit10 on_limitPASS新增on_limit_message配置项issue #4575用于设置循环超限且失败时使用的消息。修复了 teardown 中循环 limit 失效的 bugissue #4744。在模型层WHILE相关的condition、limit、on_limit、on_limit_message字段定义于 src/robot/model/control.py执行运行时则对应 src/robot/running/runner.py 中的WhileRunner。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返回的前三个元素匹配期望值无论返回十个元素还是一个都不返回测试都会通过——这会造成自动化成功但实际什么都没做的假阳性*** 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且 Python 长期提供zip_longest函数遍历所有值并为较短列表填充值。为对齐这些能力Robot Framework 的FOR IN ZIP循环新增了可选的mode配置项接受三种取值issue #4682STRICT各列表长度必须相等否则执行失败等价于 Pythonzip的strictTrueSHORTEST较长列表中的元素被忽略只要有一个列表耗尽即可结束且支持无限长列表。这是当前默认行为LONGEST以最长列表决定迭代次数较短列表缺失的值用fill选项指定的值填充未指定时用None。这等价于 Python 的zip_longest只是参数名是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该增强让用户很容易开启严格校验、避免假阳性。不过默认行为仍保持SHORTEST官方计划在未来把默认值改为STRICT希望继续使用SHORTEST模式的用户需要显式指定。新增伪日志级别CONSOLE测试或任务运行期间经常需要向控制台输出日志部分关键字开箱即用地支持另有独立的Log To Console关键字。新的CONSOLE伪日志级别issue #4536把这个能力赋予任何接受日志级别的关键字例如 Collections 库的Log List、SeleniumLibrary 的Page Should Contain等。使用该级别时消息会同时输出到控制台并以INFO级别写入日志文件。运行多个套件时配置虚拟根套件执行robot first.robot second.robot这类多套件命令时Robot Framework 会创建一个包含所有被执行套件作为子套件的虚拟根套件。此前只能通过--name等命令行选项配置这个虚拟套件现在可以直接使用普通的套件初始化文件__init__.robot来配置issue #4015。如果调用中包含了初始化文件例如robot __init__.robot first.robot second.robot根套件将根据该文件中的数据配置。该增强最重要的价值是可以为虚拟根套件指定 suite setup 和 teardown——这在以前完全做不到。异步函数与方法可作为关键字6.1 起使用async def创建的异步函数可以像普通函数一样作为关键字使用issue #4089。例如下面两个异步函数可以作为关键字Gather Something与Async Sleepfrom 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 兼容zipappissue #4613这使得可以仅用zipapp模块或借助 PDM 等外部打包工具创建独立分发的应用。新增翻译6.0 启动了本地化工作并为多种语言提供内建支持6.1 新增越南语支持issue #4792。新的Name设置issue #4583用于为套件自定义名称也已翻译到多种语言但尚未覆盖全部所有支持的语言及精确翻译可查阅用户指南的 Translations 章节。向后不兼容的变更6.1 尽量避免向后不兼容变更尤其是非主版本号但部分特性与修复无法完全兼容。这些变更在常规使用中不应引发问题但使用 Robot Framework 的工具仍可能受影响。output.xml 的变更语法错误如无效设置[Setpu]、位置错误的END等现在报告得更好了issue #4683。变更的一部分是将无效结构以error元素存入 output.xml。以遍历所有元素方式处理 output.xml 的工具需要考虑error元素而仅用 xpath 表达式查询信息的工具一般不受影响。另一个变更是for与while元素可能新增属性FOR IN ENUMERATE循环的for元素可能带有start属性issue #4684FOR IN ZIP循环的for元素可能带有mode与fill属性issue #4682WHILE循环的while元素可能带有on_limitissue #4562与on_limit_messageissue #4575属性。这会影响处理所有可能属性的工具但这类工具应当非常少见。TestSuite模型结构的变更为更好地处理无效语法issue #4683TestSuite模型结构也需要调整语法错误现在表示为Error对象可能出现在TestCase、Keyword及其他此类模型对象的body中。与TestSuite结构交互的工具需要考虑Error对象使用 visitor API 的工具一般不受影响。相关定义见 src/robot/model/control.pyError节点及其to_dict。另一个相关变更是robot.running.Keyword对象上的doc、tags、timeout与teardown属性被移除issue #4589。这些属性是遗留的Robot Framework 自己从未使用过访问它们的工具需要更新。最后TestSuite.source属性现在是pathlib.Path实例而不是字符串issue #4596setter 会自动完成字符串到Path的转换见 src/robot/model/testsuite.py。解析模型的变更无效的节标题如*** Bad ***现在在解析模型中表示为InvalidSection对象而此前是通用的Error对象issue #4689。新增了ReturnSetting对象作为Return的别名。这暂时不改变任何行为但未来Return将用于其他用途使用它的工具应改用ReturnSettingissue #4656。使用--suite选项时不再从解析中排除文件此前使用--suite选项时不匹配指定套件名的文件会从解析中整体排除。这个性能优化在大套件结构中很实用但因为新的Name设置issue #4583使得无法仅凭文件名得知套件名该优化不得不移除issue #4688。受此变更影响的用户可以使用新的--parseinclude选项显式指定要解析哪些文件issue #4687。Libdoc spec 文件的变更Libdoc 此前不能正确处理list[int]这类参数化类型。修复该问题要求在 spec 文件中随顶层类型一并存储嵌套类型信息。除参数化类型外联合类型unions的处理方式也与以往不同普通类型则没有变化。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 ***表头会触发此类错误但其他无效表头只是被报告为错误导入仍然成功。已弃用的特性Python 3.7 支持Python 3.7 将于 2023 年 6 月到达生命周期终点。官方决定在 6.1 及其补丁版本中继续支持 Python 3.7但 7.0 将不再支持issue #4637。此前 Python 3.6 也已按相同方式弃用它于 2021 年 12 月到达终点之所以仍支持它是因为它是 Red Hat Enterprise Linux 8 的默认 Python 版本而该系统仍在积极支持期内。Libdoc spec 文件中的旧元素Libdoc spec 文件在最近几个版本中持续增强。为向后兼容旧信息被保留但所有这些数据将在 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 发布说明中还列出了大量中低优先级增强其中部分同样值得关注支持带连字符的长命令行选项如--pre-run-modifierissue #4547新增robot.running.TestSuite.from_string方法issue #4601多个关键字冲突时先按搜索顺序解析冲突issue #4609支持只接受*varargs的自定义转换器issue #4627Dynamic API 支持仅位置参数positional-onlyissue #4660新增公共 API 查询 Robot 是否在运行、dry-run 是否激活issue #4666IF/WHILE 条件求值失败时建议改用$var语法issue #4676报告语法错误时在日志文件中表现更好issue #4683FOR IN ENUMERATE的 start 索引在解析器中处理issue #4684文档中的前导与内部空格应被保留issue #4729结果对象新增前向兼容的start_time、end_time、elapsed_time属性issue #4765自动解析.robot.rst扩展名文件issue #4777增强以编程方式创建资源文件的 APIissue #4793。结语Robot Framework 6.1 是一个面向扩展生态的功能版本JSON 数据格式让套件可以脱离文件系统在进程与机器间流动外部解析器 API 则为自定义数据格式铺平了道路这两者都直接面向工具开发者而对普通用户而言robot:flatten标签、WHILE 与 FOR IN ZIP 的配置化增强、JSON 变量文件、异步关键字、CONSOLE伪日志级别以及虚拟根套件初始化文件支持都显著提升了自动化脚本的表达力与可维护性。与此同时6.1 在 output.xml 结构、TestSuite模型、参数转换与解析模型上的行为调整意味着依赖这些内部结构的既有工具在升级时需要进行相应适配。完整的问题与增强清单共 77 项收录于发布说明文件 doc/releasenotes/rf-6.1.rst相关实现可在 src/robot/running、src/robot/model 与 src/robot/api 中继续深入研读。赞分享测试RPA接口测试【免费下载链接】robotframeworkGeneric automation framework for acceptance testing and RPA项目地址https://gitcode.com/gh_mirrors/ro/robotframework点击查看免费下载相关推荐Robot Framework 6.1 Beta 1 全解析JSON 数据格式、外部解析器 API 与新关键字特性Robot Framework 6.1 Beta 1 全解析JSON 数据格式、外部解析器 API 与新关键字特性 导读 本文基于仓库 doc/release测试RPA接口测试Robot Framework 6.1 Alpha 1 技术详解JSON 数据格式、执行期扁平化与 FOR IN ZIP 新模式Robot Framework 6.1 Alpha 1 技术详解JSON 数据格式、执行期扁平化与 FOR IN ZIP 新模式 本文基于 Robot Fra测试RPA接口测试Robot Framework 7.2rc1 特性解析JSON 输出、GROUP 语法、新 Libdoc 与字节处理增强Robot Framework 7.2rc1 特性解析JSON 输出、GROUP 语法、新 Libdoc 与字节处理增强 Robot Framework 7.测试RPA接口测试创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考