测试模板

测试模板将普通的 keyword-driven 测试转为 data-driven 测试.

关键字驱动的测试用例的内容包含若干步骤, 每个步骤都涉及带若干参数调用关键字, 而包含模板的测试用例的内容只有调用模板关键字所需的参数.

相比较于在一个测试用例(或一个测试用例文件中的多个测试)中多次调用同一个关键字, 这样只需一个测试用例即可搞定.

模板关键字既可以接受普通的位置参数和命名参数, 也可以接受嵌在关键字名称中的参数. 不同于其他设置, 模板的指定不可以使用变量.

基础用法

下面的例子展示了一个接受位置参数的关键字, 是如何作为模板使用的. 其中这两个用例在功能上是完全相同的.

  1. *** Test Cases **
  2. Normal test case
  3. Example keyword first argument second argument
  4.  
  5. Templated test case
  6. [Template] Example keyword
  7. first argument second argument

如例中所示, 可以对单个测试用例通过设置 [Template] 指定一个模板. 另一种方式是在测试文件的设置表中设置 Test Template, 这种情况下, 该文件中的所有测试用例都会应用该模板.

如果用例单独设置了 [Template], 则会覆盖文件中的 Test Template, 进而可以为 [Template] 设置空值(空格或 NONE), 表示当前用例没有模板, 即使测试文件设置表中已有设置.

如果一个模板用例的内容有多行数据, 该模板会逐行应用于这些数据. 也就是说, 该模板关键字会被调用多次, 每次使用其中一行的数据作为参数.

模板测试用例在执行过程中, 如果有某一轮次执行失败也不会影响下面轮次继续执行. 也就是说, 对于普通测试用例需要单独设置的 失败后继续 特性, 对于模板测试用例来说是自动启用的.

  1. *** Settings ***
  2. Test Template Example keyword
  3.  
  4. *** Test Cases ***
  5. Templated test case
  6. first round 1 first round 2
  7. second round 1 second round 2
  8. third round 1 third round 2

对模板来说, 各种参数, 包括 缺省值, 可变数量的参数, 命名参数任意关键字参数, 都和平常一样使用. 参数中的 变量 也同样支持.

使用内嵌参数的模板

从Robot Framework 2.8.2版本开始, 模板支持一种变种的 关键字名称中嵌入参数.

对于模板来说, 如果模板关键字名称中包含变量, 则这些变量会被视作参数的占位符, 最终在执行时被实际参数替代. 最终的关键字也不再需要其它的参数了. 如下例所示:

  1. *** Test Cases ***
  2. Normal test case with embedded arguments
  3. The result of 1 + 1 should be 2
  4. The result of 1 + 2 should be 3
  5.  
  6. Template with embedded arguments
  7. [Template] The result of ${calculation} should be ${expected}
  8. 1 + 1 2
  9. 1 + 2 3
  10.  
  11. *** Keywords ***
  12. The result of ${calculation} should be ${expected}
  13. ${result} = Calculate ${calculation}
  14. Should Be Equal ${result} ${expected}

当模板中使用了嵌入式的参数, 模板关键字中参数的个数必须和传入的参数个数一致, 但是参数的名称不一定非要和原关键字保持一致. 甚至还可以添加或减少参数, 如下例所示:

  1. *** Test Cases ***
  2. Different argument names
  3. [Template] The result of ${foo} should be ${bar}
  4. 1 + 1 2
  5. 1 + 2 3
  6.  
  7. Only some arguments
  8. [Template] The result of ${calculation} should be 3
  9. 1 + 2
  10. 4 - 1
  11.  
  12. New arguments
  13. [Template] The ${meaning} of ${life} should be 42
  14. result 21 * 2

在模板中使用嵌入式参数的主要好处是参数名称都被明确指定. 当使用普通参数时, 也可以通过给列命名来达成同样的效果. 这会在后续章节 数据驱动型 中介绍.

带for循环的模板

如果模板用例中使用了 for loops, 该模板会应用于for循环中每一次的循环. 并且遇到错误也会继续执行. 也就是说, 用例中每一步骤中的每次循环都会被执行.

最好还是来看例子:

  1. *** Test Cases ***
  2. Template and for
  3. [Template] Example keyword
  4. :FOR ${item} IN @{ITEMS}
  5. \ ${item} 2nd arg
  6. :FOR ${index} IN RANGE 42
  7. \ 1st arg ${index}