声明:本文搬运自官方操作文档,仅用作学习,有错误的地方欢迎指正。
官方文档链接:RobotFramework--高级特性
2.8 高级特性
2.8.1 处理同名关键字
Robot Framework使用的关键字要么是库关键字,要么是用户关键字。前者来自标准图库或外部库,后者要么创建在同一文件中使用,要么从资源文件导入。当使用多个关键字时,常见一些关键字名称相同,本节描述这些情况下如何处理冲突。
关键字作用域
当有几个同名关键字但是只使用了一个时,Robot Framework会尝试根据其作用域确定哪个关键字具有最高优先级。关键字的作用域是根据有关关键字的创建方式确定的:
- 正在使用的文件中创建的用户关键字。这些关键字具有最高的优先级,并且会一直使用,即使其他地方还有有同名关键字。
- 在资源文件中创建并直接或间接从其他资源文件导入的是第二优先级。
- 创建在外部测试库中的。如果没有同名用户关键字则使用,如果标准库中有同名关键字会显示警告。
- 标准库中的关键字优先级最低。
明确指定关键字
光是作用域是不够的,因为在几个库或资源中都可能存在同名关键字,因此提供了一个机制,仅使用最高优先级的关键字。在这种情况下,可以使用关键字的全名,关键字名称的前缀为资源或库的名称,用点分隔。
使用库关键字,长格式仅表示使用LibraryName.Keyword Name
的格式。例如,操作系统库中的关键字Run
可以用作OperatingSystem.Run
。 如果库位于模块或包中,则必须使用完整模块或包名(例如com.company.Library.Some Keyword
)。如果使用WITH NAME
语法将自定义名称授予库,则指定的名称也必须在完整关键字名称中使用。
资源文件在完整的关键字名称中指定,类似于库名。资源的名称源自资源文件的底名,无需文件扩展。例如,资源文件myresources.html can be used as myresources.Example
中的关键字Example
。请注意,如果多个资源文件具有相同的底名,则此语法不起作用。在这种情况下,必须重命名文件或关键字。关键字的全名是案例、空间和下划线不敏感,类似于正常关键字名称。
指定库和资源的优先级
如果关键字之间存在多重冲突,用长格式指定所有关键字可能比较有效。使用长格式也使得无法创建动态测试用例或用户关键字,这些关键字的工作方式因可用的库或资源而异。解决这两个问题的办法是明确使用Builtln库的关键字Set Library Search Order来指定关键字优先级。
注意
虽然关键字名称中包含"库"一词,但它只适用于Robot Framework 2.6.2 开始的资源文件。如上所述,资源中的关键字始终比库中的关键字具有更高的优先级。
Set Library Search Order
接受有序列表或库和资源作为参数。当测试数据中的关键字名称与多个关键字匹配时,将选择包含关键字的第一个库或资源,并使用该关键字实现。如果未从任何指定的库或资源中找到关键字,则执行冲突失败的方式与未设置搜索顺序时相同。
有关更多信息和示例,请参阅关键字的文档。
2.8.2 超时
关键字可能会有问题的情况下,需要执行很长时间或挂起。Robot Framework 允许您为测试用例和用户关键字设置超时,如果测试或关键字未在指定时间内完成,则当前执行的关键字将被强制停止。以这种方式停止关键字可能会使库或系统处于测试不稳定状态,并且只有在没有更安全的选项可用时才建议使用超时。一般来说,应该实施库以便关键字不能挂起,或者必要时它们有自己的超时机制。
测试用例超时
可以通过使用Setting表中的Test Timeout
设置或测试用例表中的[Timeout]
设置来设置测试用例超时。Setting表中的Test Timeout
定义了测试套件中所有测试用例的默认测试超时值,而测试用例表中的[Timeout]
则对单个测试用例应用超时,并覆盖默认值。
如果[Timeout]未填入任何值则相当于未设置超时。Robot Framework 2.5.6以上版本也可以使用NONE。
无论测试超时定义在哪里,设置名称后的第一个单元包含超时持续时间。持续时间必须遵守Robot Framework的时间格式,直接使用秒为单位或使用1 minute 30 seconds
这种格式。必须指出,框架本身也耗费执行时间,因此不建议设置短于一秒。
当测试超时发生时显示的默认错误消息是Test timeout <time> exceeded
。也可以使用自定义错误消息,这些消息在超时持续时间后被写入单元格。消息可以分割成多个单元格,类似于文档。超时值和错误消息都可以包含变量。
如果超时,关键字运行在超时结束时停止,测试用例失败。但是,在测试超时时测试拆解执行的关键字不会中断,因为它们通常从事重要的清理活动。如有必要,也可以使用用户关键字超时中断这些关键字。
用户关键字超时
可以使用关键字表中的[Timeout]设置为用户关键字设置超时。设置它的语法,包括超时值和可能的自定义消息的给出方式与测试用例超时使用的语法相同。如果未提供自定义消息,则使用默认错误消息Keyword
用户关键字超时适用于该用户关键字的执行。如果整个关键字的总时间大于超时值,则当前执行的关键字将被停止。用户关键字超时也适用于测试用例拆解期间,而测试超时则不适用。
如果测试用例及其一些关键字(或几个嵌套关键字)都有超时,则活动超时是剩余时间最少的超时。
警告
与 Windows 相比,在其他地方使用 Python 2.5 时,使用超时可能会减慢测试执行速度。在Robot Framework 2.7 超时之前,所有平台上的所有 Python 版本都减慢了执行速度。
2.8.3 For循环
在自动化测试中,重复相同的操作很常见。Robot Framework测试库支持各式各样的循环。Robot Framework也有自己的 For 循环语法,这很有用,比如需要重复来自不同库的关键字。
For循环可用于测试用例和用户关键字。除了非常简单的案例,用户关键字更好,因为它们隐藏了循环引入的复杂性。循环基本语法FOR item IN sequence源自 Python,但类似的语法在shell或 Perl也有。
普通for循环
在正常For循环中,从值列表中分配一个变量,每次迭代一个值。语法以:FOR开头,其中冒号将语法与正常关键字分开。下一个单元格包含循环变量,后续的单元格必须具有IN,最终单元包含要重复的值。
For 循环中使用的关键字位于下一行且必须向右缩进一个单元格,当缩进返回到正常状态或表结束时For 循环结束。For循环不支持嵌套,但可以使用 For 循环内的用户关键字,在其中使用另一个 For 循环
上面示例 1中的For循环执行两次,首次循环变量${animal}
获取值cat,然后获取值dog。该循环由两个Log
关键字组成。在第二个示例中循环值被分割成几行,循环总共运行七次。
提示
如果您使用纯文本格式的循环,请记住使用反斜杠缩入的单元格:
*** Test Case ***
Example 1
:FOR
${animal}
IN
cat dog
\Log
${animal}
\Log
2nd keyword
Log
Outside loop
For循环在使用列表变量是最有用的,也最清晰。下面的示例中@{ELEMENTS}
包含任意长的元素名称列表,并且所有元素都使用关键字Start Element
。
使用多个循环变量
也可以使用多个循环变量,语法与正常的 For 循环相同,但所有循环变量都列在:FOR
和 IN
之间的单元格中。可以存在任意数量的循环变量,但值数必须按变量数均匀划分。
此语法自然适用于有或没有列表变量。在前一种情况下,通常可以将循环值组织在循环变量以下,如下示例的第一部分:
FOR IN RANGE
早期For循环普遍用在迭代序列,这也是最常见的使用案例。有时执行一定次数的 For
循环仍然很方便,Robot Framework为此目的具有特殊的FOR index IN RANGE limit
语法。此语法源自 Python。
与其他For循环类似,For in range
循环中以:FOR
开头,循环变量位于下一个单元格中。在此格式中,只能有一个循环变量,它包含当前循环索引。下一个单元格必须包含IN RANGE
然后在后面的单元格中指定上限值。
最简单的情况下只指定循环的上限。此时循环索引从零开始,递增1,直到但不包括上限值。也可以同时给出开始和结束的限制。然后索引从开始限制开始,但与简单情况一样增加。最后,还可以给出指定使用增量的步值。如果步骤为负值,则用作减损。
从Robot Framework 2.5.5 开始,可以使用简单的算术,如加法和减法,并具有范围限制。当限制用变量指定时尤其有用。
退出循环
通常for循环执行直到所有元素都循环通过或出现错误,测试用例或关键字失败。但是,有时需要在循环的所有元素都通过之前中止循环。内置关键字Exit For Loop
可用于退出for循环。
Exit For Loop
关键字可直接用于循环或循环使用的关键字中。在这两种情况下,测试执行在循环后继续。如果在循环外执行,则测试失败。
退出循环也可以从测试库中的关键字中启动,从而提出ROBOT_EXIT_FOR_LOOP
属性的例外。请参阅停止测试执行,了解如何在 Python 和 Java 库中执行的。
注意
Exit For Loop是Robot Framework 2.5.2 中的新功能。
从输出中删除不必要的关键字
对于具有多次迭代的循环通常会创建大量输出,并显著增加生成的输出和日志文件的大小。从Robot Framework 2.7 开始,可以使用--RemoveKeywords FOR命令行选项的关键字从输出中删除不必要的关键字。
重复单个关键字
for循环在只需要重复单个关键字的情况下,循环次数就过剩了。在这些情况下,使用内置关键字Repeat Keyword
通常更容易。此关键字需要一个关键字,并作为参数重复它多少次。重复关键字的时间可以有一个可选的后缀times或x,使语法更容易阅读。
Robot Framework也有重复单个关键字的特殊语法。此语法在 2.0.4 版本中被弃用,转而支持
Repeat Keyword
,并在 2.5 版本中将其删除。
2.8.4 条件执行
一般来说,在测试用例中,甚至在用户关键字中不建议有条件逻辑,因为会难以理解和维护。相反,这种逻辑应该在测试库中,可以使用自然编程语言结构来实现。然而,有时条件逻辑可能有用,即使Robot Framework没有实际的if/else结构,也有几种方法可以达到相同的效果。
可使用变量指定用作设置的关键字的名称或拆解测试用例和测试套件。例如,这有助于从命令行更改它们。
- 内置关键字Run Keyword 需要一个关键字作为参数实际执行,因此它可以是一个变量。例如,变量的值可以动态地从较早的关键字中获得,也可以从命令行中给出。
- 内置关键字Run Keyword If和Run Keyword Unless仅在某个表达式分别为真或假的情况下执行指定的关键字。它们非常适合创建简单if/else机构。例如,请参阅前者的文件。
- 另一个内置关键字Set Variable If可用于根据给定表达式动态设置变量。
- 有几个内置关键字,仅在测试用例或测试套件失败或通过时才能执行指定的关键字。
2.8.5 关键字并行执行
在 Robot Framework2.5 之前有同时执行关键字的特殊语法。此功能被删除,因为它很少被使用,它从来没有完全工作。
当需要并行执行时,必须在测试库级别中执行,以便库在后台执行代码。通常,这意味着库需要一个关键字,如Start Something
开始执行并立即返回,以及另一个关键字Get Results From Something
等待结果可用并返回。请参阅 OperatingSystem library中的关键字Start Process
和Read Process Output
等示例。