lyyyuna 的小花园

动静中之动, by

RSS

Robot Framework 新版教程 - 配置执行

发表于 2026-04

配置执行

本节解释可以用于配置测试执行后处理输出的各种命令行选项。与生成的输出文件相关的选项将在下一节讨论。

选择要解析的文件

执行单个文件

当执行单个文件时,Robot Framework 会尝试解析并运行它们,而不管文件名或扩展名。使用哪个解析器取决于扩展名:

示例:

robot example.robot    # 标准 Robot Framework 解析器。
robot example.tsv      # 必须兼容标准解析器。
robot example.rst      # reStructuredText 解析器。
robot x.robot y.rst    # 使用合适的解析器解析两个文件。

包含和排除的文件

当执行一个目录时,文件和目录按以下规则解析:

按名称或路径选择文件

当执行一个目录时,可以使用 --parseinclude (-I) 选项根据文件名或路径只解析特定文件。该选项的语义因使用的值不同而略有差异:

示例:

robot --parseinclude example.robot tests       # 解析 `tests` 下任意位置的 `example.robot` 文件。
robot -I example_*.robot -I ???.robot tests    # 解析 `tests` 下匹配 `example_*.robot` 或 `???.robot` 的文件。
robot -I tests/example.robot tests             # 只解析 `tests/example.robot`。
robot --parseinclude tests/example tests       # 递归解析 `tests/example` 目录下的文件。

--parseinclude 使用的值不区分大小写,并支持类似 example_*.robot 的 glob 模式。不过,与 Robot Framework 中模式的通常工作方式相比有两个小差异:

如果模式包含扩展名,即使该扩展名的文件默认不会被解析,也会被解析。使用哪个解析器取决于扩展名:

注意,当你使用类似 *.robot 的模式并且执行目录中存在匹配该模式的文件时,shell 可能会在调用 Robot Framework 之前解析该模式,传递给它的值将是文件名而不是原始模式。在这种情况下,你需要像 '*.robot'\*.robot 这样对模式进行引用或转义。

--parseinclude 是 Robot Framework 6.1 中的新功能。

按扩展名选择文件

除了使用上一节讨论的 --parseinclude 选项外,还可以使用 --extension (-F) 选项来启用对默认不解析的文件的解析。扩展名匹配不区分大小写,且可以省略前导点。如果需要解析多种文件,可以使用冒号 : 分隔扩展名:

robot --extension rst path/to/tests    # 只解析 *.rst 文件。
robot -F robot:rst path/to/tests       # 解析 *.robot 和 *.rst 文件。

上述命令等价于以下 --parseinclude 用法:

robot --parseinclude *.rst path/to/tests
robot -I *.robot -I *.rst path/to/tests

由于 --parseinclude 选项更强大且涵盖了 --extension 选项的所有使用场景,后者将来可能会被弃用。建议用户现在就使用 --parseinclude

使用自定义解析器

外部解析器可以解析 Robot Framework 无法识别的文件。关于创建和使用此类解析器的更多信息,请参阅解析器接口章节。

选择测试用例

Robot Framework 提供了多个命令行选项用于选择要执行的测试用例。这些选项在执行任务以及使用 Rebot 后处理输出时同样适用。

按测试名称

选择只运行部分测试的最简单方式是使用 --test (-t) 选项。顾名思义,它可以按名称选择测试。给定的名称不区分大小写、空格和下划线,还支持简单模式。该选项可以多次使用以匹配多个测试:

--test Example                   # 只匹配名为 'Example' 的测试。
--test example*                  # 匹配以 'example' 开头的测试。
--test first --test second       # 匹配名为 'first' 或 'second' 的测试。

要更精确地定位一个测试,可以在测试名称前加上套件名称作为前缀:

--test mysuite.mytest            # 匹配套件 'mysuite' 中的测试 'mytest'。
--test root.sub.test             # 匹配套件 'root' 下子套件 'sub' 中的测试 'test'。
--test *.sub.test                # 匹配任意位置套件 'sub' 中的测试 'test'。

注意,当给定的名称包含套件名称时,它必须从根套件开始匹配完整的套件名称。如上面最后一个例子所示,使用通配符可以匹配任意位置有父套件的测试。

