robotframework笔记14

创建用户关键字

关键字表是用于创建新的更高层次的关键词 结合现有的关键词。 这些关键字被称为 用户 关键字 区分他们的最低水平 库关键字 实现在测试库。 的语法创建用户 关键词非常接近的语法创建测试用例 很容易学习。

用户关键字语法

基本语法

在许多方面,总体用户关键字语法是相同的 测试用例的语法 。 用户创建关键字关键字表 这不同于测试用例表,用于只有名字 识别它们。 用户在第一列类似关键字名称 测试用例的名称。 也从关键字,创建用户的关键词 从关键词在测试库或其他用户的关键词。 关键字的名字 通常在第二列,但当设置变量的 关键字返回值,它们在随后的列。

*** Keywords ***
Open Login Page
    Open Browser    http://host/login.html
    Title Should Be    Login Page

Title Should Start With
    [Arguments]    ${expected}
    ${title} =    Get Title
    Should Start With    ${title}    ${expected}

大多数用户关键词需要一些参数。 这个重要的特性 已经在上面的第二个例子,详细解释 后来在这一节中 类似地, 用户关键字返回 值 

可以创建用户关键字 测试用例文件 资源文件 , 和 测试套件的初始化文件 。 关键字中创建资源 文件可用于文件使用它们,而其他关键字 只能在他们创建的文件。

设置关键字表中

用户关键字可以有类似的设置 测试用例 ,他们 有相同的方括号语法分离关键字 的名字。 下面列出了所有可用的设置和稍后解释 这一节。

(文档)
用于设置一个 用户的关键字的文档 
(标签)
集 标签 关键字。
(参数)
指定 用户关键字参数 
(返回)
指定 用户关键字返回值 
(拆卸)
指定 用户关键字拆卸 
(超时)
集可能 用户关键字超时 。 超时 讨论了 在自己的部分。

用户关键字名称和文档

中定义的用户关键字的名字是第一列的用户 关键字表。 当然,这个名字应该是描述性的,它是 接受有很长的关键字的名字。 实际上,当创建 通常use-case-like测试用例,最高级别的关键词 制定句子甚至段落。

用户关键字可以有一个文档的设置 (文档) 设置,完全一样 测试用例文档 。 这个设置文档用户关键字的测试数据。 它也显示 在更正式的关键字的文档, Libdoc 工具可以创建 从 资源文件 。 最后,文档的第一行 显示为一个关键字的文档 测试日志 

有时关键词需要被删除,取而代之的是新的,或 弃用其他原因。 用户关键字可以弃用 从文档 *不* ,这将 导致使用关键字的一个警告。 有关更多信息,请参见 不以为然的关键词 部分。

用户关键词标签

从机器人Framework 2.9,关键词也可以有标签。 用户的关键字 可以设置标签 (标签) 设置同样 测试用例的标签 , 但可能 力的标签 和 默认的标签 设置不 影响它们。 另外可以指定关键词标签的最后一行 的文档 标签: 前缀和由逗号分隔。 例如, 后两个关键词都得到相同的三个标签。

*** Keywords ***
Settings tags using separate setting
    [Tags]    my    fine    tags
    No Operation

Settings tags using documentation
    [Documentation]    I have documentation. And my documentation has tags.
    ...                Tags: my, fine, tags
    No Operation

关键词标签生成的日志和文档所示 Libdoc , 的关键字也可以根据标签搜索。 ——removekeywords 和 ——flattenkeywords 命令行选项也支持选择关键词 标签,和新用法的关键词标签可能被添加在后面的版本。

类似与 测试用例的标签 ,用户关键词标签 机器人- 前缀 是 保留 特色的机器人框架本身。 用户应该 因此不使用任何标签 机器人- 除非真正激活前缀 特殊的功能。

用户关键字参数

大多数用户关键词需要一些参数。 的语法 指定他们可能是最复杂的功能正常 需要与机器人框架,但即使是相对容易的, 特别是在最常见的情况。 参数通常是指定的 的 (参数) 使用相同的设置,参数名称 语法 变量 例如, $ { arg } 

位置参数

最简单的方法来指定参数(除了没有) 仅使用位置参数。 在大多数情况下,这就是一切了 这是必要的。

