工程、测试套件、测试用例
在Robot Framework中创建测试项目和创建单元测试项目一致
Robot Framework | unittest(Python) |
Test Project | Test Project |
Test Suit | Test Suit |
Test Case | Test Case |
新建工程
1、选择菜单栏:file----->new Project
2、填写相关信息
⑴Name:工程命名
⑵Parent Directory:上级目录,工程会创建在这个目录下
⑶Created Path:创建工程后的完整路径
⑷Type:工程类型(Type分为文件和目录两种,从方便管理的角度来说,选Directory比较合适)
⑸Format:文件格式(默认选择ROBOT)
⑹注:在创建工程时需要注意下Parent Directory,因为它默认是前一次工程的目录
3、填写好相关信息后,点击[OK]按钮,工程创建成功,右键工程名
⑴New Directory:创建工程或测试套件时,还可以选择是文件还是目录(通常测试工程选择目录(Directory),测试套件选择文件(File))
⑵Change Format:之前设定了工程或测试套件的格式,这里可以进行修改
创建测试套件
1、右键点击“测试项目”选择new Suite选项
2、填写相关内容
Name输入项目名称;Type选择File
3、填写好相关信息后,点击[OK]按钮,测试套件创建成功
创建测试用例
1、右键点击“测试项目”选择 new Test Case
2、填写相关内容,右键用例名
用例只需要输入用例name,点击[OK]即可
3、填写好相关信息后,点击[OK]按钮,用例创建成功,右键用例名
⑴Move Up和Move Down:当测试用例多了时,可以使用该按钮来条件用例间的顺序
注:
1、“测试项目”和“测试套件”本质上并没有什么区别,如果你愿意,也可以把测试项目创建成一个文件
2、如果把“测试项目”创建成一个文件后,那么在这个“测试项目”下就不能再创建“测试套件”了,只能创建测试用例。除非所创建的“测试项目”非常小,只需要几个用例。一般情况下,会选择将其定义成一个目录,这样它就可以分成多个套件,套件可定义为不同的业务,不同的业务下再分用例,结构会更加清晰。
3、当然,同样也可以把“测试套件”创建成一个目录。如果把“测试套件”创建成了一个目录后,就不能直接在其下面创建用例了,还需要再创建的“File”类型的“子测试套件”。说白了就是用例只能创建在file类型的套件中
4、假设Suite1下面有test1和test2并且它们都设置了Setup和Teardown,那么它们的执行顺序为:
Suite1-Setup->test1-Setup->test1-执行->test1-Teardown->test2-Setup->test2-执行->test2-Teardown->Suite1-Teardown
⑴测试用例的初始化:在每个测试用例执行前后都会执行对应的Setup和Teardown
⑵测试套件的初始化:在开始执行前和结束执行测试套件或全部测试用例后各执行一次对应的Setup和Teardown
变量与常量基础
变量标识符
每个变量都可以用变量标识符{变量名}来进行表示,变量主要有两类:Scalar和List
1、Scalar型变量:用$作为标识符
2、List型变量:用@作为标识符
3、例如:${var},@{lvar}就分别是Scalar变量和List变量的展现形式
4、Scalar变量:从翻译上它的中文名叫标量(单值变量),与之对应的就是List这种多值变量了。单值并不仅仅是像字符串、数值这样的,还有可能是个对象或者是字典
5、只有带有@标识的变量能够确认它是List型变量(类似于Python可变参数),而带有$标识的变量则要取决于它的变量名或变量值,才能确定它到底是什么变量,特别是变量值。因为变量之间是可以转换的。例如使用$标识的变量,实际上也可以在接收List值后转化成List变量
变量声明
1、因为RF底层是Python,所以它的语法也有些类似,变量不需要特定声明,只要有初始化赋值即可使用
2、如果硬要说有声明,那可以把在TestSuite下面手动添加的变量理解为声明。比如可以在TestSuite上点右键或者在Edit区点Add Scalar或Add List来新增变量
3、在TestSuite下定义变量给我的感觉就是:定义了一些全局变量,适用于当前suite下的全部测试用例(如果是定义在资源文件suite下,通过调用资源文件,任何一个测试suite都可以使用)。这个要区别与在测试用例中定义的变量
步骤1:创建变量
步骤2:查看创建的变量
⑴成功创建变量后,可以在对应的suite下看到所创建的变量
⑵这个例子中,这种变量是创建在测试用例suite下面的,一般情况下把这类变量创建在资源文件下要好点(不同的suite可以通过调用自原文件来调用这些变量)
步骤3:执行变量
⑴这里使用两个RF自带的关键字log和log many来打印变量,这两个关键字分别适用Scalar变量和List变量,如果用错了,那在运行时会报错
⑵感觉就是定义了一些全局变量:一些很多测试用例都能用到且不需要经常改变的变量
⑶通过输出结果可以看出:List类型的变量里面的值是分别打印出来的(这里需要注意下:List变量表示列表里面的每个元素都是一个变量,而值为列表的Scalar变量是一个变量,且两种的索引方式也不同)
Scalar变量赋值和取值
1、变量赋值也有几种方式,可以根据实际情况来使用
⑴可以使用Set Variable或其它关键字对变量进行赋值
⑵也可在运行中被赋值(即在测试用例中将关键字的返回值赋值给某个变量)
2、取值时都是需要在Scalar情况下来获取的,List可以通过index来取,Dictionary可以通过key来取
Set赋值
通常最常用的方式主要是使用Set Variable关键字对变量进行赋值,其他Set相关的带Variable的关键字也可以进行赋值
例:
1、下面例子表示:第一个变量${value}赋值为abcd,第二个变量判断如果${value}的值和abcd字符串相等,就赋值11给${value2},如果不相等就赋值111
2、赋值的时候,变量后面写不写"="都可以
3、我在实际项目中暂时没有这种赋值方式:一般RF中只有业务逻辑,数据什么的都是在PY层进行处理的,特别是像第二个变量这种,很少用到自带的关键字
Get赋值
主要用于返回值上,包括系统关键字的返回值和用户关键字的返回值(从某种意义上来讲,Set那个也是返回值)
下面例子中表示:将一个字符串型的列表赋值给变量${value},再通过关键字(Get Length)获取变量${value}的长度,将Get Length返回值赋值给变量${len},最后打印变量${len}
命令行赋值
在运行时使用"-V"的参数来给变量赋值:这个是在"Run"页面例进行的,感觉用到的不多,就不打算学了
变量的使用
变量的使用用我自己的话就是:某个地方定义好变量(赋值了),另一个地方调用这个变量
1、在判断中使用
跟前面那个例子一样使用"Set Variable If"等关键字进行判断(我是不习惯这种用法的,感觉还是在PY层处理比较好,不然RF的用例看起来比较复杂)
2、字符串使用
⑴如果想把变量作为一个字符串的一部分,可以按照下面例子中那种写法
⑵在默认情况下,RF里面输入的变量值都是字符串型,并且两个字符串拼接不需要加任何符号,直接连起来就行了(如果添加了符号的话,会把符号也一起加到字符串里面)
⑶除了字符串连接,还有字符串索引和切片:这个规则与Python一样(索引从0开始,包左不包右)
3、参与运算
因为RF中输入的默认都是字符串,如果想要进行数值型的运算的话,可以使用字符串Evalute关键字(也可以使用转义和PY处理)
List变量
赋值
和Scalar类似,List变量也可以使用Set Variable来赋值,但是它最正式的赋值还是使用Create List关键字
例:
下面这个例子中分别使用了关键字Set Variable和Create List来设置一个变量,并分别赋值给一个Scalar类型和List型变量
⑴给我的感觉就是:不管是使用Set Variable还是使用Create List来设置一个变量,它们的返回的结果都是一样的,最终赋值给变量名的值是否有区别主要在于变量名的标识(@和$)
⑵Scalar类型:值里面不管有多少个元素,都是一个变量值
⑶List型变量:值里面有多少个元素就有多少个变量值(感觉跟Python中的可变参数有点类似)
变量使用
在使用上,最直观的是看关键字的参数到底是Scalar的还是List类型的,区别是看变量名前民是否有"*"(星号)
说明:
1、这个关键字有两个参数,name和*args:name就是支持传入的Scalar变量的参数;*args变量就是支持可以传入List变量的。这个关键字的作用就是传入一个name的参数,这是要执行的关键字的名字,*args就是要执行关键字的参数,因为每个关键字所需要的参数个数是不定的,所以这里用了可变个数的参数(*args)
2、List变量其实是不定个数的,它有几个元素,就相当于有几个Scalar变量,所以对于*args可以按照关键字需要一个一个的写,也可以传一个List变量
3、在RF中定义可变参数关键字的变量时要用@{变量名},不能用${变量名 (用$的话表示一个参数值)
List元素的使用
元素的值的索引方式有两种:
⑴List型变量:在List的变量的括号外面加上方括号,里面是索引值,@{变量名}[索引值]
⑵Scalar型变量:在变量名后面加上方括号,里面是索引值,${变量名[索引值]}
变量类型转换
1、看了下资料,感觉List型变量和Scalar型变量相互转化就是:关键在于将值赋值给变量名时,变量名使用的标识($或@)
2、所以在定义变量时,一定要注意所定义的变量的类型
其他变量
Directory变量:Directory其实和List有点类似,List的每个元素是一个值。Directory的每个元素是一对键值对,一个KEY对应一个Value,Key不能重复
对象变量:比如在接口测试中的Request,假设${return}是接口返回的对象。对于对象来说,更多的是使用对象的属性值。比如这个对象的状态是${return.STATUS},对象的内容就是${return.CONTENT}
变量的作用域
1、在通常情况下,每个变量默认都是局部变量。但具体变量还是要根据其定义的位置来确定其作用域:前面提到的测试用例中定义的变量,suite中定义的变量等
⑴一个case里面的变量:作用域在这个case内部
⑵一个userkeyword里面的变量:作用域在这个userkeyword内部
⑶一个文件型suite里面的变量:作用域在这个suite内部,其下面所有的case都可以使用(一种是定义在目录型suite下的,一种是定义在资源文件下的,资源文件下定义的变量可以通过调用资源文件来使用)
⑷一个目录型suite里面的变量:作用域在这个目录里面(这种定义出来是没什么意义的:它下面的文件型suite是无法使用这些变量的)
2、变量的作用域是可以改变的。通过一些关键字可以对变量进行作用域的改变
⑴Set Global Variable:设置为全局变量。设置后这个变量在所有的测试用例和测试套件中都可以使用
⑵Set Suite Variable:设定为File Suite级变量。设置后这个变量在当前文件suite内都可以使用
⑶Set Test Variable:设置为Case级变量。设置后这个变量在当前Test Case内可以使用
注:不过不建议使用这几个关键字来改变变量的作用域
常量
除了变量以外,RF里还有一些常量。常量主要有环境变量、数值常量、特殊字符常量、系统保留变量
1、环境变量:在RF里可以使用同一标识符"%"来表示。如电脑环境变量中定义了一个JAVA_HOME的变量,则在RF中可以使用%{JAVA_HOME}来调用(RF中只能使用,不能赋值)
2、数值常量:通常情况下,在RIDE里面所有字符都会被当做字符串,即使变量的值是数值,默认也是字符串形式存在(Robotframework输入框输入的默认为字符串)。如果想要它以数值方式存在,就可以用到数值常量
⑴使用数值定义方式${2}:如定义一个2的数值类型,可以写成${${2}} (外层的${}是定义一个变量,内层的${2}表示数值,感觉就是转义下)
⑵当然也可以在PY脚本中使用int()函数转换下
3、特殊字符常量和系统保留变量:这行平常几乎遇不到,比如${/}、${:}、${False}、${None}、${null}、${True}
拓展
变量总结
RF共享变量概述
1、引入目的:某些数据(用户名和密码等)根据不同的环境可能会改变,若这些数据都散落在各个测试脚本文件中非常不利于统一修改(这里介绍一种常见的)
2、数据类型:任意python数据类型
3、解决办法:写在配置文件中。variables表,即变量表中申明变量
资源文件申明变量
概述:在资源文件变量表中声明的变量,只要导入对整个资源文件里面所有的测试用例都有效。
如何定义
#定义变量
${MgrLoginUrl} http://localhost/mgr/login/login.html
#定义列表
@{database} 127.0.0.1 3306
#定义字典
&{user} name=auto pw=sdfsdfsdf
RF中声明变量文件并使用
*** Settings ***
Resource rc2.robot
*** Test Cases ***
case03
log to console ${MgrLoginUrl}
log to console ${database[0]}
log to console ${database[1]}
log to console &{user}[name]
log to console &{user}[pw]