当只需选择少数测试时,使用 --test 选项很方便。一个常见的用例是只运行当前正在开发的测试。如果需要选择大量测试,通常使用按套件名称按 tag 名称选择会更简单。

执行任务时,可以使用 --task 选项作为 --test 的别名。

按套件名称

也可以使用 --suite (-s) 选项通过套件名称选择测试,该选项会选择匹配套件中的所有测试。与 --test 类似,给定的名称不区分大小写、空格和下划线,并支持简单模式。要更精确地定位一个套件,可以在名称前加上父套件名称作为前缀:

--suite Example                  # 只匹配名为 'Example' 的套件。
--suite example*                 # 匹配以 'example' 开头的套件。
--suite first --suite second     # 匹配名为 'first' 或 'second' 的套件。
--suite root.child               # 匹配根套件 'root' 中的子套件 'child'。
--suite *.parent.child           # 匹配任意位置父套件为 'parent' 的子套件 'child'。

如果名称包含父套件名称,它必须以与 --test 相同的方式匹配完整的套件名称。如上面最后一个例子所示,使用通配符可以匹配任意位置有父套件的套件。

在 Robot Framework 7.0 之前,带父套件的 --suite 不需要匹配完整的套件名称。例如,parent.child 会匹配任意位置父套件为 parent 的子套件 child。如果现在需要这种行为,名称必须以通配符为前缀。

如果同时使用 --suite--test 选项,只有在指定套件中的指定测试才会被选中:

--suite mysuite --test mytest    # 匹配套件 'mysuite' 中的测试 'mytest'。

使用 --suite 选项与直接执行相应的套件文件或目录大致相同。主要区别在于,如果直接运行文件或目录,可能存在的更高层级的套件初始化文件会被忽略:

# 根套件是 'Tests',其可能存在的初始化文件会被使用。
robot --suite example path/to/tests

# 根套件是 'Example',更高层级的初始化文件被忽略。
robot path/to/tests/example.robot

在 Robot Framework 6.1 之前,出于性能考虑,不匹配 --suite 选项的文件根本不会被解析。在套件获得了可以覆盖从文件或目录名获取的默认套件名称的新 Name 设置后,这种优化不再可行。新的 --parseinclude 选项已被添加,用于在需要此类解析优化时显式选择要解析的文件

按 tag 名称

可以使用 --include (-i)--exclude (-e) 选项分别按 tag 名称包含和排除测试用例。如果使用了 --include 选项,只有具有匹配 tag 的测试用例才会被选中;使用 --exclude 选项时,具有匹配 tag 的测试用例不会被选中。如果两者都使用,只有具有匹配前者选项的 tag 且不具有匹配后者选项的 tag 的测试才会被选中:

--include example
--exclude not_ready
--include regression --exclude long_lasting

--include--exclude 都可以多次使用以匹配多个 tag。在这种情况下,如果测试具有匹配任一包含 tag 的 tag,并且没有匹配任一排除 tag 的 tag,则该测试会被选中。

除了完全匹配 tag 外,还可以使用 tag 模式,其中 *? 是通配符,ANDORNOT 运算符可用于组合单个 tag 或模式:

--include feature-4?
--exclude bug*
--include fooANDbar
--exclude xxORyyORzz
--include fooNOTbar

另一种按 tag 排除测试的方式是使用 robot:exclude 保留 tag。这个 tag 也可以使用变量设置,从而允许在执行过程中动态排除测试。

*** Variables ***
${EXCLUDE}        robot:exclude

*** Test Cases ***
Literal
   [Documentation]    无条件排除。
   [Tags]    robot:exclude
   Log    This is not executed

As variable
   [Documentation]    除非 ${EXCLUDE} 被设置为不同的值,否则会被排除。
   [Tags]    ${EXCLUDE}
   Log    This is not executed by default

按 tag 选择测试用例是一种非常灵活的机制,允许许多有趣的用法:

--include--exclude 选项可以与前面章节讨论的 --suite--test 组合使用。在这种情况下,被选中的测试必须满足所有选择条件:

--suite example --include tag    # 匹配在套件 'example' 中且具有 tag 'tag' 的测试。
--suite example --exclude tag    # 匹配在套件 'example' 中且不具有 tag 'tag' 的测试。
--test ex* --include tag         # 匹配名称以 'ex' 开头且具有 tag 'tag' 的测试。
--test ex* --exclude tag         # 匹配名称以 'ex' 开头且不具有 tag 'tag' 的测试。