语法是这样的首先 (参数) 设置是 鉴于,然后在随后的定义参数名称 细胞。 每个参数都是在自己的细胞,使用相同的语法 变量。 关键字必须使用尽可能多的参数 参数名称在其签名。 实际的参数名称不 框架问题,但从用户的角度来看他们应该 尽可能的描述。 建议 在变量名用小写字母,要么 $ { my_arg } $ {我的arg } 或 $ { myArg } 

*** Keywords ***
One Argument
    [Arguments]    ${arg_name}
    Log    Got argument ${arg_name}

Three Arguments
    [Arguments]    ${arg1}    ${arg2}    ${arg3}
    Log    1st argument: ${arg1}
    Log    2nd argument: ${arg2}
    Log    3rd argument: ${arg3}

默认值与用户关键词

在创建用户关键字时,位置参数是充分的 大多数情况下。 然而,有时有用,关键字 默认值 的部分或全部参数。 同时用户关键字 支持默认值,需要新的语法不会增加很多 已经讨论了基本的语法。

简而言之,默认值被添加到参数,这首先是 等号( )的值,例如 $ { arg } =违约 。 可以有许多参数与违约,但他们都必须有 正常的位置参数。 默认值可以包含一个 变量 上创建 测试套件或全球范围 ,但局部变量的关键字 遗嘱执行人不能使用。 从机器人Framework 3.0,默认值 早些时候还定义基于参数关键字所接受。

请注意

默认值是空间敏感的语法。 空间 之前 不允许,和可能的空间 后被认为是默认值本身的一部分。

*** Keywords ***
One Argument With Default Value
    [Arguments]    ${arg}=default value
    [Documentation]    This keyword takes 0-1 arguments
    Log    Got argument ${arg}

Two Arguments With Defaults
    [Arguments]    ${arg1}=default 1    ${arg2}=${VARIABLE}
    [Documentation]    This keyword takes 0-2 arguments
    Log    1st argument ${arg1}
    Log    2nd argument ${arg2}

One Required And One With Default
    [Arguments]    ${required}    ${optional}=default
    [Documentation]    This keyword takes 1-2 arguments
    Log    Required: ${required}
    Log    Optional: ${optional}

 Default Based On Earlier Argument
    [Arguments]    ${a}    ${b}=${a}    ${c}=${a} and ${b}
    Should Be Equal    ${a}    ${b}
    Should Be Equal    ${c}    ${a} and ${b}

当一个关键字和默认值,只接受多个参数 其中一些需要覆盖,这往往是方便使用 命名参数 语法。 当这个语法是用户使用 关键词,没有指定的参数 $ { } 装饰。 例如,可以使用第二个字以上 下面 $ { __arg1 } 仍将得到其默认值。

*** Test Cases ***
Example
    Two Arguments With Defaults    arg2=new value

正如所有的python支持者必须已经注意到的,语法 指定默认参数严重受Python语法 函数的默认值。

Varargs和用户关键字

有时甚至默认值是不够的,有必要 为一个关键字接受 数量可变的参数 。 用户的关键字 也支持这个特性。 所需要的就是拥有 变量列表 这样的 作为 @ { varargs } 在关键字可能位置参数后签名。 这个语法可以结合前面描述的默认值,和 最后列表变量得到所有剩下的参数不匹配 其他参数。 列表变量可以有任意数量的物品,甚至是零。

*** Keywords ***
Any Number Of Arguments
    [Arguments]    @{varargs}
    Log Many    @{varargs}

One Or More Arguments
    [Arguments]    ${required}    @{rest}
    Log Many    ${required}    @{rest}

Required, Default, Varargs
    [Arguments]    ${req}    ${opt}=42    @{others}
    Log    Required: ${req}
    Log    Optional: ${opt}
    Log    Others:
    : FOR    ${item}    IN    @{others}
    \    Log    ${item}

注意,如果使用上面最后一个字与不止一个 参数,第二个参数 $ {选择} 总是给定的 值而不是默认的值。 这种情况即使给定 值是空的。 最后一个例子也说明了一个变量 数量的参数接受一个用户关键字可以用在一个 为 循环 。 这种组合的两个,而先进的功能 有时是非常有用的。

再次,python支持者可能注意到变量的数量 参数语法非常接近一个Python。

