本文旨在分享一个接口测试框架,环境使用python3+requests+rf测试框架,采用Excel管理测试用例等集成测试数据功能,使用rf组织测试用例并并生成测试报告。采用rf可以很好的支持流程类的接口,组织各种繁杂的流程测试。
测试框架处理流程:
1、初始化测试数据,可在rf中进行,常量直接写在配置文件中即可
1、 excel维护测试接口
2、 利用rf维护测试用例,即利用各接口组装不同的测试的流程,包含各步骤的断言
3、 rf执行时,根据组装顺序,解析EXCEL数据
4、 excel解析成功后会进行接口调用,发送请求
5、 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 Setup、Suite Teardown,仅作用于当前这个文件的套件
***Test Cases***:测试用例,支持Setup、Teardown,仅作用于当前这个测试用例
1、 RF按层级顺序执行用例
如下示例(假设模块4中无子节点),执行顺序如箭头所示:
集成测试报告
1、robot执行命令(2种方式):
1、pycharm中添加external tool:Robot Run Testsuite
robot -dreports -P $ProjectFileDir$ $FilePathRelativeToProjectRoot$
pycharm中选中对应的文件,右键->External Tool-> Robot Run Testsuite
2、命令行执行,打开cmd窗口
cd项目根目录
robot -dreports -P .需要执行的文件或测试用例
2、测试报告和日志存储在reports目录下,右键->Open In Browser