Robot Framework 6 变量
Robot Framework 的变量分为 标量, 列表 和 字典, 分别使用语法格式 ${SCALAR}, @{LIST} 和 &{DICT} 来定义. 此外, 环境变量 可以直接使用语法 %{ENV_VAR} 来获取.
大部分情况下, 变量是用于关键字的参数
不过所有的设置项也都支持用变量来指代设置值
一般情况下关键字的名称是不能使用变量替代的, 不过, 可以通过 BuiltIn 关键字 Run Keyword 来实现这个效果.
Robot Framework 变量, 与关键字类似, 是不区分大小写的, 同时其中的下划线和空格也会被忽略. 推荐使用大写字母来表示全局变量(如 ${PATH} 或 ${TWO WORDS}), 小写字母来表示局部变量(如 ${my var} 或 ${myVar}). 谨记, 关于大小写的使用风格要保持一致.
1. Scalar variable 标量变量
当使用标量变量时, 变量被其赋值所替代. 最常用的标量赋值是字符串, 实际上标量可以是任何对象, 包括列表,字典等。
下面的例子介绍了如何使用标量变量. 假设变量 ${GREET} 和 ${NAME} 在当前作用域内可用, 且分别被赋值为 Hello 和 world. 例子中两个测试用例是等价的.
*** Test Cases ***
Constants
Log Hello
Log Hello, world!!
Variables
Log ${GREET}
Log ${GREET}, ${NAME}!!
2. List variable 列表变量
如果这个变量的值是一个列表, 或者类似列表的其它序列, 还可以将该变量作为列表变量使用, 格式为 @{EXAMPLE} 这种情况下, 列表中的元素会各自作为参数传递.
假设有一个变量 @{USER} 值是 ['robot', 'secret'] 下例中两个测试用例是等价的:
*** Test Cases ***
Constants
Login robot secret
List Variable
Login @{USER}
2.1 与其他数据混用
列表变量可以和其它参数混用, 其中可能还包含其它的列表参数.
*** Test Cases ***
Example
Keyword @{LIST} more args
Keyword ${SCALAR} @{LIST} constant
Keyword @{LIST} @{ANOTHER} @{ONE MORE}
如果一个列表变量在单元格内和其它内容(比如字符串或其它变量)混用, 则最终的值会是该变量的字符串表示, 就跟标量变量的处理方式一样.
2.2 使用下标值获取变量
使用下标语法 ${NAME}[index] 可以获取到列表变量中指定项的值, 其中 index 是要获取的项的下标. 下标从0开始, 负数的下标等同于从列表末尾向前数. 下标长度超过列表范围会导致错误.
2.3 使用下标值获取一个片段
使用python中语法可以指定index的开始、结束和步进。
*** Test Cases ***
Start index
Keyword ${LIST}[1:]
End index
Keyword ${LIST}[:4]
Start and end
Keyword ${LIST}[2:-1]
Keyword ${LIST}[::2]
Keyword ${LIST}[2:-1:2]
3. Dictionary variable
假设有个字典变量 &{USER} 中有值 {'name': 'robot', 'password': 'secret'}, 则下面两个用例的效果是等价的.
*** Test Cases ***
Constants
Login name=robot password=secret
Dict Variable
Login &{USER}
3.1 获取字典中的项
可以通过 ${NAME}[key] 这样的语法格式获取字典中某项的值, 其中 key 是键的名称. 键名当作字符串处理, 非字符串的键可以用变量代替. 通过这种方式获取到的值可作为标量变量使用.
如果键是字符串, 还可以使用另一种语法格式 ${NAME.key}.
*** Test Cases ***
Dict Variable Item
Login ${USER}[name] ${USER}[password]
Title Should Be Welcome ${USER}[name]!
Key As Variable
Log Many ${DICT}[${KEY}] ${DICT}[${42}]
Attribute Access
Login ${USER.name} ${USER.password}
Title Should Be Welcome ${USER.name}!
4. Environment variable 环境变量
Robot Framework使用 %{ENV_VAR_NAME} 这种语法格式来使用环境变量. 环境变量的值只能是字符串.
在测试执行前已设置的操作系统环境变量在执行过程中都是可用的, 同时还可以使用关键字 Set Environment Variable 创建新的环境变量, 或者 Delete Environment Variable 删除某个环境变量, 这两个关键字都是来自于 OperatingSystem 库.
因为环境变量是全局的, 所以在一个测试用例中设置的环境变量可以在后续执行的另一个测试用例中使用. 不过, 测试执行中改变的环境变量在测试执行完成后即恢复原状, 即不会真正改变系统的环境变量.
*** Test Cases ***
Env Variables
Log Current user: %{USER}
Run %{JAVA_HOME}${/}javac
5. 创建scalar variables
在variable table中的第一列指定变量名称(包括 ${}), 在第二列放上变量的值. 如果第二列为空, 则表示变量的值是空字符串. 值同时也可以是其它已经定义的变量.
*** Variables ***
${NAME} Robot Framework
${VERSION} 2.0
${ROBOT} ${NAME} ${VERSION}
如果一个标量变量的值很长, 可以分割到多列甚至 多行. 默认情况下, 各个单元格中的值最终会使用空格拼接起来, 不过可以在第一格中使用 SEPARATOR=<sep> 来指定连接符.
*** Variables ***
${EXAMPLE} This value is joined together with a space
${MULTILINE} SEPARATOR=\n First line
... Second line Third line
6. 创建list variable
创建列表变量同样很简单. 变量名同样位于变量表格的第一列, 值位于后续的列. 一个列表变量可以有任意多的值, 包括0个值. 如果值比较多, 同样可以 分为多行.
*** Variables ***
@{NAMES} Matti Teppo
@{NAMES2} @{NAMES} Seppo
@{NOTHING}
@{MANY} one two three four
... five six seven
7. 创建dictionary variable
字典变量的创建方式类似列表. 不同之处在于字典的项需要使用 name=value 的语法格式, 或者其它的字典变量. 如果有多个项重名, 只保留最后那个. 如果项中包含字面的等号, 则该等号必须使用反斜杠进行 转义, 如 \=
*** Variables ***
&{USER 1} name=Matti address=xxx phone=123
&{USER 2} name=Teppo address=yyy phone=456
&{MANY} first=1 second=${2} ${3}=third
&{EVEN MORE} &{MANY} first=override empty=
... =empty key\=here=value
字典变量相较于普通的Python字典有两个额外的属性(properties).
首先, 字典的项可以作为属性(attributes)获取, 也就是说使用 扩展变量语法 如 ${VAR.key}. 前提是该key是一个合法的属性名且不会匹配上任何其它普通的属性. 例如, &{USER}[name] 同样可以通过 ${USER.name} 获取(注意到这里是 $ ), 但是 ${MANY.3} 就不可以.
另一个特别之处在于字典变量中的项是有顺序的. 也就是说字典总是会按定义时的顺序迭代. 这在把字典当作 列表变量 使用时(例如在 FOR循环 )很有用. 当字典被当作列表迭代时, 实际返回的值是字典的键. 例如, @{MANY} 变量的值是 ['first', 'second', 3].
8. 命令行中设置变量
变量可以在命令行中通过选项 --variable (-v) 单个设置, 也可以通过选项 --variablefile (-V) 设置变量文件. 通过命令行设置的变量对所有执行的测试文件是全局可见的, 不过如果局部的变量表格或者局部导入的变量文件中存在重名的变量, 则这些变量也会被命令行中指定的值所覆盖.
设置单个变量的选项格式是 --variable name:value, 其中 name 是变量名, 不带 ${} value`是变量的值. 有多个变量的话就使用这个选项多次. 这种方式只能定义标量变量. 很多特殊字符必须使用选项 :option:–escape` 经过 转义 才能表示.
--variable EXAMPLE:value
--variable HOST:localhost:7272 --variable USER:robot
--variable ESCAPED:Qquotes_and_spacesQ --escape quot:Q --escape space:_
在上例中, 变量值分别是:
${EXAMPLE} 值为 value
${HOST} 和 ${USER} 值分别为 localhost:7272 和 robot
${ESCAPED} 值为 "quotes and spaces"
9. 关键字的返回值
关键字的返回值可以赋值给变量, 这样不同的关键字之间就可以交互了.
这种方式定义的变量和其它变量基本相同, 只是其作用域仅限于它们被创建的 local scope. 也就是说 不可能 在一个测试用例里得到这样一个返回值变量, 然后在另一个用例中使用. 因为自动化测试用例通常需要保持相互独立, 而不应该互相依赖.
10. 使用关键字创建变量
BuiltIn_ 测试库提供了几个可以在测试执行时动态设置变量的关键字: Set Test Variable, Set Suite Variable 和 Set Global Variable. 如果作用域内已经存在同名变量, 则会覆盖变量的值否则创建新的变量.
通过关键字 Set Test Variable 设置的变量在当前测试用例的作用域内处处可用. 例如, 在一个测试用例中的一个用户关键字中设置了一个变量, 该变量会在这个测试用例步骤可见, 同时当前用例中的其它用户关键字也可以使用这个变量. 这个关键字创建的变量在其它测试用例中不可用.
通过关键字 Set Suite Variable 创建的变量在当前执行的测试套件内处处可见. 使用这个方式创建变量和在测试数据文件的 变量表格 中定义变量, 以及从 变量文件 导入变量的效果一样. 这些变量对其它的测试套件, 包括子套件, 都不可见.
通过关键字 Set Global Variable 创建的变量在设置之后全局可见. 这种方式创建的变量和在 setting variables in command line 中使用选项 --variable 或 --variablefile 定义变量效果一样. 因为这个关键字会改变任意地方的变量, 所以必须谨慎使用.
11. 操作系统变量
操作系统相关的内置变量使得编写针对不同操作系统的测试数据变的轻松.
可用的操作系统相关的内置变量
Variable | Explanation |
${CURDIR} |
An absolute path to the directory where the
test data file is located. This variable is case-sensitive. |
${TEMPDIR} |
An
absolute path to the system temporary directory. In UNIX-like systems this is typically /tmp, and in Windows c:\Documents and Settings\<user>\Local Settings\Temp. |
${EXECDIR} |
An
absolute path to the directory where test execution was started from. |
${/} |
The
system directory path separator. / in UNIX-like systems and \ in Windows. |
${:} |
The
system path element separator. : in UNIX-like systems and ; in Windows. |
${\n} |
The
system line separator. \n in UNIX-like systems and \\r\\n in Windows. New in version 2.7.5. |
*** Test Cases ***
Example
Create Binary File ${CURDIR}${/}input.data Some text here${\n}on two lines
Set Environment Variable CLASSPATH ${TEMPDIR}${:}${CURDIR}${/}foo.jar
12. 数字变量
变量的语法可以用来创建整型整数和浮点型数字. 如下例所示. 因为 Robot Framework默认传递的是字符串, 显式的传递数字对那些预期接受参数是数字(而不是数字字符串)的关键字来说很有用.
*** Test Cases ***
Example 1A
Connect example.com 80 # Connect gets two strings as arguments
Example 1B
Connect example.com ${80} # Connect gets a string and an integer
Example 2
Do X ${3.14} ${-1e-4} # Do X gets floating point numbers 3.14 and -0.0001