Kwargs与用户关键字

用户关键字也可以接受 免费的关键字参数 通过一个 字典 变量 就像 & { kwargs } 作为最后一个参数后可能的位置 参数和可变参数。 当关键字被调用时,该变量会得到所有 命名参数不匹配任何位置参数的关键字 签名。

*** Keywords ***
Kwargs Only
    [Arguments]    &{kwargs}
    Log    ${kwargs}
    Log Many    @{kwargs}

Positional And Kwargs
    [Arguments]    ${required}    &{extra}
    Log Many    ${required}    @{extra}

Run Program
    [Arguments]    @{varargs}    &{kwargs}
    Run Process    program.py    @{varargs}    &{kwargs}

上面的最后一个例子展示了如何创建一个包装器的关键字 接受任何位置或命名参数和传递。 看到 kwargs例子 对于一个完整的示例相同的关键字。

还kwargs支持与用户关键字和kwargs工作非常类似的工作 在Python中。 在签名也向前传递参数时, & { kwargs } 差不多是Python的吗 * * kwargs 

将参数嵌入到关键字的名字

机器人框架也另一种方法向用户传递参数 关键字比指定关键字名称后细胞内 在前一节中解释。 这种方法是基于嵌入 参数直接进入关键字名称和它的主要好处是 使其更容易使用真实和清晰的句子作为关键字。

基本语法

它一直可以使用关键字的样子 选择狗 从列表 和 从列表中选择猫 ,但所有这些关键字 一定是单独实现。 嵌入参数的概念 入关键字的名字是所有你需要的是一个字的名字 从列表中选择$ {动物} 

*** Keywords ***
Select ${animal} from list
    Open Page    Pet Selection
    Select Item From List    animal_list    ${animal}

关键字使用嵌入式论点不能采取任何“正常”的论点 (指定 (参数) 设置)除此之外 就像其他用户创建关键字。 中使用的参数的名称 自然会可以在关键字和他们有不同吗 价值取决于关键字。 例如, $ {动物} 在前面的是有价值的 狗 如果关键字 使用像 从列表中选择狗 。 显然它不是 强制使用这些参数在关键字,他们可以 因此作为通配符。

这类关键字也用同样的方式作为其他关键词 除了空间和强调不被忽视 的名字。 然而,他们是不区分大小写的像其他关键词。 为 示例中,关键字在上面的例子中可以使用 从列表中选择x ,但不喜欢 选择x fromlist 

嵌入参数不支持默认值或变量的数量 参数正常参数。 使用变量时 把这些关键词是可能的,但可以减少可读性。 只注意到嵌入式参数处理用户的关键词。

嵌入参数匹配的太多

一个棘手的部分使用嵌入式参数是确保 值调用时使用的关键字匹配正确的参数。 这 是一个问题尤其是如果有多个参数和人物 分离也可能出现在给定的值。 例如, 关键字 城市选择$ { } $ {团队} 如果使用不正确工作 与城市包含了部分 选择洛杉矶湖人队 

解决这个问题很简单,那就是引用的参数(如。 城市选择“$ { } " $ {团队} " ),在引用中使用关键字 格式(如。 选择“洛杉矶”“湖人队” )。 这种方法是 不足以解决所有的冲突,但它是 仍然强烈推荐,因为它使论点脱颖而出 其他关键字。 一个更强大,但也更复杂 解决方案, 使用自定义正则表达式 在定义变量时, 在下一节中解释。 最后,如果事情变得复杂, 这可能是一个更好的主意转而使用普通位置参数。

参数匹配的问题往往出现在创建太多了 的关键字 忽略了/ / /,/但前缀 。 例如, $ {名称}回家 匹配 给珍妮回家 所以 那 $ {名称} 获得的价值 给珍妮 。 引号的 参数,像在 " $ {名称}”回家 ,解决这个问题 很容易。

使用自定义正则表达式

与嵌入参数被称为关键字时,值 匹配在内部使用 正则表达式 (简称regexp)。 默认的逻辑,这样每一个论点 名字是一个模式所取代 . * ? 基本上匹配 任何字符串。 这个逻辑通常很有效,但而已 上面所讨论的,有时候关键字 比赛多 目的 。 引用或分离参数 文本可以帮助但是,例如,下面的测试失败,因为关键字 我执行“ls”与“韩” 这两个定义匹配 关键词。

