- 测试
- RPA
- 接口测试
【免费下载链接】robotframework
Generic automation framework for acceptance testing and RPA
本篇技术指南基于仓库中 doc/api/index.rst 这一 API 文档入口,系统梳理 Robot Framework 的编程接口体系:四大命令行入口点(robot.run、robot.rebot、robot.libdoc、robot.testdoc)、robot.api包暴露的稳定公共 API(logger、deco、exceptions、interfaces、parsing)、以及robot.api之外与结果处理、套件构建相关的核心类。读完本文,你将掌握如何在 Python 中通过编程方式驱动测试执行、结果后处理与文档生成,并学会利用SuiteVisitor、ResultVisitor、ExecutionResult、ResultWriter等类构建自定义工具与扩展,同时了解如何基于源码定位每个 API 的实现位置。
适用前提:本文所述 API 行为以当前仓库(版本
7.2rc2.dev1,见 src/robot/version.py)的实现为准,不同版本之间的 API 细节可能有差异;文中所有示例均需在安装了本仓库源码的 Python 3 环境中运行。
一、API 文档入口与整体定位
doc/api/index.rst 是 Robot Framework 官方 API 文档的入口页(Sphinx 项目,构建配置见 doc/api/conf.py,构建辅助脚本见 doc/api/generate.py)。该页面的核心定位是:
- 公开 API 说明:描述
robot.api公共 API 及四个命令行入口点; - 安装与基本使用指引:安装、基本用法等话题由用户指南(User Guide)覆盖,API 文档页本身聚焦于编程接口;
- 问题与 Bug 反馈渠道:API 相关问题可通过 Slack、Forum、邮件列表提问,发现 Bug 可提交 issue;
- 包索引:通过 toctree 收录
autodoc/robot*一系列包级文档(如 doc/api/autodoc/robot.api.rst、doc/api/autodoc/robot.running.rst、doc/api/autodoc/robot.result.rst 等),并生成 genindex(通用索引)、modindex(模块索引)与 search 索引。
从索引结构可以看出,API 文档划分为三大板块:Entry points(入口点)、Public API(公共 API)与All packages(全部包)。本文后续章节将依次深入这三个板块。
二、命令行入口点:四把"钥匙"与其编程等价物
索引页明确指出:命令行入口点以 Python 模块形式实现,同时提供编程式 API。四个入口点分别是:
| 入口点模块 | 用途 | 命令行形态 | 编程 API |
|---|---|---|---|
robot.run | 执行测试(及 RPA 任务) | robot/python -m robot | run()、run_cli() |
robot.rebot | 结果后处理(Rebot) | rebot/python -m robot.rebot | rebot()、rebot_cli() |
robot.libdoc | 库文档生成(Libdoc) | libdoc/python -m robot.libdoc | libdoc_cli()、libdoc() |
robot.testdoc | 测试用例文档生成(Testdoc) | testdoc/python -m robot.testdoc | testdoc_cli()、testdoc() |
2.1robot.run:执行测试
src/robot/run.py 的模块 docstring 说明了三种命令行执行方式:
python -m robot.run python path/to/robot/run.py robot # 安装后生成的 start-up 脚本其编程式入口在根包中统一暴露(见 src/robot/init.py),可直接from robot import run, run_cli。
run_cli(arguments=None, exit=True):接收命令行参数列表(默认sys.argv[1:]),内部通过RobotFramework().execute_cli(arguments, exit=exit)完成参数解析并执行(src/robot/run.py)。它适合"自定义脚本需要透传 Robot 命令行参数"的场景:
from robot import run_cli # 运行测试并返回返回码 rc = run_cli(['--name', 'Example', 'tests.robot'], exit=False) # 运行测试并自动退出系统 run_cli(['--name', 'Example', 'tests.robot'])run(*tests, **options):更丰富的编程式执行入口(src/robot/run.py),选项以关键字参数形式传递:
from robot import run run('path/to/tests.robot') run('tests.robot', include=['tag1', 'tag2'], splitlog=True) with open('stdout.txt', 'w') as stdout: run('t1.robot', 't2.robot', name='Example', log=None, stdout=stdout)run()的参数映射规则值得注意:
- 选项名:与命令行长选项去掉连字符一一对应,如
--name→name; - 可重复选项:以列表传递,如
include=['tag1','tag2']等价于--include tag1 --include tag2,单次使用也可传字符串; - 无值选项:以布尔值传递,如
dryrun=True等价于--dryrun; - 特殊值
NONE:可用 PythonNone,如log=None等价于--log NONE; - 对象直传:
listener、prerunmodifier、prerebotmodifier支持直接传 Python 对象(如run('tests', listener=MyListener())),而命令行只能传模块名; - 输出捕获:可通过特殊关键字参数
stdout、stderr传入文件对象捕获标准输出/错误; - 不支持:
--pythonpath、--argumentfile、--help、--version四个选项; - 返回码:与命令行一致——0 表示全部通过,1–250 表示失败数量,251–255 表示其他状态(详见 src/robot/run.py 中 Return Codes 一节)。
2.2robot.rebot:输出后处理
Rebot 用于对output.xml进行后处理:合并多个输出、过滤、生成 log/report、生成 xUnit 等。编程式调用为rebot()与rebot_cli(),由 src/robot/rebot.py 实现,同样在根包中导出(src/robot/init.py)。
2.3robot.libdoc与robot.testdoc:文档生成
- Libdoc:为库/资源文件生成 HTML、XML(libspec)、JSON 格式的文档,实现见 src/robot/libdoc.py(核心逻辑在 src/robot/libdocpkg/ 包中)。编程式调用
libdoc_cli()、libdoc()需按from robot.libdoc import libdoc_cli方式导入。 - Testdoc:根据测试用例数据生成 HTML 文档,实现见 src/robot/testdoc.py。
索引页特别强调:与命令行入口点相关的 API 直接通过robot根包暴露(robot.api的 docstring 中的 tip 也说明了这一点,见 src/robot/api/init.py),因此from robot import run, run_cli, rebot, rebot_cli是最常见的导入方式。根包中__all__ = ['run', 'run_cli', 'rebot', 'rebot_cli'](src/robot/init.py)进一步明确了稳定契约。
三、robot.api:稳定的公共 API 包
src/robot/api/init.py 的 docstring 给出了核心承诺:除非另有说明,该包暴露的 API 均视为稳定,可安全用于构建基于 Robot Framework 的外部工具。同时有一个重要历史信息:所有解析(parsing)相关 API 在 Robot Framework 3.2 中被重写。
所有类均可按from robot.api import ClassName方式导入。下面逐一展开robot.api的子模块与核心类。
3.1robot.api.logger:库内日志 API
src/robot/api/logger.py 为测试库提供了向日志文件与控制台写入消息的公共 API,替代早期通过标准输出print('*INFO* My message')这种脆弱写法。使用方式:
from robot.api import logger def my_keyword(arg): logger.debug(f'Got argument {arg}.') do_something() logger.info('<i>This</i> is a boring example.', html=True)日志级别:TRACE、DEBUG、INFO、WARN、ERROR,分别对应trace()、debug()、info()、warn()、error()函数;通用入口write(msg, level, html)还支持两个伪级别:
HTML:按 HTML 格式写入日志(文件中级别记为 INFO);CONSOLE:同时写入日志文件与控制台(Robot Framework 6.1 新增)。
关键行为(可从 src/robot/api/logger.py 的write()实现确认):
- TRACE 与 DEBUG 默认不输出,需通过
--loglevel命令行选项调整阈值; - WARN 与 ERROR 会自动写入控制台,并出现在日志的Test Execution Errors区段;
- 所有写日志方法都带可选
html参数,为True时消息按 HTML 渲染; - 若在 Robot Framework 未运行时调用,消息会被重定向到标准 Python
logging模块(logger 名为RobotFramework)——实现依据是EXECUTION_CONTEXTS.current is not None的判断; - 相比标准输出方式,该 API 生成的日志消息带有准确时间戳。
info(msg, html=False, also_console=False)的also_console=True可让消息同时出现在控制台;console(msg, newline=True, stream='stdout')则专门写控制台(可指定stderr)。
3.2robot.api.deco:库开发装饰器
src/robot/api/deco.py 提供三个装饰器(新增于 Robot Framework 3.2):
@keyword:为关键字设置自定义名称、标签和参数类型。实现上通过设置robot_name、robot_tags、robot_types三个属性完成(src/robot/api/deco.py):
from robot.api.deco import keyword @keyword def example(): # ... @keyword('Login as user "${user}" with password "${password}"', tags=['custom name', 'embedded arguments', 'tags']) def login(user, password): # ... @keyword(types={'length': int, 'case_insensitive': bool}) def types_as_dict(length, case_insensitive): # ... @keyword(types=[int, bool]) def types_as_list(length, case_insensitive): # ... @keyword(types=None) def no_conversion(length, case_insensitive=False): # ...types可以是"参数名 → 类型"的字典,也可以按位置排列的类型列表;types=None完全禁用类型转换;当库关闭了自动关键字发现时,@keyword是显式标记关键字的必需手段。
@library:库级装饰器,控制关键字发现及其他库设置。默认在类上设置ROBOT_AUTO_KEYWORDS = False(即关闭自动关键字发现,只有@keyword标记的方法才成为关键字),可通过auto_keywords=True重新开启。其余参数分别设置类属性:
| 参数 | 设置的类属性 | 含义 |
|---|---|---|
scope | ROBOT_LIBRARY_SCOPE | 库作用域(GLOBAL/SUITE/TEST/TASK) |
version | ROBOT_LIBRARY_VERSION | 库版本 |
converters | ROBOT_LIBRARY_CONVERTERS | 类型转换器(Robot Framework 5.0 新增) |
doc_format | ROBOT_LIBRARY_DOC_FORMAT | 文档格式(ROBOT/HTML/TEXT/REST) |
listener | ROBOT_LIBRARY_LISTENER | 库内监听器 |
from robot.api.deco import library @library class KeywordDiscovery: @keyword def do_something(self): # ... def not_keyword(self): # ... @library(scope='GLOBAL', version='3.2') class LibraryConfiguration: # ...@not_keyword:禁止某函数/方法被暴露为关键字,实现为在函数上设置robot_not_keyword = True属性(src/robot/api/deco.py)。替代方案是@library或类属性ROBOT_AUTO_KEYWORDS设为假值。
3.3robot.api.exceptions:库内异常体系
src/robot/api/exceptions.py 提供库与框架通信"失败/跳过"等事件的异常(Robot Framework 4.0 新增),既可通过from robot.api.exceptions import ...导入,也可直接from robot.api import SkipExecution。
| 异常 | 继承 | 用途 | 关键类属性 |
|---|---|---|---|
Failure | AssertionError | 报告校验失败 | ROBOT_SUPPRESS_NAME = True |
ContinuableFailure | Failure | 报告失败但允许继续执行 | ROBOT_CONTINUE_ON_FAILURE = True |
Error | RuntimeError | 报告执行错误(如关键字被误用) | ROBOT_SUPPRESS_NAME = True |
FatalError | Error | 报告会终止整个执行的错误 | ROBOT_EXIT_ON_FAILURE = True |
SkipExecution | Exception | 将当前测试/任务标记为跳过 | ROBOT_SKIP_EXECUTION = True |
Failure、Error、SkipExecution的构造函数均接受message与html两个参数,html=True时消息被视为 HTML 不被转义(实现上消息会加上*HTML*前缀,见 src/robot/api/exceptions.py)。
使用建议(来自 docstring):系统行为不符合预期时用Failure或标准AssertionError;关键字使用方式错误时用Error;需要跳过测试时抛SkipExecution。这些异常通过ROBOT_*类属性被框架识别并驱动对应行为(继续执行、退出执行、跳过等)。
3.4robot.api.interfaces:可选基类(6.1 新增)
src/robot/api/interfaces.py 提供库与其他扩展的可选基类(Robot Framework 6.1 新增)。注意:这些类不通过顶层robot.api暴露,需from robot.api.interfaces import ...导入。主要价值在于编辑器可以据此提供自动补全、文档与类型信息,并非强制使用。包含:
DynamicLibrary:动态库 API 的基类。必须实现get_keyword_names()(返回关键字名列表)与run_keyword(name, args, named)(执行关键字);可选实现get_keyword_documentation()、get_keyword_arguments()、get_keyword_types()、get_keyword_tags()、get_keyword_source()。其中参数规范(get_keyword_arguments)支持普通参数、*varargs、**kwargs、命名专属参数(*分隔符)、带默认值参数(name=default或二元组('name', default)形式,二元组支持非字符串默认值与自动类型转换)等完整语法。HybridLibrary:混合库 API 基类,只需实现get_keyword_names(),框架通过getattr取得实际关键字方法(与静态库 API 相同机制);关键字也可在类外实现,通过库的__getattr__返回。ListenerV2:监听器 API 版本 2 的基类,设置ROBOT_LISTENER_API_VERSION = 2,提供start_suite/end_suite、start_test/end_test、start_keyword/end_keyword、log_message、message、library_import、resource_import、variables_import、output_file、log_file、report_file、xunit_file、debug_file、close等方法。方法签名中的属性字典均以TypedDict形式给出类型契约(如StartSuiteAttributes、StartKeywordAttributes、MessageAttributes等)。ListenerV3:监听器 API 版本 3 的基类(ROBOT_LISTENER_API_VERSION = 3),回调接收运行期模型对象(running.TestSuite、result.TestSuite等)。从 7.0 起新增了针对用户关键字/库关键字/无效关键字(start_user_keyword等)以及 FOR/WHILE/IF/TRY/VAR/BREAK/CONTINUE/RETURN/GROUP 等控制结构(start_for、start_while、start_if、start_try、start_var、start_break、start_continue、start_return、start_group等)的细粒度回调,并引入start_body_item/end_body_item作为默认兜底实现;7.1 起library_import/resource_import可直接接收并修改导入对象。Parser:自定义解析器基类,需提供extension属性与parse方法,可选parse_init(详细定义见 src/robot/api/interfaces.py 之后的内容)。
3.5robot.api.parsing与解析 API
解析相关 API 全部封装在robot.api.parsing模块(Robot Framework 4.0 起)。在 3.2 时代,解析函数与类直接通过robot.api顶层暴露,如今已实际废弃并计划未来移除。当前建议的导入方式:
from robot.api.parsing import get_model, get_resource_model, get_init_model from robot.api.parsing import get_tokens, get_resource_tokens, get_init_tokens from robot.api.parsing import Token从 src/robot/api/init.py 可以看到,robot.api仍在为兼容性转发这些符号(get_tokens、get_model、Token等),但新代码应优先从robot.api.parsing导入。
3.6robot.api直接暴露的核心类
除了上述子模块,robot.api顶层还直接暴露一批高频使用的类,导入方式统一为from robot.api import ClassName:
TestSuite与TestSuiteBuilder
TestSuite(src/robot/running/model.py):用于程序化创建可执行测试套件;TestSuiteBuilder(src/robot/running/builder.py):基于文件系统上已有的测试数据构建套件。
组合使用即可实现"先构建、再修改、后执行"的完整流水线:
from robot.api import TestSuiteBuilder, TestSuite from robot.running import TestSuite as RunningSuite # 或使用 robot.api.TestSuiteSuiteVisitor:执行前修改测试数据
SuiteVisitor(src/robot/model/visitor.py)是抽象访问者基类,用于在执行前处理测试数据,同时是--prerunmodifier命令行选项的基类。仓库自带两个可运行的完整示例:
doc/api/code_examples/ExcludeTests.py —— 按名称排除测试的 pre-run modifier:
from robot.api import SuiteVisitor from robot.utils import Matcher class ExcludeTests(SuiteVisitor): def __init__(self, pattern): self.matcher = Matcher(pattern) def start_suite(self, suite): suite.tests = [t for t in suite.tests if not self._is_excluded(t)] def _is_excluded(self, test): return self.matcher.match(test.name) or self.matcher.match(test.longname) def end_suite(self, suite): suite.suites = [s for s in suite.suites if s.test_count > 0] def visit_test(self, test): pass # 避免访问测试及其关键字以节省时间doc/api/code_examples/disable.py —— 禁用套件/测试级 setup 与 teardown 的四个 modifier:
from robot.api import SuiteVisitor class SuiteSetup(SuiteVisitor): def start_suite(self, suite): suite.setup = None class SuiteTeardown(SuiteVisitor): def start_suite(self, suite): suite.teardown = None class TestSetup(SuiteVisitor): def start_test(self, test): test.setup = None class TestTeardown(SuiteVisitor): def start_test(self, test): test.teardown = None命令行启用方式(以ExcludeTests为例,模式同时忽略大小写与空格,支持*、?通配符):
robot --prerunmodifier ExcludeTests:pattern tests.robotExecutionResult与ResultVisitor:读取与后处理结果
ExecutionResult(src/robot/result/resultbuilder.py):从 XML 输出文件读取执行结果的工厂方法;ResultVisitor(src/robot/result/visitor.py):抽象访问者基类,简化结果的进一步处理,同时是--prerebotmodifier命令行选项的基类。
典型用法是在执行结束后加载output.xml并访问结果模型:
from robot.api import ExecutionResult result = ExecutionResult('output.xml') result.suite.visit(MyResultVisitor())ResultWriter:写日志/报告/XML/xUnit
ResultWriter(src/robot/reporting/resultwriter.py)用于写出报告、日志、XML 输出与 xUnit 文件。其输入有两种来源:
- 文件系统上的 XML 输出(字符串路径);
ExecutionResult返回的结果对象,或已执行的TestSuite。
在 src/robot/run.py 中可以看到框架自身的用法——测试执行结束后,若配置了 log/report/xunit,则用ResultWriter(settings.output if settings.log else result)写出结果:
if settings.log or settings.report or settings.xunit: writer = ResultWriter(settings.output if settings.log else result) writer.write_results(settings.get_rebot_settings())TypeInfo:类型提示解析与值转换(7.0 新增)
TypeInfo(src/robot/running/arguments/typeinfo.py,Robot Framework 7.0 新增)用于解析类型提示并据此转换值,供外部工具使用。
Languages与Language:本地化支持
Languages与Language(src/robot/conf/languages.py)面向需要处理不同翻译(本地化)的外部工具;Language同时是自定义翻译的基类。它们支持通过--language命令行选项激活内置语言或加载自定义语言文件(自定义语言文件可以是路径或模块名)。
3.7 类型信息分发承诺
robot.api的 docstring 明确承诺遵循 PEP 484 定义的"类型信息分发规范"(distributing type information specification),这意味着这些 API 带有可靠的类型注解,IDE 与静态检查工具可以依赖它们。
四、All packages:robot包全景与内部模块定位
索引页强调:通常情况下你不需要直接导入robot包下的内部模块——它们的存在是为了让你处理公共 API 返回的对象。索引页列出的全部包如下,这里给出每个包在当前仓库中的实现位置与职责:
| 包 | 源码路径 | 职责 |
|---|---|---|
robot.api | src/robot/api/ | 稳定公共 API(本文第三章) |
robot.conf | src/robot/conf/ | 设置(RobotSettings)、语言/本地化、解析配置 |
robot.htmldata | src/robot/htmldata/ | log/report/libdoc/testdoc 的 HTML/JS/CSS 资源 |
robot.libdocpkg | src/robot/libdocpkg/ | Libdoc 工具核心实现 |
robot.libraries | src/robot/libraries/ | 标准库(BuiltIn、Collections、DateTime 等) |
robot.model | src/robot/model/ | 模型基类与访问者(含SuiteVisitor) |
robot.output | src/robot/output/ | 日志、控制台输出、监听器分发 |
robot.parsing | src/robot/parsing/ | 词法分析(lexer)、解析器(parser)、模型 |
robot.reporting | src/robot/reporting/ | 结果写出(ResultWriter)、JS 模型构建 |
robot.result | src/robot/result/ | 结果模型与读取(ExecutionResult、ResultVisitor) |
robot.running | src/robot/running/ | 运行期模型(TestSuite、TestSuiteBuilder)、执行器 |
robot.utils | src/robot/utils/ | 通用工具(Matcher、文本处理、连接管理等) |
robot.variables | src/robot/variables/ | 变量存储与解析 |
每个包的详细 API 文档见 doc/api/autodoc/ 目录下对应的.rst文件(由 automodule 自动从源码 docstring 生成,配置见 doc/api/autodoc/robot.api.rst 等文件)。
五、从入口点到底层的调用链剖析
以robot run为例,可以清晰地看到公共 API 如何串联起整个执行流程。RobotFramework.main()(src/robot/run.py)的执行链为:
RobotSettings(options):将选项解析为设置对象(src/robot/conf/ 包);TestSuiteBuilder(...).build(*datasources):依据--extension、--parseinclude、--parser、--rpa、--language等选项构建套件;suite.visit(ModelModifier(...)):应用--prerunmodifier指定的修改器(这正是 doc/api/code_examples/ExcludeTests.py 等SuiteVisitor子类被调用的位置);suite.run(settings):执行测试并返回结果对象;ResultWriter(...).write_results(...):按--log/--report/--xunit配置写出结果文件;- 最终返回
result.return_code(0–255 的返回码语义见前文 2.1 节)。
这一链条印证了索引页"命令行入口点是 Python 模块,同时提供编程式 API"的论断——run()与run_cli()只是同一执行管线(RobotFramework应用类)的两种调用形态(src/robot/run.py)。
六、API 版本演进速览
结合各模块 docstring 中的"New in ..."标注,可以快速梳理公共 API 的关键演进节点(以当前仓库为准):
- 3.2:解析 API 全面重写;
@keyword、@library、@not_keyword装饰器新增;解析类开始直接暴露于robot.api; - 4.0:
robot.api.exceptions及其异常类新增;robot.api.parsing模块正式推出(原robot.api顶层解析符号进入废弃通道); - 5.0:
@library的converters参数新增; - 6.1:
robot.api.interfaces(DynamicLibrary、HybridLibrary、ListenerV2、ListenerV3、Parser基类)新增;logger增加CONSOLE伪级别; - 7.0:
TypeInfo新增;ListenerV3大幅扩展(用户/库/无效关键字及控制结构回调、start_body_item/end_body_item兜底); - 7.1:
ListenerV3的library_import/resource_import改为接收可检查、可修改的导入对象; - 7.2:
ListenerV3增加start_group/end_group(GROUP 结构)。
七、结语:如何把 API 文档"用起来"
回到 doc/api/index.rst 的定位——它是理解 Robot Framework 编程接口的导航图:
- 写库扩展:用 src/robot/api/deco.py 的装饰器控制关键字发现,用 src/robot/api/logger.py 输出结构化日志,用 src/robot/api/exceptions.py 表达失败/跳过语义,复杂库可继承 src/robot/api/interfaces.py 的
DynamicLibrary/HybridLibrary基类; - 写外部工具:用
run()/rebot()编程式驱动执行与后处理,用TestSuiteBuilder+SuiteVisitor在执行前改造套件,用ExecutionResult+ResultVisitor+ResultWriter读取并重新生成结果; - 查阅细节:每个 API 的自动化文档由 doc/api/autodoc/ 下的
.rst从源码 docstring 生成,遇到签名细节可直接查阅对应源码模块;utest/api/目录下的单元测试(如 utest/api/test_exposed_api.py、utest/api/test_run_and_rebot.py)可作为 API 行为验证的参考。
稳定性边界:请牢记robot.api与robot根包导出项(run/run_cli/rebot/rebot_cli)之外的模块属于内部实现,可能随时变化(见 src/robot/init.py 的明确声明)。将自定义代码建立在这些稳定 API 之上,才能在框架升级时保持兼容。
- 测试
- RPA
- 接口测试
【免费下载链接】robotframework
Generic automation framework for acceptance testing and RPA
相关推荐
AnimateDiff自适应运动模块架构解析:下一代动态视频生成解决方案
AnimateDiff自适应运动模块架构解析:下一代动态视频生成解决方案 AnimateDiff作为基于Stable Diffusion的动画生成框架,通过创新
测试RPA接口测试Robot Framework 顶层 `robot` 包解析:公开 API、命令行入口与子包结构
Robot Framework 顶层 robot 包解析:公开 API、命令行入口与子包结构 导读 本文以仓库中的 API 文档页 doc/api/autodo
测试RPA接口测试从源码到实践:深入理解 ha-bridge 的 Hue 模拟器(HueMulator)工作原理
从源码到实践:深入理解 ha bridge 的 Hue 模拟器(HueMulator)工作原理 ha bridge 是一款强大的智能家居桥接工具,它通过模拟 P
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考