robot:exclude 是 Robot Framework 5.0 中的新功能。

在 Robot Framework 7.2 中新增了对 robot:exclude 使用变量的支持。对 --include--exclude 匹配的 tag 使用变量则不受支持。

在 Robot Framework 7.0 中,--include--test 是累加的,被选中的测试只需匹配其中任一选项。该行为导致了向后不兼容的问题,在 Robot Framework 7.0.1 中已被还原。

重新执行失败的测试用例

命令行选项 --rerunfailed (-R) 可用于从之前的输出文件中选择所有失败的测试进行重新执行。例如,当运行所有测试需要很长时间而你想迭代修复失败的测试用例时,这个选项非常有用。

robot tests                             # 先执行所有测试
robot --rerunfailed output.xml tests    # 然后重新执行失败的测试

在底层,这个选项会像使用 --test 选项逐个选择失败的测试一样来选择它们。可以使用 --test--suite--include--exclude 选项进一步细化选中的测试列表。

如果输出中不包含失败的测试会报错,但可以使用下文讨论--runemptysuite 选项更改此行为。使用并非来自执行当前相同测试的输出会导致未定义的结果。使用特殊值 NONE 作为输出等同于不指定此选项。

重新执行的结果和原始结果可以使用 --merge 命令行选项合并在一起

重新执行失败的测试套件

命令行选项 --rerunfailedsuites (-S) 可用于从之前的输出文件中选择所有失败的套件进行重新执行。与 --rerunfailed (-R) 类似,当完整测试执行需要很长时间时这个选项很有用。注意,失败测试套件中的所有测试都会被重新执行,包括通过的测试。当测试套件中的测试相互依赖时,这个选项很有用。

在底层,这个选项会像使用 --suite 选项逐个选择失败的套件一样来选择它们。可以使用 --test--suite--include--exclude 选项进一步细化选中的测试列表。

当没有测试匹配选择条件

默认情况下,当没有测试匹配选择条件时,测试执行会失败并显示如下错误:

[ ERROR ] Suite 'Example' contains no tests matching tag 'xxx'.

由于没有生成输出,当测试是自动执行和处理结果时,这种行为可能会有问题。幸运的是,命令行选项 --RunEmptySuite(不区分大小写)可以强制在这种情况下也执行套件。结果是会创建正常的输出,但显示零个执行的测试。同样的选项也可以用于改变执行空目录或不包含测试的测试用例文件时的行为。

在使用 Rebot 处理输出文件时也可能出现类似情况。可能没有测试匹配使用的过滤条件,或者输出文件本身就不包含测试。默认情况下 Rebot 在这些情况下会失败,但它有一个单独的 --ProcessEmptySuite 选项可以用来改变行为。实际上,这个选项的工作方式与运行测试时的 --RunEmptySuite 相同。

--RunEmptySuite--ReRunFailed--ReRunFailedSuites 一起使用需要 Robot Framework 5.0.1 或更高版本。

设置元数据

设置套件名称

当 Robot Framework 解析测试数据时,套件名称是从文件和目录名创建的。不过,顶层测试套件的名称可以使用命令行选项 --name (-N) 覆盖:

robot --name "Custom name" tests.robot

设置套件文档

除了在测试数据中定义文档外,顶层套件的文档还可以通过命令行选项 --doc (-D) 给出。值可以包含简单的 HTML 格式化,如果包含空格则必须加引号。

如果给定的文档是指向现有文件的相对或绝对路径,实际的文档将从该文件中读取。当外部指定的文档很长或包含多行时,这特别方便。

示例:

robot --doc "Example documentation" tests.robot
robot --doc doc.txt tests.robot    # 如果 doc.txt 存在,文档从中读取。

从外部文件读取文档是 Robot Framework 4.1 中的新功能。

在 Robot Framework 3.1 之前,文档中的下划线会像 --name 选项一样被转换为空格。

设置自由套件元数据

自由套件元数据也可以通过命令行选项 --metadata (-M) 给出。参数必须采用 name:value 格式,其中 name 是要设置的元数据名称,value 是其值。值可以包含简单的 HTML 格式化,如果整个参数包含空格则必须加引号。该选项可以多次使用以设置多个元数据值。

