Robot Framework 使用

robotframework是基于python的自动测试框架,可以在官网查看详细的文档:
https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html
文档很详细,但细节过多,这里将安装使用过程浓缩一下。

快速使用

首先,确保系统安装了python。然后就可以使用pip安装了:
pip install robotframework
安装完成后,使用下面的命令查看版本:
robot –version
然后我们可以创建一个简单的测试脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
*** Settings ***
Documentation Example using the space separated format.
Library OperatingSystem

*** Variables ***
${MESSAGE} Hello, world!

*** Test Cases ***
My Test
[Documentation] Example test.
Log ${MESSAGE}
My Keyword ${CURDIR}

Another Test
Should Be Equal ${MESSAGE} Hello, world!

*** Keywords ***
My Keyword
[Arguments] ${path}
Directory Should Exist ${path}

然后,可以使用robot运行这个测试脚本:
robot helloworld.robot

测试Web API

使用Robotframework的RequestsLibrary可以很方便地测试Web Api。首先需要安装RequestLibrary:
pip install robotframework-requests
然后就可编写测试脚本了。
首先需要声明使用Library:

1
2
*** Settings ***
Library RequestsLibrary

接下来定义访问的地址:

1
2
*** Variables ***
${HOST} http://localhost/myapi

然后就可以写用例了:

1
2
3
4
5
6
7
8
9
10
11
*** Test Cases ***
API Test Example
Create Session my_session ${HOST}
${headers}= Create Dictionary Accept=application/json Content-Type=application/json charset=utf-8

# POST request with params
${data}= Create dictionary field1=value1 field2=value2
${response}= Post Request my_session my-endpoint headers=${headers} data=${data}

Should be equal as strings ${response.status_code} 200
Log ${response}

这里使用的是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
2
3
[HttpPost]
public HttpResponseMessage GetData([FromBody] DtoGetData dto)
{

数据传输对象的数据结构大致如下:

1
2
3
4
5
6
7
8
9
10
public class DtoGetData
{
public string name{ get; set; }

public Dictionary<string,string> paras { get; set; }

public int page { get; set; }

public int pageSize { get; set; }
}

这里遇到的问题使用Robot framework POST如何传输Dictionary。研究后发现,使用下面的方式可以正确传输参数:

1
2
${data}=    Create dictionary    name=jone    page=1    pageSize=10    paras[0][Key]=key1    paras[0][Value]=value1
${responselist}= POST On Session ${session} url=${GETDATAURL} data=${data}

字符串操作

使用String库中的Split String关键字可以将字符串分隔,比如v1,v2,v3使用逗号分隔,处理后的结果保存在列表中。使用示例如下:

1
2
3
4
FOR    ${str}    IN    @{dic}
${ss}= String.Split String ${str} :
Set To Dictionary ${data} ${ss}[0] ${ss}[1]
END

这个例子中,传入参数的键和值用冒号分隔,比如:
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
2
3
4
5
6
7
8
*** Keywords ***
登录到平台
[Arguments] ${host} ${username} ${password}
Create Session my_session ${host}
${data}= Create dictionary UserName=${username} Password=${password}
${response}= POST On Session my_session url=/api/Account/Login json=${data}
Log ${response}
[Return] my_session

为了方便使用,我们使用中文作为关键字的名称。然后定义三个输入变量,${host}是需要登录的网址,${username}和${password}是用户名和密码。使用POST On Session实现登录,登录后返回登录过程创建的会话。这个关键字可以在测试用例中使用,比如:

1
2
3
4
5
6
*** Test Cases ***
TestLogin
${mysession}= 登录到平台 host=${HOST} username=saleuser1 password=1
${datalist}= Create dictionary WorkFlow_Name=LeaveApply1
${responselist}= POST On Session ${mysession} url=${GetActivateListUrl} json=${datalist}
Log ${responselist}

我们可以将自定义的关键字保存在资源文件中,便于在多个测试用例中共用。资源文件的结构与测试文件基本相同,只是没有测试用例,变量和自定义关键字部分完全相同。在测试文件的设置部分引用资源文件,比如:

1
2
3
*** Settings ***
Library RequestsLibrary
Resource ../../Resources/flowresources.robot

资源文件的位置相对于当前路径,路径中也可以包含变量,比如${RESOURCES}/common.tsv。
如果多个资源文件中包含相同的自定义关键字,在使用这些关键字时,需要使用资源文件名作为前缀。如果多个资源文件中包含相同的变量,那么先加载的变量起作用。

遍历字典

在Robot framework中,使用下面的代码遍历Dictionary出现错误:

1
2
3
4
FOR    ${key}    IN    ${paras.keys()}
${v}= Get From Dictionary ${paras} ${key}
Set To Dictionary ${data} ${key} ${v}
END

出现的错误是 unhashable type: ‘odict_keys’。经过研究发现,在遍历时需要使用@修饰符替换$修饰符,修改的代码如下:

1
2
3
4
FOR    ${key}    IN    @{paras.keys()}
${v}= Get From Dictionary ${paras} ${key}
Set To Dictionary ${data} ${key} ${v}
END

这样就可以了。这个问题出现在修饰符上,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
2
3
4
5
6
7
8
9
*** Settings ***
Library DatabaseLibrary

*** Test Cases ***
DBTEST
Connect To Database Using Custom Params pymssql database='dbname',user='username',password='pwd',host='localhost'
Table Must Exist AUTH_USER_TB
Disconnect From Database

采用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
2
3
4
5
6
7
[default]
dbapiModuleName=pymysqlforexample
dbName=yourdbname
dbUsername=yourusername
dbPassword=yourpassword
dbHost=yourhost
dbPort=yourport