分层封装的接口测试框架
目的:
避免自动化工程的多耦合性和维护性差的问题:接口、参数、断言糅杂在case中,一个改变则整个工程都改变
实现:
工程分为api层+配置层+util层+日志+报告+数据层
-
Baseapi层是api的父类,其中在__init方法中初始化一个requestUtil对象
(RequestUtil对象实现了从配置文件中读取对应域名,完成请求url的拼接,请求参数的替换)
class base_api: def __init__(self): self.req = requestUtil() def api(self,reqdata): #将参数转化为字典结构 #将字典使用关键字传参**req传递给request方法 '''关键字传参,参数有啥就传啥,不用指定''' result = requests.request(**reqdata)#关键字传参 return result
2.Api层:
一个接口是一个方法 ,请求信息配置在yaml文件中(yaml文件封装了请求url、method、parm)
#1.从yaml读取到对应url的配置 #2.替换url的域名 #3.替换参数 queryparm: method: get url: /mtx/queryparam params: id: $id name: $name getuser: method: get url: /getuser params: id: $id
【说明】api层继承baseapi父类,api层的每一个方法就实现了一个接口调用,有3个步骤:
1.从yaml读取到对应url的配置
2.调用requestUtil的方法去替换url的域名和参数
3.请求接口并返回
from api.base_api import base_api from util.yamlUtil import yamlUtil class testApi(base_api): def queryparm(self, parms): # 将参数写在yaml文件中,作为数据驱动 # 1.从yaml读取到对应url的配置 # 2.调用requestUtil的方法去替换url的域名和参数 # 3.请求接口并返回 data = yamlUtil("../api/getquery.yaml").readyaml() interface = data["queryparm"] interface = self.req.makeInterface(interface,parms) result = self.api(interface) return result
3.用例数据的传递
用例数据使用yaml数据驱动完成,写在data这个package下
4.用例层
Base_testcase :将case中都需要用到的实例化的步骤写在basecase的__init方法中
Testcase层:调用api层,完成业务调用,并进行断言,如果是数据驱动的用例,需要将断言也写到datayaml中
5.配置层
util 这个package下目前仅将环境信息配置到yaml中
- RequestUtil:使用对应环境的域名拼接url,并替换参数
- StringUtil:实现字符串的处理,主要进行yaml中参数替换
- YamlUtil:读取yaml
11月10日备注:
此文章仅为学习pytest接口自动化框架初步整理,后期还需要增加post等其他请求方法、日志、报告处理部分,增加多业务case执行,继续优化完善框架。