python-requests接口测试框架

  1. 接口自动化测试框架
  2. PO封装
  3. 封装实例
    1. API_TEST 项目目录
    2. 项目代码实例
      1. settings.py
      2. log_util.py
      3. wework.yml
      4. base_api.py
      5. wework.py
      6. department.py
      7. test_department.py

接口自动化测试框架

requests+pytest

基础内容

  • 接口测试框架封装优化
  • 接口测试断言
  • 日志与报告
  • 能力扩展

PO封装

  • base_api: 完成对接口测试框架中的工具的封装,比如requests,jsonpath等等
  • pages: 实现对每个接口的描述
  • cases: 完成 1.对业务逻辑的拼接;2.接口字段的校验、断言

封装实例

以企业微信创建部门接口为例

准备前提:

  1. 注册企业微信
  2. 进入企业微信管理后台,在管理工具-通讯录同步中,开启“开启API接口同步”并且获取通讯录的Secret
  3. 进入企业微信管理后台,在我的企业中,获取企业ID

企业微信API接口文档

获取access_token是调用企业微信API接口的第一步,相当于创建了一个登录凭证,其它的业务API接口,都需要依赖于access_token来鉴权调用者身份。

这里以“创建部门”用例为例,相关接口文档如下:

  1. 获取access_token
  2. 创建部门
  3. 获取部门列表

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()

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
My Show My Code