Robot Framework 新版教程 - 高级功能
(Robot Framework 7.x 教程, Part 11)
处理同名关键字
Robot Framework 中使用的关键字要么是库关键字,要么是用户关键字。前者来自标准库或外部库,后者要么在使用它们的同一文件中创建,要么从资源文件导入。当使用大量关键字时,其中一些可能会同名,本节描述如何处理这种情况下的冲突。
关键字作用域
当只使用关键字名称且存在多个同名关键字时,Robot Framework 会根据关键字的作用域来确定优先级。关键字的作用域取决于它的创建方式:
- 在当前执行的套件文件中创建的用户关键字。这些关键字具有最高优先级,始终会被使用,即使其他地方存在同名关键字。
- 在资源文件中创建,并直接或间接从另一个资源文件导入。这是第二高优先级。
- 在外部测试库中创建。如果不存在同名的用户关键字,则使用这些关键字。但如果标准库中存在同名关键字,会显示警告。
- 在标准库中创建。这些关键字具有最低优先级。
显式指定关键字
当两个不同库或两个不同资源文件中存在同名关键字时,作用域无法帮助解决冲突。此外,如果需要使用库中的关键字而非资源文件中的同名关键字,作用域也帮不上忙。在这些情况下,可以使用关键字的全名,即在关键字名称前加上库名或资源名,并用点号分隔。
对于库关键字,全名格式为 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 Process 和 Wait For Process 关键字作为示例。