接口自动化测试框架
requests+pytest
基础内容:
- 接口测试框架封装优化
- 接口测试断言
- 日志与报告
- 能力扩展
PO封装
- base_api: 完成对接口测试框架中的工具的封装,比如requests,jsonpath等等
- pages: 实现对每个接口的描述
- cases: 完成 1.对业务逻辑的拼接;2.接口字段的校验、断言
封装实例
以企业微信创建部门接口为例
准备前提:
- 注册企业微信
- 进入企业微信管理后台,在管理工具-通讯录同步中,开启“开启API接口同步”并且获取通讯录的
Secret
值 - 进入企业微信管理后台,在我的企业中,获取
企业ID
值
获取access_token是调用企业微信API接口的第一步,相当于创建了一个登录凭证,其它的业务API接口,都需要依赖于access_token来鉴权调用者身份。
这里以“创建部门”用例为例,相关接口文档如下:
API_TEST 项目目录
│ settings.py
├─utils
│ │ log_util.py
│
├─configs
│ │ wework.yml
│
├─apis
│ │ base_api.py
│ │ wework.py
│ ├─contact
│ │ department.py
├─cases
│ │
│ └─contact
│ │ test_department.py
项目代码实例
settings.py
import os
# 项目根目录
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# 日志根目录
LOG_DIR = os.path.join(BASE_DIR,"logs")
if not os.path.exists(LOG_DIR):os.mkdir(LOG_DIR)
# 配置文件根目录
CONFIG_DIR = os.path.join(BASE_DIR,"configs")
log_util.py
import logging
import os
# 创建记录器:logging.getLogger
from API_TEST.settings import LOG_DIR
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# 创建流处理器 controll handler:logging.StreamHandler,日志输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 创建文件处理器 file handler:logging.FileHandler,日志写入到文件
fh = logging.FileHandler(filename=os.path.join(LOG_DIR,"api.log"),encoding="utf-8")
fh.setLevel(logging.DEBUG)
# 创建格式器:logging.Formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 处理器中绑定格式器
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# 记录器中绑定处理器,一个记录器中可以绑定多个处理器
logger.addHandler(ch)
logger.addHandler(fh)
wework.yml
根据自己的企微信息,填写
corpid: xxx
corpsecret:
department: xxx
base_api.py
import requests
from API_TEST.utils.log_util import logger
class BaseApi():
"""api 请求封装"""
BaseUrl = ""
def send(self, method, url, **kwargs):
""" 发送请求 """
url = self.BaseUrl + url
logger.info(f"接口请求操作,{method}:{url}")
logger.info(f"接口请求操作,请求的kwargs为:{kwargs}")
resp = requests.request(method=method, url=url, **kwargs)
logger.info(f"接口请求操作,接口响应为:{resp.text}")
logger.info("==================================================")
return resp
wework.py
import uuid
import jsonpath
from API_TEST.apis.base_api import BaseApi
class WeWork(BaseApi):
BaseUrl = "https://qyapi.weixin.qq.com/cgi-bin"
def jsonpath_list(self, json_obj, expr):
return jsonpath.jsonpath(json_obj, expr)
def gen_union_id(self):
return str(uuid.uuid4()).split("-")[0]
department.py
import yaml
import os
from API_TEST.apis.wework import WeWork
from API_TEST.settings import CONFIG_DIR
class Department(WeWork):
def __init__(self):
self.get_access_token()
def get_access_token(self):
""" 获取access_token """
url = "/gettoken"
info = yaml.safe_load(open(os.path.join(CONFIG_DIR, "wework.yml")))
params = {
"corpid": info.get("corpid"),
"corpsecret": info.get("corpsecret").get("department")
}
resp = self.send("GET", url, params=params)
self.access_token = resp.json().get("access_token")
def create(self, data):
"""
创建部门
"""
url = "/department/create"
params = {"access_token": self.access_token}
resp = self.send("POST", url, params=params, json=data)
return resp
def get_list(self):
"""
获取部门列表
"""
url = "/department/list"
params = {"access_token": self.access_token}
resp = self.send("GET", url, params=params)
return resp
def is_in_department_list(self, depart_id):
"""
判断depart_id 是否在部门列表中
"""
resp = self.get_list()
if depart_id in self.jsonpath_list(resp.json(), "$..id"):
return True
else:
return False
test_department.py
from API_TEST.apis.contact.department import Department
class TestDepartment:
def setup_class(self):
self.department = Department()
def test_create(self):
_id = self.department.gen_union_id()
data = {
"name": f"广州研发中心_{_id}",
"name_en": f"RDGZ_{_id}",
"parentid": 1,
}
# 创建部门
resp = self.department.create(data)
# 断言
assert self.department.is_in_department_list(resp.json().get("id"))
def test_search(self):
self.department.get_list()
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。