如果给定的值是指向现有文件的相对或绝对路径,实际的值将从该文件中读取。当值很长或包含多行时,这特别方便。如果值应该是指向现有文件的路径而不是从该文件中读取,则值必须与 name: 部分之间用空格分隔。

示例:

robot --metadata Name:Value tests.robot
robot --metadata "Another Name:Another value, now with spaces" tests.robot
robot --metadata "Read From File:meta.txt" tests.robot    # 如果 meta.txt 存在,值从中读取。
robot --metadata "Path As Value: meta.txt" tests.robot    # 值始终按原样使用。

从外部文件读取元数据值是 Robot Framework 4.1 中的新功能。

在 Robot Framework 3.1 之前,值中的下划线会像 --name 选项一样被转换为空格。

设置测试 tag

命令行选项 --settag (-G) 可用于为所有执行的测试用例设置给定的 tag。该选项可以多次使用以设置多个 tag。

配置库和其他扩展的搜索路径

当 Robot Framework 导入测试库监听器或其他基于 Python 的扩展时,它使用 Python 解释器从系统中导入包含该扩展的模块。查找模块的位置列表称为模块搜索路径,可以使用本节中解释的不同方式进行配置。

当导入资源和变量文件时,如果指定的路径没有直接匹配任何文件,Robot Framework 也会使用 Python 的模块搜索路径。

正确设置模块搜索路径以便找到库和其他扩展是成功执行测试的前提。如果你需要使用下面解释的方式进行自定义,创建一个自定义启动脚本通常是个好主意。

自动包含在模块搜索路径中的位置

Python 解释器有自己的标准库以及一个自动安装第三方模块的目录在模块搜索路径中。这意味着使用 Python 自身打包系统打包的测试库会被自动安装,无需任何额外配置即可导入。

PYTHONPATH

Python 从 PYTHONPATH 环境变量中读取要添加到模块搜索路径的额外位置。如果要指定多个位置,在类 UNIX 机器上需要用冒号分隔(例如 /opt/libs:$HOME/testlibs),在 Windows 上用分号分隔(例如 D:\libs;%HOMEPATH%\testlibs)。

环境变量可以在系统范围内永久配置,也可以只影响某个用户。或者可以在运行命令之前临时设置,这在自定义启动脚本中非常好用。

使用 --pythonpath 选项

Robot Framework 有一个单独的命令行选项 --pythonpath (-P) 用于向模块搜索路径添加位置。

多个位置可以使用冒号(:)或分号(;)分隔,或者多次使用该选项。如果值同时包含冒号和分号,则从分号处分割。路径也可以是匹配多个路径的 glob 模式,但在控制台上使用时通常需要转义。

示例:

--pythonpath libs
--pythonpath /opt/testlibs:mylibs.zip:yourlibs
--pythonpath /opt/testlibs --pythonpath mylibs.zip --pythonpath yourlibs
--pythonpath c:\temp;d:\resources
--pythonpath  lib/\*.zip    # '*' 已转义

无论操作系统如何,冒号和分号都可以使用。分号的支持是 Robot Framework 5.0 中的新功能。

以编程方式配置 sys.path

Python 解释器将其使用的模块搜索路径存储为 sys.path 属性中的字符串列表。此列表可以在执行期间动态更新,更改会在下次导入内容时生效。

设置变量

变量可以从命令行使用 --variable (-v) 选项逐个设置,也可以通过 --variablefile (-V) 选项使用变量文件设置。变量和变量文件在各自的章节中有详细解释,以下示例说明了如何使用这些选项:

--variable name:value
--variable OS:Linux --variable IP:10.0.0.42
--variablefile path/to/variables.py
--variablefile myvars.py:possible:arguments:here
--variable ENVIRONMENT:Windows --variablefile c:\resources\windows.py

空运行

Robot Framework 支持所谓的空运行(dry run)模式,在该模式下测试会正常运行,但来自测试库的关键字完全不会被执行。空运行模式可以用来验证测试数据;如果空运行通过,数据在语法上应该是正确的。使用选项 --dryrun 触发此模式。

空运行执行可能因以下原因失败:

除了这些失败外,还会显示正常的执行错误,例如当测试库或资源文件导入无法解析时。

