lyyyuna 的小花园

动静中之动, by

RSS

Robot Framework 新版教程 - 高级功能

发表于 2026-04

处理同名关键字

Robot Framework 中使用的关键字要么是库关键字,要么是用户关键字。前者来自标准库或外部库,后者要么在使用它们的同一文件中创建,要么从资源文件导入。当使用大量关键字时,其中一些可能会同名,本节描述如何处理这种情况下的冲突。

关键字作用域

当只使用关键字名称且存在多个同名关键字时,Robot Framework 会根据关键字的作用域来确定优先级。关键字的作用域取决于它的创建方式:

  1. 在当前执行的套件文件中创建的用户关键字。这些关键字具有最高优先级,始终会被使用,即使其他地方存在同名关键字。
  2. 在资源文件中创建,并直接或间接从另一个资源文件导入。这是第二高优先级。
  3. 在外部测试库中创建。如果不存在同名的用户关键字,则使用这些关键字。但如果标准库中存在同名关键字,会显示警告。
  4. 在标准库中创建。这些关键字具有最低优先级。

显式指定关键字

当两个不同库或两个不同资源文件中存在同名关键字时,作用域无法帮助解决冲突。此外,如果需要使用库中的关键字而非资源文件中的同名关键字,作用域也帮不上忙。在这些情况下,可以使用关键字的全名,即在关键字名称前加上库名或资源名,并用点号分隔。

对于库关键字,全名格式为 LibraryName.Keyword Name。例如,OperatingSystem 库中的 Get File 关键字可以用 OperatingSystem.Get File 来使用,即使其他地方存在另一个 Get File 关键字。如果库实现在嵌套模块中,全名必须包含完整的模块名,如 root.sub.Library.Keyword。如果导入库时设置了自定义名称,全名中也必须使用该自定义名称。

对于资源文件中的用户关键字,全名的构建方式与库关键字相同。资源名取自资源文件的基本名称(不含文件扩展名)。例如,资源文件 example.resource 中的关键字 Some Keyword 可以用 example.Some Keyword 来使用。注意,如果多个资源文件具有相同的基本名称,此语法将不起作用,这种情况下必须重命名资源文件或关键字。

对于套件文件中的用户关键字,全名仅包含关键字名称本身,不需要任何前缀。

比较全名时,库/资源部分不区分大小写和空格,关键字部分不区分大小写、空格和下划线。

指定库和资源之间的显式优先级

当存在多个关键字冲突时,以完整格式指定所有关键字可能需要大量工作。使用完整格式还会使创建动态测试用例或根据可用库/资源不同而表现不同的用户关键字变得不可能。解决这两个问题的方案是使用 BuiltIn 库中的 Set Library Search Order 关键字显式指定关键字的优先级。

虽然该关键字名称中包含 library 一词,但它同样适用于资源文件。不过如前所述,资源中的关键字始终比库中的关键字具有更高的优先级。

Set Library Search Order 接受一个有序的库和资源列表作为参数。当测试数据中的关键字名称匹配多个关键字时,将选择列表中第一个包含该关键字的库或资源,并使用其实现。如果在任何指定的库或资源中都找不到该关键字,执行将因冲突而失败,与未设置搜索顺序时的行为相同。

更多信息和示例请参阅该关键字的文档。

超时

有时关键字可能执行时间异常长或永远挂起。Robot Framework 允许为测试用例和用户关键字设置超时,如果测试或关键字未在指定时间内完成,当前执行的关键字将被强制停止。

以这种方式停止关键字可能会使库、测试环境或被测系统处于不稳定状态,因此仅在没有更安全的替代方案时才推荐使用超时。通常,库的实现应确保关键字不会挂起,或者库应有自己的超时机制。

测试用例超时

测试用例超时可以通过 Settings section 中的 Test Timeout 设置或为单个测试用例使用 [Timeout] 设置来指定。Test Timeout 为该套件中的所有测试用例定义默认超时,而 [Timeout] 为特定测试用例设置超时并覆盖可能的默认值。

使用空的 [Timeout] 表示即使设置了 Test Timeout,该测试也没有超时。也可以使用显式的 NONE 值达到相同目的。如果超时值为零或负数,超时也会被忽略。

无论在哪里定义测试超时,其值都包含超时的持续时间。持续时间必须以 Robot Framework 的时间格式给出,即直接以秒为单位(如 10)或使用 1 minute 30 seconds 这样的格式。超时也可以指定为变量,从而可以从命令行传入。

如果设置了超时且已过期,当前运行的关键字将被停止,测试用例将失败。但在测试 teardown 中执行的关键字不会因测试超时而被中断,不过测试仍会被标记为失败。如果 teardown 中的关键字可能挂起,可以使用用户关键字超时来停止它。

*** Settings ***
Test Timeout       2 minutes

*** Test Cases ***
Default timeout
    [Documentation]    使用 Settings 中的默认超时。
    Some Keyword    argument

Override
    [Documentation]    覆盖默认值,使用 10 秒超时。
    [Timeout]    10
    Some Keyword    argument

Variables
    [Documentation]    也可以使用变量。
    [Timeout]    ${TIMEOUT}
    Some Keyword    argument

No timeout
    [Documentation]    空超时表示即使设置了 Test Timeout 也没有超时。
    [Timeout]
    Some Keyword    argument

No timeout 2
    [Documentation]    使用 NONE 禁用超时也可以,而且更明确。
    [Timeout]    NONE
    Some Keyword    argument

用户关键字超时

可以使用 [Timeout] 设置为用户关键字设置超时。语法与测试用例超时完全相同,但用户关键字超时没有默认值。如果用户关键字超时使用变量指定,其值也可以作为关键字参数传入。

*** Keywords ***
Hardcoded
    [Arguments]    ${arg}
    [Timeout]    1 minute 42 seconds
    Some Keyword    ${arg}

Configurable
    [Arguments]    ${arg}    ${timeout}
    [Timeout]    ${timeout}
    Some Keyword    ${arg}

Run Keyword with Timeout
    [Arguments]    ${keyword}    @{args}    &{kwargs}    ${timeout}=1 minute
    [Documentation]    封装关键字,以可配置的超时运行另一个关键字。
    [Timeout]    ${timeout}
    Run Keyword    ${keyword}    @{args}    &{kwargs}

用户关键字超时在该用户关键字执行期间生效。如果关键字的总执行时间超过超时值,当前执行的关键字将被停止。用户关键字超时在测试用例 teardown 期间也适用,而测试超时不适用。

如果测试用例和其某些关键字(或多个嵌套关键字)都设置了超时,生效的超时是剩余时间最少的那个。

在早期 Robot Framework 版本中,可以指定超时过期时使用的自定义错误消息。此功能在 Robot Framework 3.0.1 中弃用,在 Robot Framework 3.2 中移除。

关键字的并行执行

当需要并行执行时,必须在测试库层面实现,使库在后台执行代码。通常这意味着库需要一个类似 Start Something 的关键字来启动执行并立即返回,以及另一个类似 Get Results From Something 的关键字来等待结果可用并返回结果。参考 Process 库的 Start ProcessWait For Process 关键字作为示例。

lyyyuna 沪ICP备2025110782号-1