*** Test Cases ***
Example
    I execute "ls"
    I execute "ls" with "-lh"

*** Keywords ***
I execute "${cmd}"
    Run Process    ${cmd}    shell=True

I execute "${cmd}" with "${opts}"
    Run Process    ${cmd} ${opts}    shell=True

解决这个问题是使用自定义正则表达式 确保关键字匹配只应该在那 特定的上下文。 能够使用该功能,并完全 理解本节中的示例,您需要理解 最基本的正则表达式语法。

一个定制的嵌入式参数正则表达式定义之后 基本的参数,参数名称和正则表达式 用冒号分隔。 例如,一个论点,应该匹配 只有数字可以被定义 $ {参数:\ d + } 。 使用自定义 下面的例子说明了正则表达式。

*** Test Cases ***
Example
    I execute "ls"
    I execute "ls" with "-lh"
    I type 1 + 2
    I type 53 - 11
    Today is 2011-06-27

*** Keywords ***
I execute "${cmd:[^"]+}"
    Run Process    ${cmd}    shell=True

I execute "${cmd}" with "${opts}"
    Run Process    ${cmd} ${opts}    shell=True

I type ${a:\d+} ${operator:[+-]} ${b:\d+}
    Calculate    ${a}    ${operator}    ${b}

Today is ${date:\d{4\}-\d{2\}-\d{2\}}
    Log    ${date}

在上面的例子中关键字 我执行“ls”与“韩” 匹配 只有 我执行“$ { cmd }”和“$ {选择} " 。 这是保证 因为自定义正则表达式 [^ "]+ 在 我执行 “$ { cmd:[^]}” 意味着一个匹配的参数不能包含任何 引号。 在这种情况下不需要添加自定义的regexp 其他 我执行 变体。

提示

如果你引用参数,使用正则表达式 [^ "]+ 直到第一个保证的参数匹配 关闭报价。

支持正则表达式语法

使用Python实现,自然使用Python的机器人框架 再保险 非常标准的模块 正则表达式 语法 。 这个语法与嵌入式否则完全支持 参数,但regexp扩展格式 (?…) 不能 使用。 还需要注意的是,嵌入参数进行匹配 不区分大小写。 如果正则表达式语法无效, 创建关键字失败与错误中可见 测试执行 错误 

转义特殊字符

有一些特殊字符需要使用时逃走了 自定义正则表达式嵌入参数。 首先,可能关闭 花括号( )的模式需要保住了一个反斜杠 ( \ } ),否则参数就会结束了。 这是 与关键字前面的示例中所示 今天是$ {日期:\ d { 4 \ } - \ d { 2 \ } \ d { 2 \ } } 

反斜杠( )是一种特殊的字符在Python中常规 表达式语法,因此需要逃脱了如果你想要一个 文字反斜杠字符。 在这种情况下最安全的转义序列 是四个反斜杠( \ \ \ \ ),但是,这取决于下一个 性格,还两个反斜杠可能就足够了。

注意到关键字名称和可能的嵌入参数 应该 不 使用正常的逃脱了 测试数据泄漏 规则 。 这意味着,例如,反斜杠的表达式 就像 $ {名称:\ w + } 不应该逃跑。

使用自定义的变量嵌入参数正则表达式

每当定制的嵌入式参数使用正则表达式时,机器人 框架会自动提高指定的regexp,这样他们 匹配变量除了与模式相匹配的文本。 这 意味着它总是可以用关键字使用变量 嵌入参数。 例如,下面的测试用例能通过 从早期的例子使用关键词。

*** Variables ***
${DATE}    2011-06-27

*** Test Cases ***
Example
    I type ${1} + ${2}
    Today is ${DATE}

一个缺点的变量自动定制正则匹配 表达式是可能值的关键字 实际上并没有匹配指定的正则表达式。 例如,变量 $ {日期} 在上面的例子中可以包含任何价值 今天是$ {日期} 仍将匹配相同的关键字。

行为驱动开发的例子

最大的好处有参数作为关键字的名字是它的一部分 使它更容易使用更高级的句子的关键词在编写测试 病例 行为驱动方式 。 下面的例子说明了这一点。 请注意 也前缀 鉴于 和 然后 是 遗漏了 关键字定义 