可以通过向特定的用户关键字添加特殊的 robot:no-dry-run 关键字 tag 来禁用对它们的空运行验证。当某个关键字在空运行模式下由于某种原因失败但在正常执行时工作正常时,这很有用。

空运行模式不会验证变量。

随机化执行顺序

测试执行顺序可以使用选项 --randomize <what>[:<seed>] 来随机化,其中 <what> 是以下值之一:

tests : 每个测试套件内的测试用例以随机顺序执行。

suites : 所有测试套件以随机顺序执行,但套件内的测试用例按定义顺序运行。

all : 测试用例和测试套件都以随机顺序执行。

none : 测试和套件的执行顺序都不随机化。此值可用于覆盖之前用 --randomize 设置的值。

可以提供自定义种子来初始化随机生成器。如果你想使用与之前相同的顺序重新运行测试,这很有用。种子作为 --randomize 值的一部分以 <what>:<seed> 格式给出,且必须是整数。如果没有给出种子,则随机生成。被执行的顶层测试套件会自动获得一个名为 Randomized元数据,说明随机化了什么以及使用了什么种子。

示例:

robot --randomize tests my_test.robot
robot --randomize all:12345 path/to/tests

以编程方式修改测试数据

如果提供的用于在执行前修改测试数据的内置功能不够用,Robot Framework 允许以编程方式进行自定义修改。这是通过创建所谓的 pre-run modifier 并使用 --prerunmodifier 选项激活来实现的。

Pre-run modifier 应实现为能够遍历可执行测试套件结构并根据需要修改它的 visitor。visitor 接口在 Robot Framework API 文档中有说明,可以用它来修改被执行的测试套件测试用例关键字。下面的示例应该能让你了解 pre-run modifier 的使用方式和功能之强大。

在命令行上使用 --prerunmodifier 选项启用 pre-run modifier 时,可以将其指定为 modifier 类的名称或 modifier 文件的路径。如果 modifier 以类名形式给出,包含该类的模块必须在模块搜索路径中,并且如果模块名与类名不同,给定的名称必须同时包含两者,如 module.ModifierClass。如果 modifier 以路径形式给出,类名必须与文件名相同。在大多数方面,这与导入测试库的工作方式完全相同。

如果 modifier 需要参数,如下面的示例所示,可以在 modifier 名称或路径之后使用冒号(:)或分号(;)作为分隔符来指定。如果值中两者都使用了,先出现的被视为实际分隔符。从 Robot Framework 4.0 开始,参数也支持命名参数语法以及基于类型提示默认值参数转换,方式与关键字相同。

如果需要多个 pre-run modifier,可以多次使用 --prerunmodifier 选项。如果在创建日志和报告之前需要类似的修改,可以使用 --prerebotmodifier 选项启用对结果的编程修改

Pre-run modifier 在影响被执行测试套件和测试用例的其他配置之前执行。最重要的是,与选择测试用例相关的选项在 modifier 之后处理,这使得可以对可能动态添加的测试使用 --include 等选项。

修改测试的另一种方式是使用监听器版本 3接口。修改首次调用 start_suite 监听器方法时传递的 data 参数,在实践中与使用 pre-run modifier 具有相同的效果。主要区别在于 --include/--exclude 和其他此类选项对添加的测试不起作用。使用监听器的主要优点是它们允许根据执行过程中发生的情况动态进行修改。

modifier 从命令行启用的方式与监听器完全相同。更多信息和示例请参阅从命令行注册监听器章节。

示例:选择每第 X 个测试

第一个示例展示了 pre-run modifier 如何从被执行的测试套件结构中移除测试。在这个例子中只保留每第 X 个测试,X 从命令行给出,还有一个可选的起始索引。

../api/code_examples/SelectEveryXthTest.py

如果上述 pre-run modifier 在文件 SelectEveryXthTest.py 中且该文件在模块搜索路径中,可以这样使用:

# 以路径方式指定 modifier。运行每隔一个的测试。
robot --prerunmodifier path/to/SelectEveryXthTest.py:2 tests.robot

# 以名称方式指定 modifier。从第二个开始,运行每隔两个的测试。
robot --prerunmodifier SelectEveryXthTest:3:1 tests.robot

示例:按名称排除测试

第二个示例也是移除测试,这次是基于给定的名称模式。实际上它的工作方式类似于内置 --test 选项的反向版本。

