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