RobotFramework 之 RF变量与标准库关键字使用
关键字使用方法查看
方法一:查看官方文档
官方文档 内容比较多,而且是国外的网站,访问可能比较慢,推荐使用方法二
比如要进行web自动化测试,需要用到 SeleniumLibrary
库,点击标题链接后,进入github,查看相关文档
然后点击 keyword documentation
,跳转到关键字文档
通过搜索栏查询关键字,然后查看关键字使用
方法二:查看关键字对应的源码
按住Ctrl,将鼠标移至关键字上,点击关键字,即可进入源码所在py文件
源码中有对应的注释和使用方法示例,如果英文比较差,可借助 Translation
插件,插件安装可查看 该篇文章
RF变量
简单了解一下RF中的参数类型,通过与关键字的使用结合进行了解
RF变量类型和声明
形参
- 必选参数
- 可选参数
- 缺省值参数
- 可变参数
实参
- 字面量:unicode字符串,编码方式utf-8。
- 变量
Scalar
直接传递python对象List
展开列表内的元素,作为多个参数传入Dictionary
展开字典内的元素,作为多个参数传入
RF中变量类型和变量标识符:
每个变量都可以用 变量标识符{变量名}
- scalar变量:
${变量名}
- list变量:
@{变量名}
- dict变量:
&{变量名}
RF变量声明:
底层是python语言实现,所以跟python创建变量类似。
变量不需要特定声明,只要有初始化赋值即可使用。
默认情况下RF里的变量都是字符型的
RF变量赋值
注意:如果一个变量没有经过赋值,使用时会报错的。
- scalar变量:
set variable
关键字赋值。 - list变量:
set variable
和create list
关键字赋值。 - dict变量:
create dictionary
关键字赋值。
scalar变量
新建一个 testconfig.py
文件,用于定义用户关键字
testconfig.py
def get_type(var):
return type(var)
if __name__ == '__main__':
pass
在robot文件中导入这个自定义的库,然后在robot文件中调用 testconfig.py
中 判断类型的方法
定义三个变量 var1
、 var2
、 var3
,将 hello
、 2020
、 [1,2,3,4]
三个参数分别传入到 var1
、 var2
、 var3
三个变量中
然后调用用户关键字
方法,判断 var1
、 var2
、 var3
三个变量的类型,分别将其赋值给变量 type1
、 type2
、 type3
,将这三个变量输出到控制台,查看输出的内容
*** Settings ***
Library testconfig.py
*** Test Cases ***
参数传递
# 定义变量
${var1} set variable hello
${type1} get type ${var1}
log to console ${type1}
${var2} set variable 2020
${type2} get type ${var2}
log to console ${type2}
${var3} set variable [1,2,3,4]
${type3} get type ${var3}
log to console ${type3}
可以发现,控制台输出的内容,都是<class 'str'>
,说明 var1
、 var2
、 var3
三个变量的类型都是字符串类型
这是因为默认情况下RF里的变量都是字符型的
2020
、 [1,2,3,4]
这两个参数看起来像是 int
和 list
类型,实际上,在RF中都是字符串类型,相当于在python中是 '2020'
、 '[1,2,3,4]'
拓展:将字符串类型的内容转换成数字类型的内容
- 法一:通过定义用户关键字方式实现
testconfig.py
def get_type(var):
return type(var)
def str_to_int(var):
return int(var)
def sum_add_10(var):
return var + 10
if __name__ == '__main__':
pass
*** Settings ***
Library testconfig.py
*** Test Cases ***
数学计算1
${var4} set variable 20
${type4} get type ${var4}
${var5} str to int ${var4}
${type5} get type ${var5}
${var6} sum add 10 ${var5}
${type6} get type ${var6}
log to console ${type4}
log to console ${type5}
log to console ${type6}
- 法二:通过
convert to integer
关键字 实现
*** Settings ***
Library testconfig.py
*** Test Cases ***
数学计算2
${num} convert to integer 20
${type7} get type ${num}
${var8} sum add 10 ${num}
${type8} get type ${var8}
log to console ${type7}
log to console ${type8}
同样的关键字还有 convert to number
,将内容转换成浮点数
- 法三:直接转换成整数
这种方式在编辑器中会报红,因为编辑器无法识别,但是运行是没有问题的
*** Settings ***
Library testconfig.py
*** Test Cases ***
数学计算2
${res} sum add 10 ${20}
${type9} get type ${res}
log to console ${res}
log to console ${type9}
浮点数也可以这样转换,但比较复杂的内容就不行了,比如列表
list变量
创建一个list
类型变量
*** Test Cases ***
列表类型
${list} create list a b c
log to console ${list}
控制台中会直接将该变量的内容['a', 'b', 'c']
打印出来
==============================================================================
列表类型 .['a', 'b', 'c']
列表类型 | PASS |
------------------------------------------------------------------------------
Test | PASS |
1 test, 1 passed, 0 failed
而如果将 log to console
打印的内容换一下
*** Test Cases ***
列表类型
${list} create list a b c
log to console @{list}
控制台中就不会将变量的内容打印出来了
==============================================================================
列表类型 | PASS |
------------------------------------------------------------------------------
Test | PASS |
1 test, 1 passed, 0 failed
这个和 log to console
的源码有关
第一个参数 message
指的是输出的值 ,第二个参数stream
指的是输出流,默认是 STDOUT
,也就是输出到控制台上。如果给第二个参数传参了,默认的就不是是 STDOUT
了,就不会输出到控制台上
换成 log many
在生成的日志文件报告中查看一下 ${list}
和 @{list}
两个的区别
*** Test Cases ***
列表类型
${list} create list a b c
log many ${list}
log many @{list}
可以发现, ${list}
对应的是['a', 'b', 'c']
, @{list}
对应的则是三个 a
、b
、c
。 @{list}
相当于将列表里的元素解包了
如果要获取列表里的元素,可以采用下标的方式获取,例如要获取列表中的第二个元素 b
,可以有两种方式,这个和python
也没有很大的区别
*** Test Cases ***
列表类型
${list} create list a b c
log many ${list}
log many @{list}
log many ${list}[1]
log many ${list[1]}
扩展:如果定义列表的时候,不用 $
,而是用@
,会有什么变化?
*** Test Cases ***
列表类型
@{list} create list a b c
log many ${list}
log many @{list}
log many ${list}[1]
log many ${list[1]}
定义的时候,写什么类型,与传参的时候写什么类型,是没有关系的
${list}
传参,称为整体传参
,是作为一个参数传递; @{list}
是解包传参
,作为多个参数传递
dict变量
dict
类型变量是以键值对的方式存在
定义一个dict
类型变量
*** Test Cases ***
字典类型
${dict} create dictionary a=1 b=2 c=3
log many ${dict} # 整体传参--作为一个参数
log many &{dict} # 解包传参--作为多个参数
获取dict
类型变量里的参数
*** Test Cases ***
字典类型
${dict} create dictionary a=1 b=2 c=3
log many ${dict} # 整体传参--作为一个参数
log many &{dict} # 解包传参--作为多个参数
log many ${dict}[b]
log many ${dict['b']}
注意: 如果是在大括号外面通过键值对的方式获取参数的值,是不需要加引号的,因为RF语法默认是字符串的形式,而在大括号里面,是python语法的形式,所以需要加上引号,让其变为字符串类型
RF变量之循环
注意: 这里关键字 FOR
、 IN
、 END
、都需要大写
*** Test Cases ***
循环语法
FOR ${i} IN a b c d
log to console 循环体${i}
END # x循环体结束
打印内容
==============================================================================
循环语法
循环体a
循环体b
循环体c
循环体d
循环语法 | PASS |
例子:遍历0~9
*** Test Cases ***
循环语法
FOR ${i} IN RANGE 5
log to console 循环体${i}
END # x循环体结束
打印结果
==============================================================================
循环语法
循环体0
循环体1
循环体2
循环体3
循环体4
循环语法 | PASS |
例子:输出 1~10间的偶数
*** Test Cases ***
循环语法
FOR ${i} IN RANGE 2 11 2
log to console 循环体${i}
END # x循环体结束
打印结果
==============================================================================
循环语法
循环体2
循环体4
循环体6
循环体8
循环体10
循环语法 | PASS |
这个和python
里的range()
函数是类似的,但一般更复杂点的逻辑,通过python语法自定义关键字实现
循环列表
*** Test Cases ***
循环列表
${list} create list a b c d
FOR ${i} IN @{list}
log to console 循环体${i}
END # x循环体结束
这里需要用到 @{list}
解包传参
打印内容
==============================================================================
循环语法
循环体a
循环体b
循环体c
循环体d
循环语法 | PASS |
标准库常用关键字
log
*** Test Cases ***
常用关键字1
log to console hello
log hello
log many hello! hello \ robotframework
log to console
指的是将日志信息打印到控制台上,我们可以在控制台看到相应的输入信息,但每次只能打印一个参数log
指的是将日志记录到报告中,记录INFO
级别的日志信息log many
传递的是可变参数,可以传递多个参数。如果传递的参数中存在空格,可以使用反斜杠转义,在第二个空格处加入反斜杠,如hello \ robotframework
,这里就只当成是一个参数进行传递。但是一般情况下不推荐在参数中存在空格的情况,如果必须在参数中传递空格,推荐使用自定义关键字方式进行处理,然后在RF中进行调用
断言
should be equal
should be equal
用于判断两个参数是否相等
*** Test Cases ***
断言1
${expect} set variable 2020
should be equal ${expect} 2020
断言2
${expect} set variable 2020
should be equal ${expect} ${2020}
第一条断言是相等的,两个都是字符串类型的2020;第二条断言是不相等的,一个是字符串类型的2020,一个是整数类型的2020
should be equal as integers
将两个参数都转化成整数类型再进行判断是否相等
*** Test Cases ***
断言3
${expect} set variable 2020
should be equal as integers ${expect} 2020
断言4
${expect} set variable 2020
should be equal as integers ${expect} ${2020}
断言3和断言4都是PASS,说明进行判断的两个参数都是相等的。因为都将参数转换成整数类型进行判断了
其他相似的还有:
-
should be equal as strings
:将两个参数都转化成字符串类型再进行判断是否相等 -
should be equal as numbers
:将两个参数都转化成浮点数类型再进行判断是否相等 -
should not be equal as integers
:将两个参数都转化成整数类型再进行判断是否不相等 -
should not be equal as strings
:将两个参数都转化成字符串类型再进行判断是否不相等 -
should not be equal as numbers
:将两个参数都转化成浮点数类型再进行判断是否不相等
should be true
should be true
见名知义,判断是否为真。但这个断言有点特殊,它需要传递的是python表达式
*** Test Cases ***
断言5
${expect} set variable hello
should be equal 'hello'== $expect
这个断言,断言的形式和传参的方式,都比较特殊,和前面的语法略有不同。
首先,这个断言判断的是两个字符串是否相等,而字符串在这个表达式里,需要以引号的方式括起来;
变量的传递,这里需要去掉大括号。如果没有去掉大括号,会产生报错,执行一下,查看控制台打印的内容,可以发现${expect}
传递的内容,变成了hello
,没有带上引号,不是字符串的类型,这是因为RF变量表示的字符串传递给python时,会去掉引号
注意: 在python表达式中,'hello'== $expect
里的内容不能超过两个空格,需要符合RF的编写规则
sleep
*** Test Cases ***
等待
log to console 5秒后见
sleep 5
log to console 5秒到了
在控制台观察可以发现,5秒后才打印 5秒到了
这句话
import library
testconfig.py
def get_type(var):
return type(var)
def str_to_int(var):
return int(var)
def sum_add_10(var):
return var + 10
if __name__ == '__main__':
pass
通常我们导库都是在 Settings
表中导库
*** Settings ***
Library testconfig.py
但除了这种方式,还可以在测试用例中进行导库,这种方式并不常用,稍作了解即可
*** Test Cases ***
数学计算4
import library testconfig.py
${res} sum add 10 ${20}
${type9} get type ${res}
log to console ${res}
log to console ${type9}
但这种方式在编辑器中会报红,编辑器无法识别,且相应的运行命令也需要进行改变
robot -P . -t *4 test1.robot
稍微解释一下,-P .
是指定当前robot文件所在目录下,-t *4
是指仅运行模糊匹配带4
这个字符串的所有测试用例
上面所说的,是 testconfig.py
与robot文件
在同一层级目录,如果在不同层级目录,要在 Settings
表中导库,和在python中导包是类似的
例如现在 testconfig.py
文件在config文件夹
下,config文件夹
与robot文件
在同一层级目录
*** Settings ***
Library config.testconfig.py
数学计算4
${res} sum add 10 ${20}
${type9} get type ${res}
log to console ${res}
log to console ${type9}
使用命令robot -P . -t *4 test1.robot
,依旧可以找到自定义库testconfig.py
,执行用例
还可以通过改变命令,不改变robot文件
中的导入方式,执行用例
robot文件
中依旧只是Library testconfig.py
*** Settings ***
Library testconfig.py
数学计算4
${res} sum add 10 ${20}
${type9} get type ${res}
log to console ${res}
log to console ${type9}
通过改变命令 robot -P . /config -t *4 test1.robot
,也可以执行成功。
关键在于弄清楚相对路径的起点在于当前的robot文件
所在的路径