测试模板
测试模板将普通的 keyword-driven 测试转为 data-driven 测试.
关键字驱动的测试用例的内容包含若干步骤, 每个步骤都涉及带若干参数调用关键字, 而包含模板的测试用例的内容只有调用模板关键字所需的参数.
相比较于在一个测试用例(或一个测试用例文件中的多个测试)中多次调用同一个关键字, 这样只需一个测试用例即可搞定.
模板关键字既可以接受普通的位置参数和命名参数, 也可以接受嵌在关键字名称中的参数. 不同于其他设置, 模板的指定不可以使用变量.
基础用法
下面的例子展示了一个接受位置参数的关键字, 是如何作为模板使用的. 其中这两个用例在功能上是完全相同的.
- *** Test Cases **
- Normal test case
- Example keyword first argument second argument
- Templated test case
- [Template] Example keyword
- first argument second argument
如例中所示, 可以对单个测试用例通过设置 [Template] 指定一个模板. 另一种方式是在测试文件的设置表中设置 Test Template, 这种情况下, 该文件中的所有测试用例都会应用该模板.
如果用例单独设置了 [Template], 则会覆盖文件中的 Test Template, 进而可以为 [Template] 设置空值(空格或 NONE
), 表示当前用例没有模板, 即使测试文件设置表中已有设置.
如果一个模板用例的内容有多行数据, 该模板会逐行应用于这些数据. 也就是说, 该模板关键字会被调用多次, 每次使用其中一行的数据作为参数.
模板测试用例在执行过程中, 如果有某一轮次执行失败也不会影响下面轮次继续执行. 也就是说, 对于普通测试用例需要单独设置的 失败后继续 特性, 对于模板测试用例来说是自动启用的.
- *** Settings ***
- Test Template Example keyword
- *** Test Cases ***
- Templated test case
- first round 1 first round 2
- second round 1 second round 2
- third round 1 third round 2
对模板来说, 各种参数, 包括 缺省值, 可变数量的参数, 命名参数 和 任意关键字参数, 都和平常一样使用. 参数中的 变量 也同样支持.
使用内嵌参数的模板
从Robot Framework 2.8.2版本开始, 模板支持一种变种的 关键字名称中嵌入参数.
对于模板来说, 如果模板关键字名称中包含变量, 则这些变量会被视作参数的占位符, 最终在执行时被实际参数替代. 最终的关键字也不再需要其它的参数了. 如下例所示:
- *** Test Cases ***
- Normal test case with embedded arguments
- The result of 1 + 1 should be 2
- The result of 1 + 2 should be 3
- Template with embedded arguments
- [Template] The result of ${calculation} should be ${expected}
- 1 + 1 2
- 1 + 2 3
- *** Keywords ***
- The result of ${calculation} should be ${expected}
- ${result} = Calculate ${calculation}
- Should Be Equal ${result} ${expected}
当模板中使用了嵌入式的参数, 模板关键字中参数的个数必须和传入的参数个数一致, 但是参数的名称不一定非要和原关键字保持一致. 甚至还可以添加或减少参数, 如下例所示:
- *** Test Cases ***
- Different argument names
- [Template] The result of ${foo} should be ${bar}
- 1 + 1 2
- 1 + 2 3
- Only some arguments
- [Template] The result of ${calculation} should be 3
- 1 + 2
- 4 - 1
- New arguments
- [Template] The ${meaning} of ${life} should be 42
- result 21 * 2
在模板中使用嵌入式参数的主要好处是参数名称都被明确指定. 当使用普通参数时, 也可以通过给列命名来达成同样的效果. 这会在后续章节 数据驱动型 中介绍.
带for循环的模板
如果模板用例中使用了 for loops, 该模板会应用于for循环中每一次的循环. 并且遇到错误也会继续执行. 也就是说, 用例中每一步骤中的每次循环都会被执行.
最好还是来看例子:
- *** Test Cases ***
- Template and for
- [Template] Example keyword
- :FOR ${item} IN @{ITEMS}
- \ ${item} 2nd arg
- :FOR ${index} IN RANGE 42
- \ 1st arg ${index}