*** Test Cases ***
Add two numbers
    Given I have Calculator open
    When I add 2 and 40
    Then result should be 42

Add negative numbers
    Given I have Calculator open
    When I add 1 and -2
    Then result should be -1

*** Keywords ***
I have ${program} open
    Start Program    ${program}

I add ${number 1} and ${number 2}
    Input Number    ${number 1}
    Push Button     +
    Input Number    ${number 2}
    Push Button     =

Result should be ${expected}
    ${result} =    Get Result
    Should Be Equal    ${result}    ${expected}

请注意

在机器人框架受嵌入参数特性 如何 步骤定义 中创建一个受欢迎的BDD工具

用户关键字返回值

同样作为图书馆的关键词,也可以返回用户关键词 值。 通常的定义返回值 (返回) 设置,但也可以使用 内装式 关键字 从关键字 和 从关键字如果回来 。 无论如何返回值,就可以 分配给变量 在测试用例和其他用户的关键词。

使用 (返回) 设置

最常见的情况是,用户关键字返回一个值,它是 分配给一个标量变量。 当使用 (返回) 设置,这是 完成在接下来的细胞通过返回值后设置。

用户关键字也可以返回多个值,然后可以分为 几个标量变量,变量列表,或标量变量 和一个列表变量。 几个可以简单地通过返回值 在不同的细胞后,指定这些值 (返回) 设置。

*** Test Cases ***
One Return Value
    ${ret} =    Return One Value    argument
    Some Keyword    ${ret}

Multiple Values
    ${a}    ${b}    ${c} =    Return Three Values
    @{list} =    Return Three Values
    ${scalar}    @{rest} =    Return Three Values

*** Keywords ***
Return One Value
    [Arguments]    ${arg}
    Do Something    ${arg}
    ${value} =    Get Some Value
    [Return]    ${value}

Return Three Values
    [Return]    foo    bar    zap

使用特殊的关键字返回

内装式 关键字 从关键字 和 从关键字如果回来 从用户的关键字有条件地允许返回中间的字。 他们两人也接受可选的处理完全一样的返回值 与 (返回) 设置上面所讨论的。

下面的第一个例子是功能与之前相同 (返回) 设置的例子。 第二,更先进的例子 演示了返回内部条件 for循环 

*** Test Cases ***
One Return Value
    ${ret} =    Return One Value  argument
    Some Keyword    ${ret}

Advanced
    @{list} =    Create List    foo    baz
    ${index} =    Find Index    baz    @{list}
    Should Be Equal    ${index}    ${1}
    ${index} =    Find Index    non existing    @{list}
    Should Be Equal    ${index}    ${-1}

*** Keywords ***
Return One Value
    [Arguments]    ${arg}
    Do Something    ${arg}
    ${value} =    Get Some Value
    Return From Keyword    ${value}
    Fail    This is not executed

Find Index
    [Arguments]    ${element}    @{items}
    ${index} =    Set Variable    ${0}
    :FOR    ${item}    IN    @{items}
    \    Return From Keyword If    '${item}' == '${element}'    ${index}
    \    ${index} =    Set Variable    ${index + 1}
    Return From Keyword    ${-1}    # Could also use [Return]

请注意

这两个 从关键字 和 从关键字如果回来 因为机器人框架2.8。

用户关键字拆卸

用户使用关键字可以定义拆解 (拆卸) 设置。

关键字拆卸工作一样 测试用例 拆卸 。 最重要的是,拆卸总是一个 关键字,尽管它可以被另一个用户的关键字,就会执行 也当用户关键字失败。 此外,所有的步骤 拆卸执行即使其中一个失败。 然而,失败 关键字拆卸将会失败的测试用例和后续步骤 测试不运行。 的名称关键字执行拆卸 也可以是变量。

*** Keywords ***
With Teardown
    Do Something
    [Teardown]    Log    keyword teardown

Using variables
    [Documentation]    Teardown given as variable
    Do Something
    [Teardown]    ${TEARDOWN}
posted @ 2016-04-17 03:02  七月的尾巴_葵花  阅读(2181)  评论(0编辑  收藏  举报