Robot Framework的变量分为标量, 列表和字典, 分别使用语法格式 ${SCALAR}
, @{LIST}
和 &{DICT}
来定义。
此外, 环境变量可以直接使用语法 %{ENV_VAR}
来获取。
标量:可理解为单值变量,与之对应的是List这种多值变量。单值不仅仅像是字符串、数值这样的,还有可能是个对象或者字典。
列表:只有带@标识的变量能够确认是List变量。而带$标识的变量则要取决于它的变量名或者变量值,才能确定它到底是什么变量,特别是变量值。
因为变量之间是可以转换的,例如使用$标识的变量,实际上也可以在接收List值后转换成List变量。
变量在下面的情况中很有用:
- 当测试数据中的字符串经常变化时. 使用变量的话就只需要在一个地方修改.
- 当创建系统无关和平台无关的测试数据时. 使用变量替代硬编码的字符串可以非常方便(例如,
${RESOURCES}
替代c:\resources
,${HOST}
替代10.0.0.1:8080
). 因为变量值可以在测试执行时 通过命令行选项设置, 所以修改系统相关的变量非常容易(例如,--variable HOST:10.0.0.2:1234 --variableRESOURCES:/opt/resources
). - 当需要传递对象而不是字符串参数给关键字时. 这种情况下只能使用变量实现.
- 当不同的关键字(这些关键字可能来自不同的库)之间需要通信时. 可以将一个关键字的返回值先赋值给一个变量, 然后再作为参数传递给另外一个关键字
- 当某个值太长或者太复杂时. 例如, 使用
${URL}
比直接使用http://long.domain.name:8080/path/to/service?foo=1&bar=2&zap=42
简短很多.
Robot Framework 变量, 与关键字类似, 是不区分大小写的, 同时其中的下划线和空格也会被忽略。推荐使用大写字母来表示全局变量(如 ${PATH}
或 ${TWO WORDS}
), 小写字母来表示局部变量(如 ${my var}
或 ${myVar}
)。
内置变量
内置的操作系统相关的变量,减少了测试数据对操作系统之间的差异性的关注
RF 中可用的操作系统相关的内置变量如下表:
变量 | 用途 |
${CURDIR} | 测试数据文件所在目录的绝对路径,该参数是大小写敏感的 |
${TEMPDIR} | 操作系统临时目录的绝对路径,在类 Unix 系统中,该路径通常是 /tmp;在 Windows 系统中,通常是 c:Documents and Settings<user>Local SettingsTemp |
${EXECDIR} | 到测试开始执行的目录的绝对路径 |
${/} | 操作系统文件路径分隔符,在类 Unix 系统中为: ‘/’, 在 Windows 中则为: ‘’ |
${:} | 操作系统路径元素分隔符,在类 Unix 系统中为: ‘:’,在 Windows 中则为: ‘;’ |
${ } | 操作系统行分隔符,在类 Unix 系统中为: ‘
’,在 Windows 中则为: ‘
’ |
*** Test Cases *** Example Create Binary File ${CURDIR}${/}input.data Some text here${ }on two lines Set Environment Variable CLASSPATH ${TEMPDIR}${:}${CURDIR}${/}foo.jar
一、获取列表项
使用下标语法 @{NAME}[index]
可以获取到列表变量中指定项的值, 其中 index
是要获取的项的下标。下标从0开始, 负数的下标等同于从列表末尾向前数。
下标长度超过列表范围会导致错误。下标值自动转换为整数, 同样支持变量表示。获取到的列表项基本等同于一个标量变量。
示例:
二、字典变量
2.1 字典中的项可以作为命名参数传给关键字。假设有个字典变量 &{USER}
中有值 {'name': 'robot', 'password': 'secret'}
, 则下面两个用例的效果是等价的。
2.2 获取字典变量中的项
可以通过 &{NAME}[key]
这样的语法格式获取字典中某项的值, 其中 key
是键的名称。键名当作字符串处理, 非字符串的键可以用变量代替。通过这种方式获取到的值可作为标量变量使用。
如果键是字符串, 还可以使用另一种语法格式 ${NAME.key} (注意到这里是
$
)。
示例:
三、创建变量
3.1 创建标量变量
如果一个标量变量的值很长, 可以分割到多列甚至多行。默认情况下, 各个单元格中的值最终会使用空格拼接起来, 不过可以在第一格中使用 SEPARATOR=<sep>
来指定 连接符。
执行结果:
3.2 创建列表变量
3.3 创建字典变量
如果有多个项重名, 只保留最后那个. 如果项中包含字面的等号, 则该等号必须使用反斜杠进行 转义, 如 =
字典变量中的项是有顺序的,也就是说字典总是会按定义时的顺序迭代,这在把字典当作列表变量使用时(例如在 FOR循环 )很有用。当字典被当作列表迭代时, 实际返回的值是字典的键。例如, @{MANY}
变量的值是 ['first', 'second', 3]。
四、命令行中设置变量
变量可以在命令行中通过选项 --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"
在命令行中指定变量文件的选项格式是 --variablefile path/to/variables.py
注:如果变量同时在命令行的变量文件中和单独指定, 则单独指定的变量有更高的优先级。
五、关键字的返回
关键字的返回值可以赋值给变量, 这样不同的关键字之间就可以进行交互。
这种方式定义的变量和其它变量基本相同, 只是其作用域仅限于它们被创建的 local scope。也就是说 不可能 在一个测试用例里得到这样一个返回值变量, 然后在另一个用例中使用。因为自动化测试用例通常需要保持相互独立, 而不应该互相依赖。如果用例中定义的变量可以在其它用例使用, 这将导致很难定位的错误。
示例:
六、使用关键字创建变量
通过关键字 Set Test Variable 设置的变量在当前测试用例的作用域内处处可用。例如, 在一个测试用例中的一个用户关键字中设置了一个变量, 该变量会在这个测试用例步骤可见, 同时当前用例中的其它用户关键字也可以使用这个变量,这个关键字创建的变量在其它测试用例中不可用。
通过关键字 Set Suite Variable 创建的变量在当前执行的测试套件内处处可见。 使用这个方式创建变量和在测试数据文件的变量表格中定义变量, 以及从变量文件导入变量的效果一样。这些变量对其它的测试套件, 包括子套件, 都不可见。
通过关键字 Set Global Variable 创建的变量在设置之后全局可见。这种方式创建的变量和在 setting variables in command line 中使用选项 --variable
或 --variablefile
定义变量效果一样,因为这个关键字会改变任意地方的变量, 所以必须谨慎使用。
注:关键字 Set Test/Suite/Global Variable 直接在作用域内设置变量, 没有返回值。而 Set Variable 设置局部变量, 并且有返回值。
七、数字变量
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
八、布尔值和None/null值
*** Test Cases *** Boolean Set Status ${true} # Set Status gets Boolean true as an argument Create Y something ${false} # Create Y gets a string and Boolean false None Do XYZ ${None} # Do XYZ gets Python None as an argument Null ${ret} = Get Value arg # Checking that Get Value returns Java null Should Be Equal ${ret} ${null}
注:这些变量也是大小写不敏感的,所以 ${True} 和 ${true} 是一样的。此外 ${None} 和 ${null} 是同义词,因为用 Jython 解释器执行用例时, Jython 会自动将 None 和 null 转换成正确格式。
九、空格和空字符串/列表/字典
变量 ${SPACE}
和 ${EMPTY}
分别用来创建空格和空字符串,使用这些变量相对于使用反斜杠来转义空格容易的多。同时还可以使用扩展变量语法表示连续的多个空格, 例如 ${SPACE * 5}
下面的例子中, 关键字 Should Be Equal 接收到两个等价的入参, 可以看出使用变量的形式比使用反斜杠看上去容易理解的多。
*** Test Cases *** One Space Should Be Equal ${SPACE} Four Spaces Should Be Equal ${SPACE * 4} Ten Spaces Should Be Equal ${SPACE * 10} Quoted Space Should Be Equal "${SPACE}" " " Quoted Spaces Should Be Equal "${SPACE * 2}" " " Empty Should Be Equal ${EMPTY}
还有两个变量 @{EMPTY} 和 &{EMPTY},他们分别表示 ‘空列表’ 和 ‘空字典’ 变量。 这两个变量也是有用的,例如在写测试模板的时候,模板关键字不带参数使用时。
*** Test Cases ***
Template
[Template] Some keyword
@{EMPTY}
Override
Set Global Variable @{LIST} @{EMPTY}
Set Suite Variable &{DICT} &{EMPTY}
十、自动变量
自动变量被RF框架创建和修改,在测试执行过程中值可能会变化;另外,某些自动变量在执行过程中并非总是可用。
修改自动变量,并不能对变量的初始值产生影响。
但可以用某些内建关键字来修改某些自动变量的值。
变量名 | 含义 | 可用范围 |
---|---|---|
${TEST NAME} | 当前测试用例的名字 | Test case |
@{TEST TAGS} | 当前测试用例的标签(按字母序)。可以使用"Set Tags"和"Remove Tags"关键字修改 | Test case |
${TEST DOCUMENTATION} | 当前测试用例的文档说明。可以使用"Set Test Documentation"关键字修改 | Test case |
${TEST STATUS} | 当前测试用例的状态: Pass或FAIL | Test teardown |
${TEST MESSAGE} | 当前测试用例的消息 | Test teardown |
${PREV TEST NAME} | 前一个测试用例的名字。如果还没有用例被执行,值为空字符串 | Everywhere |
${PREV TEST STATUS} | 前一个测试用例的状态: Pass或FAIL。如果还没有用例被执行,值为空字符串 | Everywhere |
${PREV TEST MESSAGE} | 前一个测试用例的错误消息 | Everywhere |
${SUITE NAME} | 当前Suite的全名 | Everywhere |
${SUITE SOURCE} | Suite的文件或目录的绝对路径 | Everywhere |
${SUITE DOCUMENTATION} | 当前测试Suite的文档说明。可以使用"Set Suite Documentation"关键字修改 | Everywhere |
&{SUITE METADATA} | 当前测试Suite的元数据。可以使用"Set Suite Metadata"关键字修改 | Everywhere |
${SUITE STATUS} | 当前测试Suite的状态: Pass或FAIL | teardown |
${SUITE MESSAGE} | 当前测试Suite的消息, 包括统计信息 | Suite teardown |
${KEYWORD STATUS} | 当前测试关键字的状态: Pass或FAIL | User keyword teardown |
${KEYWORD MESSAGE} | 当前测试关键字的错误消息 | User keyword teardown |
${LOG LEVEL} | 当前的日志级别 | Everywhere |
${OUTPUT FILE} | 输出(output)文件的绝对路径 | Everywhere |
${LOG FILE} | 日志(log)文件的绝对路径。如果没有日志文件,值为空字符串 | Everywhere |
${REPORT FILE} | 报告(report)文件的绝对路径。如果没有报告文件,值为空字符串 | Everywhere |
${DEBUG FILE} | 调试(debug)文件的绝对路径。如果没有调试文件,值为空字符串 | Everywhere |
${OUTPUT DIR} | 输出(output)文件所在目录的绝对路径 |
使用例子:
-------
------
十一、变量的作用域
在通常情况下,每个变量默认都是局部变量,在默认情况下,变量的作用域为:
- 一个case里的变量,作用域在这个case内部
- 一个userkeyword里的变量,作用域在这个userkeyword内部
- 一个文件型suite里的变量,作用域在这个suite内部,所有下级case都可以使用
- 一个目录型suite里的变量,作用域在这个目录内,但是它下级文件型suite是无法使用的,所以一般在目录下新增变量没有太大意义
变量的作用域是可以改变的,通过一些关键字的处理,对变量进行作用域的改变,常用的关键字有:
- Set Global Variable为设定全局变量。当执行过这个设置后,这个变量在所有的测试案例和测试套件中都有效
- Set Suite Variable为设定File Suite级变量。当执行过这个设置后,这个变量在当前的File Suite内都有效
- Set Test Variable为设定Case级变量。当执行过这个设置后,这个变量在当前的Test Case内有效
原文地址:https://www.cnblogs.com/chengchengla1990/p/6725162.html
https://www.cnblogs.com/chengchengla1990/p/7056541.html