使用RF+excel搭建接口测试框架

本文旨在分享一个接口测试框架,环境使用python3+requests+rf测试框架,采用Excel管理测试用例等集成测试数据功能,使用rf组织测试用例并并生成测试报告。

采用rf可以很好的支持流程类的接口,组织各种繁杂的流程测试。

测试框架处理流程


测试框架处理流程:

1、初始化测试数据,可在rf中进行,常量直接写在配置文件中即可

2、   excel维护测试接口

3、   利用rf维护测试用例,即利用各接口组装不同的测试的流程,包含各步骤的断言

4、   rf执行时,根据组装顺序,解析EXCEL数据

5、   excel解析成功后会进行接口调用,发送请求

6、   rf执行后,会自动生成详细的测试报表及测试日志

测试框架结构目录介绍

config/:          常量配置

framework/:   框架核心处理方法,包含了excel解析、发送请求、数据库交互等

logs/:              日志文件

reports/:         测试报告

rfsuite/:          RF测试用例

testdata/:       Excel维护测试接口

数据库封装

1、 config/dbconf.ini  ---db数据库连接信息配置

2、 config/getdbconf.py  ---解析dbconf.ini,获取指定的配置项信息

def get_db_config(firstline, secondline):   ---获取指定的配置项的值,如获取t0parp的dbType

3、 framework/dbhandler.py  ---数据库核心方法

def get_db_connect(self, sid):  ---建立指定数据库的连接,如t0parp

def do_query_sql(self, sid, sql, parms=None):  ---执行query sql并返回查询结果,即select sql

def do_commit_sql(self, sid, sql, parms=None):   ---执行commit sql,即update、delete sql

def do_func(self, sid, func, parms):    ---执行function

def do_procedure(self, sid, pro, parms):   --执行procedure


框架核心模块

1、 excel维护测试接口(主要字段)

method: 必填,请求方法,支持post、get、delete、put、postwithmultipart

header: 非必填,请求头,json格式,支持引入变量,格式${var_name}

url:   必填,请求地址,/开头, 支持引入变量,格式${var_name}

parameter:非必填,请求参数,json格式, 支持引入变量,格式${var_name}

filename: 非必填,需上传的文件,postwithmultipart时需要上传文件,文件完整路径

assert_type: 必填,断言类型,支持regex、sql、in、equal              

assert_expect: 必填,根据断言类型,输入合适的断言语句, 支持引入变量,格式${var_name}

regex: 将正则表达式和response text进行匹配,结果需要>0,适用于返回结果格式固定且包含动态值的接口;

sql: 格式:sid@qry sql:key,将sql结果和response text中key对应的值进行比较,结果需要相等,适用于查询类接口;

in:  将录入值和response text进行比较,录入值需包含在response text中,适用于返回html等的接口;

equal:将录入值和response text进行比较,录入值需等于response text中,适用于返回结果固定的接口;

saved_var_name: 非必填,需保存的变量名,用于处理有些动态值需要传递给后续接口使用的情况

saved_var_type: 非必填,动态变量值获取方式,支持regex、sql

save_var_get: 必填,根据动态变量值获取方式,输入合适的取值语句, 支持引入变量,格式${var_name}

regex:将正则表达式和response text进行匹配,需提取的变量部分使用()包起来;

sql:格式:sid@qry sql,目前只支持查询1个字段;

2、 变量设置(2种方式):

1、config/confdata.py文件中配置,适用于固定常量

2、excel测试接口中动态保存,适用于动态变量,使用动态变量的接口调用前需要保证该变量已被生成

3、 framework/requestutil.py  ---request请求处理

def load_to_dict(data):   ---将json字符串转为字典格式,请求的header、parameter处理时会用到

def do_request(method, url, header=None, param=None, cookie=None, file=None, timeout=0):   ---发送请求

def get_response_value(jsontext, key):   ---获取返回的response text指定key的value值,再断言接口返回值时会用到

4、 framework/excelutil.py  ---excel数据处理

def get_case_dict(self, rowno):  ---获取excel指定row_no的数据,以字典形式返回【row_no从1开始,第0行为标题行】

def format_case_dict(self, sdict):  ---格式化excel行的数据,替换${}变量,以字典形式返回【sdict为get_case_dict返回的字典】

5、 framework/predata.py    ---包装测试数据

def get_case_dict(self, filename, sheetname, rowno):  ---获取指定excel文件指定行的数据

def get_case_col_value(self, filename, sheetname, rowno, col_title):  ---获取指定excel文件指定行指定列的单元格数据

6、 framework/doexecutor.py    ---测试用例执行核心方法

def executor(self, filename, sheetname, rowno, cookie=None):  ---执行测试用例,发送请求同时保持变量(如果有变量需要传递的话)

def assert_response(self, assert_type, expect, actual):  ---测试用例断言方法

以下是我们系统的登录cookie截取方法,cookie需要传递给后续接口(cookie入参),各系统可以根据实际情况定制。


接口测试用例编写

测试用例采用RF进程维护,案例文件参考如下:

1__init__.robot文件为初始化文件,一个模块最先执行此文件方法,再一次按顺序执行其他文件

   Suite Setup:整个模块开始时执行一次,套件初始化动作

   Suite Teardown:整个模块结束时执行一次,套件清理动作

   set global variable ${gloabal_var_name} ${value}:保存全局变量gloabal_var_name

示例说明:

D-登录Super模块执行时,先执行__init__.robot文件:

2、测试用例文件,基于__init__文件动作,继续后续的测试验证动作【可以直接引用全局变量】

   ***Settings***:依赖库声明,支持Suite SetupSuite Teardown,仅作用于当前这个文件的套件

   ***Test Cases***:测试用例,支持SetupTeardown,仅作用于当前这个测试用例

1、     RF按层级顺序执行用例

如下示例(假设模块4中无子节点),执行顺序如箭头所示:


集成测试报告

1robot执行命令(2种方式):

1pycharm中添加external toolRobot Run Testsuite

robot -dreports -P $ProjectFileDir$ $FilePathRelativeToProjectRoot$

pycharm中选中对应的文件,右键->External Tool-> Robot Run Testsuite

2、命令行执行,打开cmd窗口

       cd项目根目录

robot -dreports -P .需要执行的文件或测试用例

2、测试报告和日志存储在reports目录下,右键->Open In Browser

推荐阅读更多精彩内容