变量的优先级和作用域

不同来源的变量拥有不同的优先级, 并作用于不同的作用域.

变量的优先级

通过命令行设置的变量

对于所有那些在测试执行前指定的变量来说, 通过 命令行设置 的变量拥有最高优先级.这些变量有可能会覆盖在测试用例文件的变量表格中定义的变量, 或者导入的资源文件或变量文件中的变量.

单独设定的变量(—variable 选项)可能会覆盖通过 变量文件 (—variablefile 选项)定义的变量. 如果同名的变量单独设置多次, 则只生效最后那个. 这种行为使得我们可以在 start-up script 中设置缺省的变量值, 并在命令行调用时看情况予以覆盖.

注意, 如果多个变量文件中有同名参数, 第一个文件中定义的那个变量有最高优先级.

在用例文件的变量表格中定义的变量

在测试用例文件的 变量表格 中创建的变量在该文件中的所有用例内可用. 这些变量有可能会覆盖在导入的资源文件或变量文件中定义的同名变量.

变量表格中创建的变量在文件中所有其它表格中也是可用的. 也就是说, 它们可以被用在Setting表格中, 用来导入其它文件.

导入的资源和变量文件中的变量

在所有测试数据中创建的变量中, 从 资源文件和变量文件 导入的变量的优先级最低. 资源文件和变量文件中的变量的优先级相同. 如果多个资源文件和(或)变量文件有同名变量, 则生效的是第一个被导入文件中的变量.

如果一个资源文件中继续导入其它的资源文件或变量文件, 则其自身变量表格中的变量优先级高于它导入的变量. 而最终只导入这一个资源文件, 就可以访问所有这些文件中所定义的变量.

注意资源文件和变量文件中的变量不可用于导入它们的文件的变量表格中, 这是因为变量表格在设置表格(即文件导入的地方)之前处理.

测试执行中定义的变量

通过 关键字的返回值 或者 using Set Test/Suite/Global Variable keywords 在测试执行过程中设置的变量总是覆盖可能存在的同名变量.从这点上来说, 这些变量拥有最高的优先级. 但是, 从另一方面来看, 这些变量不会影响到它们作用域之外的变量.

内置变量

内置变量, 如 ${TEMPDIR}${TESTNAME} 在所有变量中拥有最高优先级. 它们不能被变量表格或者命令行选项所覆盖, 不过即使这样, 它们还是可以在测试执行过程中被重置. 一个例外是 number variables, 它们总是被动态解析. 虽然也是可以被覆盖的, 但是强烈不建议这样做. 此外, ${CURDIR} 也比较特殊, 因为它在测试数据处理前就已经被替代.

变量的作用域

取决于变量创建的地方和方式, 它们可以拥有 全局作用域, 测试套件作用域, 测试用例作用域 或者局部作用域.

全局作用域

全局作用域的变量在测试数据中处处可用. 全局变量一般是从命令行设置, 通过 —variable—variablefile 选项. 还可以使用 BuiltIn_ 关键字 Set Global Variable 在测试执行中创建或修改全局变量. 此外, 内置变量 都是全局的.

推荐使用大写字母来表示全局变量.

测试套件作用域

测试套件内定义或导入的变量在该测试套件作用域内处处可见. 这些变量可以是通过变量表格创建, 也可能是来自导入的 资源文件和变量文件, 也可以使用 BuiltIn_ 关键字 Set Suite Variable 在测试执行中创建或修改.

测试套件作用域 不是 递归的, 即高层测试套件内的变量在低层的测试套件内 不可用. 如果有必要, 使用 资源文件和变量文件 来共享变量.

因为这些变量在测试套件内基本可当作全局性的, 所以同样推荐使用大写字母来表示.

测试用例作用域

测试用例作用域的变量在测试用例内部, 包括用例内所有的用户关键字内, 都是可见的. 用例作用域的变量都是通过使用 BuiltIn_ 关键字 Set Test Variable 在测试用例中创建.

该作用域内的变量同样也推荐使用大写字母表示.

局部作用域

测试用例和用户关键字拥有一个局部作用域, 对其它用例和关键字都是不可见的. 局部变量通过执行关键字并获取其 返回值 来创建, 作为 参数 传递给用户关键字.

推荐使用小写字母来表示局部变量.

注解

在 Robot Framework 2.9 版本之前, 局部作用域内的变量会泄露到低层的用户关键字中. 这个绝不能视为是有意的特性, 而应该在早期版本中也显式的设置并传递变量.