../api/code_examples/ExcludeTests.py

假设上述 modifier 在名为 ExcludeTests.py 的文件中,可以这样使用:

# 排除名为 'Example' 的测试。
robot --prerunmodifier path/to/ExcludeTests.py:Example tests.robot

# 排除所有以 'something' 结尾的测试。
robot --prerunmodifier path/to/ExcludeTests.py:*something tests.robot

示例:禁用 setup 和 teardown

在调试测试时,禁用 setup 或 teardown 有时很有用。这可以通过编辑测试数据来实现,但 pre-run modifier 使得可以轻松地为单次运行临时做到这一点:

../api/code_examples/disable.py

假设上述 modifier 都在名为 disable.py 的文件中且该文件在模块搜索路径中,setup 和 teardown 可以如下禁用:

# 禁用 suite teardown。
robot --prerunmodifier disable.SuiteTeardown tests.robot

# 通过使用两次 '--prerunmodifier' 同时禁用 test setup 和 teardown。
robot --prerunmodifier disable.TestSetup --prerunmodifier disable.TestTeardown tests.robot

在 Robot Framework 4.0 之前,setupteardown 是通过中间的 keywords 属性访问的,例如 suite setup 的禁用方式为 suite.keywords.setup = None

控制控制台输出

有多个命令行选项可以控制测试执行在控制台上的报告方式。

控制台输出类型

整体控制台输出类型使用 --console 选项设置。它支持以下不区分大小写的值:

verbose : 每个测试套件和测试用例都会单独报告。这是默认值。

dotted : 只显示 . 表示通过的测试,F 表示失败的测试,s 表示跳过的测试,x 表示因测试执行退出而跳过的测试。失败的测试在执行后会单独列出。这种输出类型使得即使有大量测试,也能很容易看到执行期间是否有失败。

quiet : 除了错误和警告外没有输出。

none : 完全没有输出。在使用监听器等创建自定义输出时很有用。

单独的便捷选项 --dotted (-.)--quiet 分别是 --console dotted--console quiet 的快捷方式。

示例:

robot --console quiet tests.robot
robot --dotted tests.robot

控制台宽度

控制台中测试执行输出的宽度可以使用选项 --consolewidth (-W) 设置。默认宽度为 78 个字符。

在许多类 UNIX 机器上,你可以使用方便的 $COLUMNS 环境变量,如 --consolewidth $COLUMNS

控制台颜色

--consolecolors (-C) 选项用于控制控制台输出中是否使用颜色。颜色使用 ANSI 转义码实现,对于不支持 ANSI 码的旧版 Windows 有备用机制。

该选项支持以下不区分大小写的值:

auto : 当输出写入控制台时启用颜色,但当输出重定向到文件或其他地方时不启用。这是默认值。

on : 即使输出被重定向也使用颜色。在 Windows 上不起作用。

ansi : 与 on 相同,但强制在 Windows 上无条件使用 ANSI 码。

off : 禁用颜色。

在 Windows 上默认使用 ANSI 码是 Robot Framework 7.1 中的新功能。

控制台链接

执行结束时写入控制台的结果文件路径默认是超链接。可以使用 --consolelinks 选项控制此行为,该选项接受以下不区分大小写的值:

auto : 当控制台颜色启用时,路径会被转换为链接。这是默认值。

off : 无条件禁用链接。

超链接支持还取决于使用的控制台,不过现在支持已经相当好了。常用的 Windows Console 不支持链接,但较新的 Windows Terminal 支持。

超链接支持是 Robot Framework 7.1 中的新功能。

控制台标记

当使用详细输出且测试用例中的顶层关键字结束时,控制台上会显示特殊标记 .(成功)和 F(失败)。这些标记可以在高层级上跟踪测试执行情况,当测试用例结束时会被擦除。

可以使用 --consolemarkers (-K) 选项配置何时使用标记。它支持以下不区分大小写的值:

auto : 当标准输出写入控制台时启用标记,但当输出重定向到文件或其他地方时不启用。这是默认值。

on : 始终使用标记。

off : 禁用标记。

设置监听器

监听器可用于监控测试执行。从命令行启用时,使用 --listener 命令行选项指定。值可以是监听器的路径或监听器名称。更多详情请参阅监听器接口章节。

lyyyuna 沪ICP备2025110782号-1