Robot Framework API 使用指南:从命令行入口点到 `robot.api` 公共 API 的完整解读
2026/9/23 11:04:46 网站建设 项目流程
  • 测试
  • RPA
  • 接口测试

【免费下载链接】robotframework

Generic automation framework for acceptance testing and RPA

项目地址:https://gitcode.com/gh_mirrors/ro/robotframework
点击查看免费下载

本篇技术指南基于仓库中 doc/api/index.rst 这一 API 文档入口,系统梳理 Robot Framework 的编程接口体系:四大命令行入口点(robot.runrobot.rebotrobot.libdocrobot.testdoc)、robot.api包暴露的稳定公共 API(logger、deco、exceptions、interfaces、parsing)、以及robot.api之外与结果处理、套件构建相关的核心类。读完本文,你将掌握如何在 Python 中通过编程方式驱动测试执行、结果后处理与文档生成,并学会利用SuiteVisitorResultVisitorExecutionResultResultWriter等类构建自定义工具与扩展,同时了解如何基于源码定位每个 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 robotrun()run_cli()
robot.rebot结果后处理(Rebot)rebot/python -m robot.rebotrebot()rebot_cli()
robot.libdoc库文档生成(Libdoc)libdoc/python -m robot.libdoclibdoc_cli()libdoc()
robot.testdoc测试用例文档生成(Testdoc)testdoc/python -m robot.testdoctestdoc_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()的参数映射规则值得注意:

  • 选项名:与命令行长选项去掉连字符一一对应,如--namename
  • 可重复选项:以列表传递,如include=['tag1','tag2']等价于--include tag1 --include tag2,单次使用也可传字符串;
  • 无值选项:以布尔值传递,如dryrun=True等价于--dryrun
  • 特殊值NONE:可用 PythonNone,如log=None等价于--log NONE
  • 对象直传listenerprerunmodifierprerebotmodifier支持直接传 Python 对象(如run('tests', listener=MyListener())),而命令行只能传模块名;
  • 输出捕获:可通过特殊关键字参数stdoutstderr传入文件对象捕获标准输出/错误;
  • 不支持--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.libdocrobot.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)

日志级别TRACEDEBUGINFOWARNERROR,分别对应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 未运行时调用,消息会被重定向到标准 Pythonlogging模块(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_namerobot_tagsrobot_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重新开启。其余参数分别设置类属性:

参数设置的类属性含义
scopeROBOT_LIBRARY_SCOPE库作用域(GLOBAL/SUITE/TEST/TASK)
versionROBOT_LIBRARY_VERSION库版本
convertersROBOT_LIBRARY_CONVERTERS类型转换器(Robot Framework 5.0 新增)
doc_formatROBOT_LIBRARY_DOC_FORMAT文档格式(ROBOT/HTML/TEXT/REST)
listenerROBOT_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

异常继承用途关键类属性
FailureAssertionError报告校验失败ROBOT_SUPPRESS_NAME = True
ContinuableFailureFailure报告失败但允许继续执行ROBOT_CONTINUE_ON_FAILURE = True
ErrorRuntimeError报告执行错误(如关键字被误用)ROBOT_SUPPRESS_NAME = True
FatalErrorError报告会终止整个执行的错误ROBOT_EXIT_ON_FAILURE = True
SkipExecutionException将当前测试/任务标记为跳过ROBOT_SKIP_EXECUTION = True

FailureErrorSkipExecution的构造函数均接受messagehtml两个参数,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_suitestart_test/end_teststart_keyword/end_keywordlog_messagemessagelibrary_importresource_importvariables_importoutput_filelog_filereport_filexunit_filedebug_fileclose等方法。方法签名中的属性字典均以TypedDict形式给出类型契约(如StartSuiteAttributesStartKeywordAttributesMessageAttributes等)。
  • ListenerV3:监听器 API 版本 3 的基类(ROBOT_LISTENER_API_VERSION = 3),回调接收运行期模型对象running.TestSuiteresult.TestSuite等)。从 7.0 起新增了针对用户关键字/库关键字/无效关键字(start_user_keyword等)以及 FOR/WHILE/IF/TRY/VAR/BREAK/CONTINUE/RETURN/GROUP 等控制结构(start_forstart_whilestart_ifstart_trystart_varstart_breakstart_continuestart_returnstart_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_tokensget_modelToken等),但新代码应优先从robot.api.parsing导入。

