robotframework是基于python的自动测试框架,可以在官网查看详细的文档:
https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html
文档很详细,但细节过多,这里将安装使用过程浓缩一下。
快速使用
首先,确保系统安装了python。然后就可以使用pip安装了:
pip install robotframework
安装完成后,使用下面的命令查看版本:
robot –version
然后我们可以创建一个简单的测试脚本:
1 | *** Settings *** |
然后,可以使用robot运行这个测试脚本:
robot helloworld.robot
测试Web API
使用Robotframework的RequestsLibrary可以很方便地测试Web Api。首先需要安装RequestLibrary:
pip install robotframework-requests
然后就可编写测试脚本了。
首先需要声明使用Library:
1 | *** Settings *** |
接下来定义访问的地址:
1 | *** Variables *** |
然后就可以写用例了:
1 | *** Test Cases *** |
这里使用的是POST方法,向api发送的键值对定义在data中,这里使用了创建键值对字典的关键字Create Dictionary。返回的对象定义在变量${response}中,使用Post Request可以执行访问。
Post Request 已经过时了,需要转换为POST On Session,转换过程中需要注意以下几点:
- Post Request 和 POST On Session 都有data和json可以传递参数,但含义不同,Post Request中json对象可以使用data参数传递,但POST On Session中如果是json对象,必须使用json参数。
- POST On Session 不需要定义headers参数。
最近使用Robot Framework 测试.Net Framework下编写的Web Api,这些Web Api 使用了复杂的数据传输对象,对象中包含Dictionary数据结构,Web Api 方法如下:
1 | [HttpPost] |
数据传输对象的数据结构大致如下:
1 | public class DtoGetData |
这里遇到的问题使用Robot framework POST如何传输Dictionary。研究后发现,使用下面的方式可以正确传输参数:
1 | ${data}= Create dictionary name=jone page=1 pageSize=10 paras[0][Key]=key1 paras[0][Value]=value1 |
字符串操作
使用String库中的Split String关键字可以将字符串分隔,比如v1,v2,v3使用逗号分隔,处理后的结果保存在列表中。使用示例如下:
1 | FOR ${str} IN @{dic} |
这个例子中,传入参数的键和值用冒号分隔,比如:
Name:Jone Age:13
这里使用Split String 将键和值分开,保存到字典中。
需要注意的是,使用Split String 关键字,需要引用String库。
Robot Framework字符串拼接需要使用catenate关键字,下面的代码将Hello和World合并
1 | ${s}= catenate Hello World |
得到的结果是Hello World。如果我们希望中间没有空格,需要使用SEPARATOR参数:
1 | ${s}= catenate SEPARATOR= Hello World |
这样得到的结果就是HelloWorld。SEPARATOR参数声明了拼接中的连接字符,下面的代码输出结果是Hello|World:
1 | ${s}= catenate SEPARATOR=| Hello World |
如果字符串中包含特殊字符,比如#等,需要使用转义,示例如下:
1 | ${k}= catenate SEPARATOR= \#val_ ${key} \# |
自定义关键字
这几天使用Robotframework对Api接口进行测试,每次测试都需要先登录,为了减少重复的登录脚本,使用Robotframework自定义关键字简化登录过程的脚本。代码如下:
1 | *** Keywords *** |
为了方便使用,我们使用中文作为关键字的名称。然后定义三个输入变量,${host}是需要登录的网址,${username}和${password}是用户名和密码。使用POST On Session实现登录,登录后返回登录过程创建的会话。这个关键字可以在测试用例中使用,比如:
1 | *** Test Cases *** |
我们可以将自定义的关键字保存在资源文件中,便于在多个测试用例中共用。资源文件的结构与测试文件基本相同,只是没有测试用例,变量和自定义关键字部分完全相同。在测试文件的设置部分引用资源文件,比如:
1 | *** Settings *** |
资源文件的位置相对于当前路径,路径中也可以包含变量,比如${RESOURCES}/common.tsv。
如果多个资源文件中包含相同的自定义关键字,在使用这些关键字时,需要使用资源文件名作为前缀。如果多个资源文件中包含相同的变量,那么先加载的变量起作用。
遍历字典
在Robot framework中,使用下面的代码遍历Dictionary出现错误:
1 | FOR ${key} IN ${paras.keys()} |
出现的错误是 unhashable type: ‘odict_keys’。经过研究发现,在遍历时需要使用@修饰符替换$修饰符,修改的代码如下:
1 | FOR ${key} IN @{paras.keys()} |
这样就可以了。这个问题出现在修饰符上,robotframework中$是标量,@是列表,&是字典。在robotframwrok中,任何对象实例都可以付给标量,但遇到遍历这样的场景,区别就出来了。
数据库
在测试时,我们可以直接访问数据库查看数据是否正确,这时可以使用Robot Framework DatabaseLibrary。
首先从https://github.com/franz-see/Robotframework-Database-Library下载,解压后,执行python setup.py install进行安装。安装完成后就可以使用了。
在RIDE中创建一个新的测试,在Library中引入DatabaseLibrary,按F5打开SearchKeywords窗口,选择DatabaseLibrary,可以列出所有相关的关键字。
还需要安装特定的数据库访问模块,如果访问sqlserver,可以安装pymssql:
1 | pip install pymssql |
然后就可以写测试用例了,比如:
1 | *** Settings *** |
采用Robot framework Database Library可以很方便地进行数据库相关测试,可以使用的关键字如下:
- Check If Exists In Database:参数为select语句,如果有查询结果,返回ture,否则为false。
- Check If Not Exists In Database: 与上面的关键字结果相反。
- Delete All Rows From Table:参数为表名,删除表中所有数据。
- Description: 参数为select语句,返回为查询结果字段的描述数组,比如name=’id’, type_code=1043, display_size=None, internal_size=255, precision=None, scale=None, null_ok=None)。
- Execute Sql Script: 执行sql脚本,多个sql语句使用分号分隔。
- Query: 执行查询语句。
- Row Count: 返回查询语句的行数。
- Row Count Is 0: 返回查询行数是否为0。
- Row Count Is Equal To X :返回查询行数是否为给定的行数X。
- Row Count Is Greater Than X: 返回查询行数是否大于给定的行数X。
- Row Count Is Less Than X: 返回查询行数是否小于给定的行数X。
- Table Must Exist: 指定表是否存在。
Database Library中有两个关键字可以用来连接数据库:
Connect To DataBase 和 Connect To Database Using Custom Params,Connect To DataBase需要声明参数或者将参数保存在配置文件中,参数如下:
1 | dbapiModuleName=None, dbName=None, dbUsername=None, dbPassword=None, dbHost=localhost, dbPort=5432, dbConfigFile=./resources/db.cfg |
这里需要注意,如果没有显示声明dbName、dbUserName、dbPassword、dbHost或者dbPort,都会去指定的配置文件中查找相应的配置项,如果找不到配置文件,就会报错。配置文件的格式如下:
1 | [default] |