一. 接口框架介绍
接口框架主要由python+request+pytest+yaml+allure搭建,集成了logging模块,框架的目录结构如下:
项目目录结构
- api – 模仿PO模式, 抽象出页面类, 页面类内包含页面所包含所有接口, 并封装成方法可供其他模块直接调用
- config – 配置文件目录,只要有setting.ini,只要用于存储项目需要的配置信息
- data – 测试数据目录
- logs – 日志
- reports – 测试报告
- testcases– 测试脚本存放目录
- common– 工具类目录
- main_run.py – 命令行启动入口
- pytest.ini – pytest测试框架配置文件
- README.md – 开发说明文档
二. 接口框架代码实现
1.request的封装:
1.1 request的介绍
request的get post put delete 方法示例
url:请的的路径,一般是项目的跟路径和接口路径才是完整的请求路径
data/params:请求的数据,有时候是json,有时候是字典,具体看接口的定义
headers:请求头,有些接口需要加入一些特殊的请求头,比如有些接口依赖与登录的token,会将token 放入headers
import requests
#requests get 方法
res = requests.get(url="",params="",headers="")
#requests post 方法
res1 = requests.post(url="",data="",headers="")
#requests put 方法
res2 = requests.put(url="",data="",headers="")
#requests delete 方法
res3 = requests.delete(url="",data="",headers="")
所以抽取以上方法的共性,来封装请求基类
common/httpClient.py
import json
import requests
from common.parseData import base_data
from common.log_util import logger
api_root_url = base_data.get_ini_data()["host"]["api_sit_url"]
class HttpClient:
"""
封装requests的get/post/put/delete请求
"""
def __init__(self):
self.api_root_url = api_root_url
pass
# def send_request(self,url,method,**kwargs):
# """
# 测试用例执行调用的方法
# :param url:
# :param method:
# :param kwargs:
# :return:
# """
# return self.request(url,method,**kwargs)
def get(self,url,**kwargs):
return self.request(url,"GET",**kwargs)
def post(self, url, **kwargs):
return self.request(url, "POST", **kwargs)
def put(self, url, **kwargs):
return self.request(url, "PUT", **kwargs)
def delete(self,url,**kwargs):
return self.request(url,"DELETE",**kwargs)
def request(self,url,method,**kwargs):
"""
根据request的method来调用requests的具体方法
:param url:
:param method:
:param kwargs:
:return: 返回response
"""
self.request_log(url,method,**kwargs) #调用request_log方法来输出日志
if method=="GET":
return requests.get(self.api_root_url+url,**kwargs)
if method == "POST":
return requests.post(self.api_root_url + url, **kwargs)
if method == "PUT":
return requests.put(self.api_root_url + url, **kwargs)
if method == "DELETE":
return requests.delete(self.api_root_url + url, **kwargs)
def request_log(self,url,method,**kwargs):
"""
解包参数为字典,然后通过字典的get()方法(传入key)获取入参的请求数据
:param url:
:param method:
:param kwargs:
:return:
"""
# get(key)方法在key(键)不在字典中时,可以返回默认值None或者设置的默认值
# 而dict[key]在key(键)不在字典中时,会触发KeyError异常
data = dict(**kwargs).get("data")#**kwargs是关键字位置参数,可以转化为字典,通过key来获取
json_data = dict(**kwargs).get("json")
params = dict(**kwargs).get("params")
hearders = dict(**kwargs).get("headers")
logger.info("接口的请求地址>>{}".format(self.api_root_url+url))
logger.info("接口的请求方法>>{}".format(method))
if data is not None:
#json.dumps()将json对象转化为字符串,indent表示缩进两个字符显示
logger.info("接口请求的data参数>>>\n{}".format(json.dumps(data,indent=2)))
if params is not None:
logger.info("接口请求的params参数>>>\n{}".format(json.dumps(params,indent=2)))
if json_data is not None:
logger.info("接口请求的json_da