2.2 创建测试用例

2.2.1 测试用例语法

基本语法

测试用例是使用可用的关键字构造的测试用例表。关键字可以从测试库或资源文件中导入,或则通过测试用例的关键字表本身创建。

测试用例表第一列包含了测试用例的名称。一个测试用例的开始是从包含测试用例名词的这一行到下一个用 例名称或表格的结束。在表头和第一个测试直接包含其他内容是错误的。

第二列通常是关键字名称。这种规则的例外是设置关键字的返回值,在第二个或后续的列可能会包含变量 名和关键字跟随其后。在这两种用例中,列的内容包含的可能是参数或是特定的关键字。

*** Test Cases ***
Valid Login
    Open Login Page
    Input Username    demo
    Input Password    mode
    Submit Credentials 
    Welcome Page Should Be Open

Setting Variables
    Do Something    first argument    second argument 
    ${value} =    Get Some Value
    Should Be Equal    ${value}    Expected value

尽管测试用例名称可以包含任意字符,但是?和*不推荐使用,因为它们通常在选择测试用例时作为通配符使用。例如,试图运行一个名为Example*独立测试如--test 'Example*',但是这样会执行所有前缀为Example的测试。

测试用例表的设置

测试用例也有自己的设置。与关键字的位置一样,设置名称也是在表格的第二列,设置的值在后续的列 中。设置名称由方括号包围,以区别于关键字。以下是可用的设置名称,并将在本章的后面进行解释。

[Documentation]

用于说明测试用例的注释

[Tags]

用于标记测试用例

[Setup], [Teardown]

用于指定测试用例的Setup和Teardown,其同义词是[Precondition]和[Postcondition]

[Template] 用于指定测试用例模板。这个测试本身只包括用于关键字参数的数据。

[Timeout]

设置测试用例超时。

测试用例设置例子:

*** Test Cases ***
Test With Settings
    [Documentation]    Another dummy test
    [Tags]    dummy    owner-johndoe
    Log    Hello, world!

测试表中测试用例相关设置

以下是设置表中测试用例的相关设置。在测试用例指定设置之前,这些值是设置的默认值。

Force Tags, Default Tags

Tag的强制和默认值

Test Setup, Test Teardown

Test Setup ,Test Teardown的默认值。其同义词是 Test Precondition 和 Test Postcondition。

Test Template

默认模板关键字

Test Timeout

测试用例超时的默认值。

2.2.2 参数使用

前面已经展示了使用不同参数的关键字,这个章节将进一步介绍这一重要功能。关键字可以接受零或多个参数,并且有些参数可能会有默认值。关键字能接受哪种参数取决于其实现,通常可以搜索关键字注释获取这些信息。这里的例子,注释是通过libdoc.py生成的,同样的信息在javadoc之类的工具生成的注释中也能找到。

必选参数

大多数的关键字有指定数目的参数,这些是必需单独参数。在关键字文档中,通过逗号分隔的特定参数名称来制定其参数,如: first, second, third. 这些参数的名称不重要,除非需要解释这个参数的作用,但重要的是参数的数目必须同文档中规定的一致。。使用过多或过少的参数都将是错误的。下面的例子用到了OperatingSystem 库中的关键字 Create Directory 和 Copy File。第一个关键字有 1 个参数,用来指定路径;第二个关键字有 2 个参数,分别用来指定源文件和目标文件夹;最后一个关键字是来自 BuiltIn 库的 No Operation,它不需要参数。

*** Test Cases ***
Example
    Create Directory    ${TEMPDIR}/stuff
    Copy File    $P={CURDIR}/file.txt    ${TMPDIR}/stuff
    No Operation

默认值

有默认值的参数通常可以提供或不提供。在本文档中,参数名和默认值之间由等号分隔,如 name = default value,但是对使用 Java 实现的关键字来说,同一个关键字可能会有多种实现方法,只是它们的参数不同。 所有的参数都可以有默认值,但是有默认值的参数后面不能再有参数了。

下面的例子说明了默认值的使用,这个例子使用了 Create File 关键字,参数包括:path, content=, encoding=UTF-8。如果试图不使用任何参数或者是超过三个参数,这个关键字都不能工作。

*** Test Cases ***
Example
    Create File    ${TEMPDIR}/empty.txt
    Create File    ${TEMPDIR}/utf-8.txt Hyvä esimerkki
    Create File    ${TEMPDIR}/iso-8859-1.txt    Hyvä esimerkki    ISO-8859-1

可变数目的参数

可以创建接受任意数目参数的关键字。这些参数可以由强制参数和有默认值的参数组成,但可变参数要放到最后。在本文档中,这种参数通常是在参数名前面加个*,如*varargs.

