python+requests接口自动化测试框架
本文分享一个自己学习python时练手写的的接口自动化测试框架。基于python3+requests封装而成,支持批量运行接口用例、日志持久化、测试报告生成、linux上运行
目录
框架流程
框架介绍
框架目录
整体框架分为apilib,apitest,exlib,venu,main五大模块
- apilib/: 存放接口自动测试用例需要调用的函数
- apitest/: 存放接口自动化用例文件,其中每个.py文件对应一个接口自动化用例
- exlib/: 存放框架运行过程中需要用的各个函数,例如实时打印日志,生成html测试报告等
- venv/: 框架运行环境
- main.py/: 框架运行主函数文件
用例设计思路
apitest和apilib为需要使用者自行编写的部分
接口用例类apitest中初始化了接口的基本属性,apitest继承了apilib
接口函数apilib为接口用例类提供需要用到的函数,可以实现发送接口请求、断言请求结果、生成日志等功能。apilib类继承了apirequest类和apibase,同时还引用log类
apirequest类为接口用例实现实际发送接口请求。同时apirequest引用setting类,setting类中定义了环境IP、调用端口等公共变量
apibase类为接口基类,定义了接口的公共属性和方法,apitest类可以使用、重写这些属性和方法
log类中提供了日志打印功能
exlib模块——框架核心功能
exlib模块中存放了框架核心功能文件
- apibase: 接口基类文件,定义了所有接口用例需要用到的属性和方法
- apires: 接口请求类文件,由第三方库requests封装而来,实现实际调用接口
- getswagger: 爬取swaager文件,批量爬取swagger获取接口信息,目前没用,准备后面拓展框架功能时再用
- html: 测试报告文件,读取实时日志生成html测试报告
- log: 日志文件,有第三方库logging封装而来,实现打印框架运行实时日志并保存到本地
- setting: 系统公共变量文件,保存框架固定变量
- worktool: 框架工具文件,
apibase接口基类文件
接口基类中定义了接口的公共属性和方法。属性包含了name,url,headers等。方法包含了获取属性方法,接口前置、调用、后置方法,断言方法,操作步骤方法。
接口方法run_pre可用于实现接口用例的预置条件,run_test可用于实现接口用例的操作步骤,run_post可用于实现残留数据的清理等,调用debug_run则会按照顺序运行run_pre,run_test,run_post,如果抛出异常会通过traceback库步骤异常并通过日志工具打印到实时日志中
check方法为断言方法,用于比较传入的值是否相等,借此来判断操作步骤的结果
stap方法为操作步骤方法,用于修改当前的操作步骤
apireq接口请求文件
ApiRquest类封装了第三方库requests,目前只封装了get、post、put、delete方法
log日志文件
Logtool日志工具类,封装了第三方库logging,采用了单例模式防止多个logger对象冲突导致日志重复打印,同时使用call方法和classmethod装饰器方便各种方式调用打印日志
run_log日志装饰器,实时打印每次调用接口函数时传入参数和操作结果,并将其保存到日志文件
html测试报告文件
ReadLog类为日志文件处理类,主要功能为解析日志文件,获取到每个接口的名称,接口的结果,接口的运行时间,然后传递给HtmlReport类来生产html测试报告HtmlReport
HtmlReport类生产测试报告类,事先定义好html模板,通过处理日志得到的接口信息来替换模板里面的表格部分内容,替换完之后生成本次框架运行结果的测试报告
setting系统配置文件
目前配置了测试环境IP,端口,接口超时时间
worktool系统工具文件
WorkTool运行工具类,封装了框架的公共方法
为方便框架在linux上也能运行,相关路径通过sys和os模块来获取
venv框架运行环境
venv中包含了框架运行需要的第三方库文件,方便框架的移植。如果框架要在linux上运行,需要手动将venv-lib-sitepackage目录下所有文件拷贝到linux上python路径下的lib-sitepackage目录下
apilib接口函数模块
apilib存放各个待测功能模块对应的接口函数模块
之前自己学习性能测试时用虚拟机搭建了性能监控平台grafana,后面我就用这个平台里面的文件分组模块的相关接口来作为示例讲解apitest和apilib模块,这两个模块也是需要使用者手动编写的模块
folderlib文件中定义了Folder类,该类中定义了新增、修改、删除文件分组的函数
函数中通过继承ApiRequest父类的send方法来实际发送接口请求
由于返回的response为list,所以需要专门作处理解析出状态码
通过父类ApiBase的check断言函数判断状态码判定是否调用成功
添加run_test装饰器,框架会将函数运行的相关信息打印到日志中
apitest接口自动化用例模块
addfolder.py,revisefolder.py,deletefolder.py分别对应新增文件文组、修改文件分组、删除文件分组的测试用例
以新增分组addfolder.py为例
AddFolder类中定义了添加文件分组接口的name、url、name、headers、data等属性和run_pre,run_test,run_post方法
data为一个list,框架要求元素为type和body的键值对,type为这次入参的测试类型,body为调用接口时传递的入参
run_pre由于接口不需要预置条件直接pass,run_test调用接口函数发送新增文件分组清并且获取到接口返回的文件分组id,run_post通过之前获取的文件分组id删除本次调用新增文件分组
最后按框架要求添加py文件被调用时,执行AddFolder类从父类继承到的debug_run方法,这样是为了支持框架main文件批量调用接口用例
main框架主函数文件
main文件首先调用worktool类create_pro_pth方法创建系统运行环境,然后再调用run_all方法运行apitest目录下所有文件,最后调用HtmlReport类report方法生成测试报告
如果要在linux上运行或者在CI继承中运行,需要将框架打包到服务器上然后再通过命令行调用main文件即可
框架展示
pycharm调用
windows命令行调用
linux调用
日志
测试报告