3.6robot.api直接暴露的核心类

除了上述子模块,robot.api顶层还直接暴露一批高频使用的类,导入方式统一为from robot.api import ClassName

TestSuiteTestSuiteBuilder
  • 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.TestSuite
SuiteVisitor:执行前修改测试数据

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.robot
ExecutionResultResultVisitor:读取与后处理结果
  • 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 文件。其输入有两种来源:

  1. 文件系统上的 XML 输出(字符串路径);
  2. 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 新增)用于解析类型提示并据此转换值,供外部工具使用。

LanguagesLanguage:本地化支持

LanguagesLanguage(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.apisrc/robot/api/稳定公共 API(本文第三章)
robot.confsrc/robot/conf/设置(RobotSettings)、语言/本地化、解析配置
robot.htmldatasrc/robot/htmldata/log/report/libdoc/testdoc 的 HTML/JS/CSS 资源
robot.libdocpkgsrc/robot/libdocpkg/Libdoc 工具核心实现
robot.librariessrc/robot/libraries/标准库(BuiltIn、Collections、DateTime 等)
robot.modelsrc/robot/model/模型基类与访问者(含SuiteVisitor
robot.outputsrc/robot/output/日志、控制台输出、监听器分发
robot.parsingsrc/robot/parsing/词法分析(lexer)、解析器(parser)、模型
robot.reportingsrc/robot/reporting/结果写出(ResultWriter)、JS 模型构建
robot.resultsrc/robot/result/结果模型与读取(ExecutionResultResultVisitor
robot.runningsrc/robot/running/运行期模型(TestSuiteTestSuiteBuilder)、执行器
robot.utilssrc/robot/utils/通用工具(Matcher、文本处理、连接管理等)
robot.variablessrc/robot/variables/变量存储与解析

每个包的详细 API 文档见 doc/api/autodoc/ 目录下对应的.rst文件(由 automodule 自动从源码 docstring 生成,配置见 doc/api/autodoc/robot.api.rst 等文件)。

五、从入口点到底层的调用链剖析

robot run为例,可以清晰地看到公共 API 如何串联起整个执行流程。RobotFramework.main()(src/robot/run.py)的执行链为:

  1. RobotSettings(options):将选项解析为设置对象(src/robot/conf/ 包);
  2. TestSuiteBuilder(...).build(*datasources):依据--extension--parseinclude--parser--rpa--language等选项构建套件;
  3. suite.visit(ModelModifier(...)):应用--prerunmodifier指定的修改器(这正是 doc/api/code_examples/ExcludeTests.py 等SuiteVisitor子类被调用的位置);
  4. suite.run(settings):执行测试并返回结果对象;
  5. ResultWriter(...).write_results(...):按--log/--report/--xunit配置写出结果文件;
  6. 最终返回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.0robot.api.exceptions及其异常类新增;robot.api.parsing模块正式推出(原robot.api顶层解析符号进入废弃通道);
  • 5.0@libraryconverters参数新增;
  • 6.1robot.api.interfacesDynamicLibraryHybridLibraryListenerV2ListenerV3Parser基类)新增;logger增加CONSOLE伪级别;
  • 7.0TypeInfo新增;ListenerV3大幅扩展(用户/库/无效关键字及控制结构回调、start_body_item/end_body_item兜底);
  • 7.1ListenerV3library_import/resource_import改为接收可检查、可修改的导入对象;
  • 7.2ListenerV3增加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.apirobot根包导出项(run/run_cli/rebot/rebot_cli)之外的模块属于内部实现,可能随时变化(见 src/robot/init.py 的明确声明)。将自定义代码建立在这些稳定 API 之上,才能在框架升级时保持兼容。

  • 测试
  • RPA
  • 接口测试

【免费下载链接】robotframework

Generic automation framework for acceptance testing and RPA

项目地址:https://gitcode.com/gh_mirrors/ro/robotframework
点击查看免费下载
上一篇:pg8000: Python连接PostgreSQL的纯Python驱动
下一篇:MiaoProject 使用教程

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询