Remove Files 和 Join Paths关键字在下面例子中分别使用这些参数:*paths 和base, *parts.前者可以使用任意数目的参数,后者则至少需要一个参数。

使用可变数目参数的关键字

*** Test Cases ***
Example
    Remove Files    ${TEMPDIR}/f1.txt    ${TEMPDIR}/f2.txt    ${TEMPDIR}/f3.txt
    @{paths} =    Join Paths    ${TEMPDIR}    f1.txt    f2.txt    f3.txt    f4.txt

命名参数

命名参数语法使得使用带有默认值的参数更加灵活,并允许明确标注那些特定参数值的意义。技术实现上,命名参数和python中关键字参数相同。

基本语法

类似于arg=value,给一个参数名称定义一个关键字参数。当多个参数有默认值时,它可以列出一部分参数,让其他的参数使用默认值。 例如,一个关键字接受参数arg1=a, arg2=b, arg3=c,并且只调用一个参数arg3=override,参数arg1、arg2使用默认值,但arg3需要得到override。这听起来很复杂,但下面的命名参数例子会使它变得更简洁。

命名参数语法,格式需要使用arg=value这种,而不是Arg=value或ARG=value.

当命名参数语法使用用户关键字时,命名参数不能包含\(\{\}修饰符。例如,用户关键字有\){arg1}=first,${arg2}=second参数,必须像arg2=override这样使用。

命名参数之后使用正常的位置参数,如 | Keyword | arg=value | positional |,是不能正常工作的。从2.8之后,这会导致explicit错误。命名参数的相对顺序并不重要。

使用变量命名参数

在命名参数的名字和值都可以使用变量。如果值是单一的scalar变量,它会原样传递给关键字。命名参数语法中值可以是任何对象,不仅仅是字符串。例如调用关键字arg=\(\{object\},将通过变量\){object}得到而并将其转为字符串。

如果变量用于命名参数的名称时,变量要在匹配到参数名称前解决。

命名参数语法要求使用=号。这意味着,单独变量不能触发命名参数语法,甚至没有像foo=bar的值.在这进行关键字转换时,尤为重要。例如,一个关键字需要可变数量的参数@{args},并传递使用相同语法的另一个关键字@{args},位置参数named=arg语法不被识别。

*** Test Case ***
Example
      Run Program    shell=True    # This will not come as a named argument to Run Process

*** Keywords ***
Run Program
    [Arguments]    @{args}
    Run Process    program.py    @{args}    # Named arguments are not recognized from inside @{args}

如果关键字需要接受并传递着任何命名参数,它必须改为支持接受自由的关键字参数。

命名参数示例

下面的例子演示如何使用库关键字,用户关键字命名参数语法,导入的Telnet测试库时间。

*** Settings ***
Library    Telnet    prompt=$    default_log_level=DEBUG

*** Test Cases ***
Example
    Open connection    10.0.0.42    port=${PORT}    alias=example
    List files    options=-lh
    List files    path=/tmp    options=-l

*** Keywords ***
List files
    [Arguments]    ${path}=.    ${options}=
    Execute command    ls ${options} ${path}

自由关键字参数

RF2.8版本增加了python风格的自由关键字参数(**kwargs).这意味着关键字可以接受任何使用name=value这种语法的参数,并且不匹配任何其他的kwargs参数。 自由关键字参数支持类似于命名参数的变量。在实践中,这意味着该变量可以作为名称和值,但使用显示的转义。例如,foo=\(\{bar\}和\){foo}=${bar}都有效,只要使用的变量存在。一个额外的限制是自由的关键字参数名必须是字符串。

Kwargs 例子

第一个使用kwargs的例子,我们看一下Process库中关键字的运行过程。它包括一个command签名,*arguments, **configuration,这意味着它需要执行的命令(command),其参数为可变的参数(*arguments),最后是由自由关键字(**configuration)作为可选的配置参数。这个例子可以看到,变量在自由关键字参数中可以和命名参数语法一样使用。

*** Test Cases ***
Using Kwargs
    Run Process    program.py    arg1    arg2    cwd=/home/user
    Run Process    program.p    argument    shell=True    env=${ENVIRON}

第二个例子,创建一个封装用户关键字运用执行上面例子的program.py.该封装关键字运行程序接受任意数目的参数和kwargs,并向前为执行程序传递命令的名称进行执行。

*** Test Cases ***
Using Kwargs
    Run Program    agr1    agr2    cwd=/home/user
    Run program    argument    shell=True    env=${ENVIRON}
*** Keywords ***
Run Program
    [Arguments]    @{arguments}    &{configuration}
    Run Process    program.py    @{arguments}    &{configuration}

关键字名称嵌入参数

一个完全不同的方法来指定参数被嵌入他们到关键字名称。这个语法支持测试库的关键字和用户的关键字。

by 李鹏