Python+Requests+Pytest+YAML+Allure接口自动化框架

  论坛元老 | 2025-3-25 22:19:26 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1730|帖子 1730|积分 5190

GitHub源码地址(详细注释):源码
调试项目python自主搭建:附项目源码
一、项目介绍

本项目是基于 Python+Requests+Pytest+YAML+Allure 搭建的 接口自动化测试框架,用于对 REST API 举行测试。
框架的主要特点包括:



  • 块化设计:采取 分层架构,包括 API 层、业务层、数据层、公共模块、测试用例层,加强可维护性。
  • Pytest 测试框架:使用 Pytest 举行测试构造、实验、夹具管理,并提供强大的插件支持。
  • Requests 举行 API 测试:封装 HTTP 请求,简化 API 调用流程。
  • YAML 管理测试数据:测试数据与代码解耦,支持多环境测试。
  • Allure 生成测试报告:提供清楚直观的测试报告,支持测试汗青分析。
二、目录布局

  1. PytestDemo/
  2. │── api/                  # 接口封装层,封装用户相关的 API
  3. │   ├── user.py                         # 提供底层 API 访问接口,与后端 API 进行交互
  4. │── common/               # 公共模块(日志、数据库操作、HTTP 请求封装)
  5. │   ├── logger.py         # 日志管理
  6. │   ├── mysql_operate.py  # 数据库操作
  7. │   ├── read_data.py      # 读取 YAML 文件数据
  8. │── config/               # 配置文件(环境变量、测试数据)
  9. │   ├── setting.ini       # MySQL 环境配置
  10. │── core/                 # requests 请求方法封装、关键字返回结果类
  11. │   ├── rest_client.py    # 简化 HTTP 请求的发送,并提供日志记录功能
  12. │   ├── result_base.py    # 结果基类,用于定义接口返回结果的标准结构
  13. │── data/                 # 测试数据文件管理
  14. │   ├── api_test_data.yml
  15. │   ├── base_data.yml     
  16. │   ├── scenario_test_data.yml     
  17. │── log/                  # 日志文件
  18. │   ├── 20250324.log     
  19. │── operation/            # 业务层(对接口请求进行封装)
  20. │   ├── user.py           # 业务api封装,供测试用例调用。
  21. │── testcases/            # 测试用例
  22. │   ├── report/           # Allure 测试报告
  23. │   ├── api_test/         # 单接口 API 用例集
  24. │   ├── scenario_test/    # 业务链 API 用例集
  25. │── conftest.py           # Pytest 夹具(Fixture)
  26. │── requirements.txt      # 依赖包清单
  27. │── pytest.ini            # Pytest 配置文件
复制代码
三、框架分层详解

1. api/:接口封装层

  1. import os  # 导入os模块,用于文件和目录操作
  2. from core.rest_client import RestClient  # 从core模块导入RestClient类
  3. from common.read_data import data  # 从common模块导入data类,用于读取数据
  4. # 获取当前文件所在的目录的上一级目录路径
  5. BASE_PATH = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
  6. # 构造配置文件setting.ini的完整路径
  7. data_file_path = os.path.join(BASE_PATH, "config", "setting.ini")
  8. # 读取配置文件中的API根URL
  9. api_root_url = data.load_ini(data_file_path)["host"]["api_root_url"]
  10. class User(RestClient):  # 继承RestClient类,封装用户相关的接口
  11.     def __init__(self, api_root_url, **kwargs):
  12.         """
  13.         初始化User类,调用父类的构造方法
  14.         :param api_root_url: API的根URL
  15.         :param kwargs: 其他可选参数
  16.         """
  17.         super(User, self).__init__(api_root_url, **kwargs)
  18.     def list_all_users(self, **kwargs):
  19.         """
  20.         获取所有用户列表
  21.         :param kwargs: 其他可选参数
  22.         :return: GET请求返回的响应结果
  23.         """
  24.         return self.get("/users", **kwargs)
  25.     def list_one_user(self, username, **kwargs):
  26.         """
  27.         获取指定用户名的用户信息
  28.         :param username: 用户名
  29.         :param kwargs: 其他可选参数
  30.         :return: GET请求返回的响应结果
  31.         """
  32.         return self.get("/users/{}".format(username), **kwargs)
  33.     def register(self, **kwargs):
  34.         """
  35.         用户注册
  36.         :param kwargs: 包含注册所需参数
  37.         :return: POST请求返回的响应结果
  38.         """
  39.         return self.post("/register", **kwargs)
  40.     def login(self, **kwargs):
  41.         """
  42.         用户登录
  43.         :param kwargs: 包含登录所需参数
  44.         :return: POST请求返回的响应结果
  45.         """
  46.         return self.post("/login", **kwargs)
  47.     def update(self, user_id, **kwargs):
  48.         """
  49.         更新用户信息
  50.         :param user_id: 需要更新的用户ID
  51.         :param kwargs: 包含更新内容
  52.         :return: PUT请求返回的响应结果
  53.         """
  54.         return self.put("/update/user/{}".format(user_id), **kwargs)
  55.     def delete(self, name, **kwargs):
  56.         """
  57.         删除用户
  58.         :param name: 需要删除的用户名
  59.         :param kwargs: 其他可选参数
  60.         :return: POST请求返回的响应结果
  61.         """
  62.         return self.post("/delete/user/{}".format(name), **kwargs)
  63. user = User(api_root_url)  # 创建User类的实例,并传入API根URL
复制代码
作用:
这一层直接与后端 API 交互,实现最基础的接口请求
不处理业务逻辑,只负责请求和返回数据,调用时只需传入参数
继承 RestClient 统一管理 HTTP 请求
2. 公共模块 (common/)

2.1 日志管理 (common/logger.py)

  1. import logging  # 导入logging模块,用于记录日志
  2. import time  # 导入time模块,用于获取当前时间
  3. import os  # 导入os模块,用于文件和目录操作
  4. # 获取当前文件所在的目录的上一级目录路径
  5. BASE_PATH = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
  6. # 定义日志文件存放的目录路径
  7. LOG_PATH = os.path.join(BASE_PATH, "log")
  8. # 如果日志目录不存在,则创建日志目录
  9. if not os.path.exists(LOG_PATH):
  10.     os.mkdir(LOG_PATH)
  11. class Logger:
  12.     """
  13.     Logger类用于配置和管理日志记录
  14.     """
  15.     def __init__(self):
  16.         """
  17.         初始化Logger类,创建日志记录器
  18.         """
  19.         # 定义日志文件的完整路径,文件名为当前日期.log
  20.         self.logname = os.path.join(LOG_PATH, "{}.log".format(time.strftime("%Y%m%d")))
  21.         # 创建一个日志记录器实例,名称为"log"
  22.         self.logger = logging.getLogger("log")
  23.         # 设置日志记录器的级别为DEBUG,表示记录所有级别的日志
  24.         self.logger.setLevel(logging.DEBUG)
  25.         # 定义日志格式
  26.         self.formater = logging.Formatter(
  27.             '[%(asctime)s][%(filename)s %(lineno)d][%(levelname)s]: %(message)s'
  28.         )
  29.         # 创建一个日志文件处理器,用于将日志写入文件
  30.         self.filelogger = logging.FileHandler(self.logname, mode='a', encoding="UTF-8")
  31.         # 创建一个控制台处理器,用于在控制台输出日志
  32.         self.console = logging.StreamHandler()
  33.         # 设置控制台日志级别为DEBUG
  34.         self.console.setLevel(logging.DEBUG)
  35.         # 设置文件日志级别为DEBUG
  36.         self.filelogger.setLevel(logging.DEBUG)
  37.         # 为文件日志处理器和控制台日志处理器设置相同的日志格式
  38.         self.filelogger.setFormatter(self.formater)
  39.         # 设置控制台日志的格式
  40.         self.console.setFormatter(self.formater)
  41.         # 将文件日志处理器添加到日志记录器
  42.         self.logger.addHandler(self.filelogger)
  43.         # 将控制台日志处理器添加到日志记录器
  44.         self.logger.addHandler(self.console)
  45. # 创建Logger类的实例,并获取日志记录器
  46. logger = Logger().logger
  47. if __name__ == '__main__':
  48.     logger.info("---测试开始---")  # 记录INFO级别日志
  49.     logger.debug("---测试结束---")  # 记录DEBUG级别日志
复制代码
作用:
封装日志模块,记录测试实验过程。
使用方式:
  1. from common.logger import logger
  2. logger.info("这是一条测试日志")
复制代码
2.2 数据库操作(common/mysql_operate.py)

  1. import pymysql  # 导入pymysql库,用于操作MySQL数据库
  2. import os  # 导入os模块,用于路径操作
  3. from common.read_data import data  # 从common模块中导入读取数据的方法
  4. from common.logger import logger  # 从common模块中导入日志记录器
  5. # 获取当前文件的上级目录路径
  6. BASE_PATH = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
  7. # 定义配置文件的路径
  8. data_file_path = os.path.join(BASE_PATH, "config", "setting.ini")
  9. # 读取配置文件中的 MySQL 配置信息
  10. data = data.load_ini(data_file_path)["mysql"]
  11. # 从配置文件中提取MySQL连接所需的参数,并存储在字典中
  12. DB_CONF = {
  13.     "host": data["MYSQL_HOST"],        # 数据库主机地址
  14.     "port": int(data["MYSQL_PORT"]),   # 数据库端口号
  15.     "user": data["MYSQL_USER"],        # 数据库用户名
  16.     "password": data["MYSQL_PASSWD"],  # 数据库密码
  17.     "db": data["MYSQL_DB"]             # 数据库名称
  18. }
  19. class MysqlDb():
  20.     """
  21.         MysqlDb 类用于封装 MySQL 数据库的连接和操作方法。
  22.         """
  23.     def __init__(self, db_conf=DB_CONF):
  24.         """
  25.         初始化MySQL连接
  26.         :param db_conf: 数据库配置字典,包含连接MySQL所需的配置信息
  27.         """
  28.         # 通过字典拆包传递数据库配置信息,建立数据库连接
  29.         self.conn = pymysql.connect(**db_conf, autocommit=False)
  30.         # 通过 cursor() 方法创建游标对象,并让查询结果以字典格式输出
  31.         self.cur = self.conn.cursor(cursor=pymysql.cursors.DictCursor)
  32.     def __del__(self):
  33.         """
  34.         释放数据库资源,在对象被删除时自动调用
  35.         """
  36.         # 关闭游标
  37.         self.cur.close()
  38.         # 关闭数据库连接
  39.         self.conn.close()
  40.     def select_db(self, sql):
  41.         """
  42.         执行查询操作
  43.         :param sql: 要执行的SQL查询语句
  44.         :return: 查询结果(列表格式)
  45.         """
  46.         # 检查数据库连接是否断开,如果连接断开则重新建立连接
  47.         self.conn.ping(reconnect=True)
  48.         # 执行SQL查询
  49.         self.cur.execute(sql)
  50.         # 获取查询结果
  51.         data = self.cur.fetchall()
  52.         return data
  53.     def execute_db(self, sql):
  54.         """
  55.         执行更新、插入或删除操作
  56.         :param sql: 要执行的SQL语句(更新/插入/删除)
  57.         """
  58.         try:
  59.             # 检查数据库连接是否断开,如果连接断开则重新建立连接
  60.             self.conn.ping(reconnect=True)
  61.             # 执行SQL语句
  62.             self.cur.execute(sql)
  63.             # 提交事务
  64.             self.conn.commit()
  65.         except Exception as e:
  66.             # 捕获异常并记录错误日志
  67.             logger.info("操作MySQL出现错误,错误原因:{}".format(e))
  68.             # 如果发生异常,回滚事务
  69.             self.conn.rollback()
  70. # 创建MysqlDb对象并使用DB_CONF进行初始化
  71. db = MysqlDb(DB_CONF)
复制代码
作用:
封装 MySQL 连接,支持数据查询、实验 SQL 语句。
使用方式:
  1. db = MysqlDb()
  2. data = db.select_db("SELECT * FROM user")
复制代码
2.3 读取设置文件(common/read_data.py)

  1. import yaml  # 用于处理 YAML 文件
  2. import json  # 用于处理 JSON 文件
  3. from configparser import ConfigParser  # 用于处理 INI 配置文件
  4. from common.logger import logger  # 导入日志记录器
  5. class MyConfigParser(ConfigParser):
  6.     """
  7.     自定义的 ConfigParser 类,继承自 Python 内置的 ConfigParser。
  8.     主要用于解决 .ini 文件中的键(option)自动转为小写的问题。
  9.     """
  10.     def __init__(self, defaults=None):
  11.         # 调用父类 ConfigParser 的构造方法
  12.         ConfigParser.__init__(self, defaults=defaults)
  13.     def optionxform(self, optionstr):
  14.         # 重写 optionxform 方法,使选项名称保持大小写不变
  15.         return optionstr
  16. class ReadFileData():
  17.     """
  18.     该类用于读取不同格式的文件数据,包括 YAML、JSON 和 INI 配置文件。
  19.     """
  20.     def __init__(self):
  21.         pass  # 该类的构造方法无特殊初始化操作
  22.     def load_yaml(self, file_path):
  23.         """
  24.         读取 YAML 文件并解析数据。
  25.         :param file_path: YAML 文件的路径
  26.         :return: 解析后的 YAML 数据
  27.         """
  28.         logger.info("加载 {} 文件......".format(file_path))  # 记录日志,指示正在加载 YAML 文件
  29.         with open(file_path, encoding='utf-8') as f:
  30.             data = yaml.safe_load(f)  # 使用 safe_load 方法解析 YAML 文件
  31.         logger.info("读到数据 ==>>  {} ".format(data))  # 记录日志,输出读取的数据
  32.         return data
  33.     def load_json(self, file_path):
  34.         """
  35.         读取 JSON 文件并解析数据。
  36.         :param file_path: JSON 文件的路径
  37.         :return: 解析后的 JSON 数据
  38.         """
  39.         logger.info("加载 {} 文件......".format(file_path))  # 记录日志,指示正在加载 JSON 文件
  40.         with open(file_path, encoding='utf-8') as f:
  41.             data = json.load(f)  # 解析 JSON 文件
  42.         logger.info("读到数据 ==>>  {} ".format(data))  # 记录日志,输出读取的数据
  43.         return data
  44.     def load_ini(self, file_path):
  45.         """
  46.         读取 INI 配置文件并解析数据。
  47.         :param file_path: INI 配置文件的路径
  48.         :return: 解析后的 INI 数据,转换为字典格式
  49.         """
  50.         logger.info("加载 {} 文件......".format(file_path))  # 记录日志,指示正在加载 INI 文件
  51.         config = MyConfigParser()  # 创建 MyConfigParser 实例
  52.         config.read(file_path, encoding="UTF-8")  # 读取 INI 配置文件
  53.         data = dict(config._sections)  # 将配置文件的 sections 转换为字典格式
  54.         # print("读到数据 ==>>  {} ".format(data))  # 该行被注释掉,避免调试输出
  55.         return data
  56. # 创建 ReadFileData 类的实例,以便在其他模块中直接使用 data 变量进行文件读取操作
  57. data = ReadFileData()
复制代码
作用:
读取设置文件(如 setting.ini)、剖析 YAML 测试数据,并提供一个统一的接口,使其他模块可以轻松获取设置信息和测试数据。
3. config/:设置管理

  1. [host]
  2. # 测试环境
  3. api_root_url = http://127.0.0.1:5000
  4. [mysql]
  5. # MySQL配置
  6. MYSQL_HOST = localhost
  7. MYSQL_PORT = 3306
  8. MYSQL_USER = root
  9. MYSQL_PASSWD = 123456
  10. MYSQL_DB = flask_demo
  11. autocommit: True  # 确保自动提交开启
复制代码
作用:
存储环境变量、数据库连接信息等
让设置可修改、可复用
4. core/:请求封装层

core/ 目录是请求封装层,主要负责:


  • 封装 HTTP 请求方法,提供统一的 API 访问接口(rest_client.py)。
  • 界说接口返回的标准格式,方便后续断言(result_base.py)。
4.1 rest_client.py:封装 HTTP 请求

  1. import requests  # 导入requests库,用于发送HTTP请求
  2. import json as complexjson  # 导入json模块并重命名为complexjson,避免与局部变量json冲突
  3. from common.logger import logger  # 导入日志模块,用于记录HTTP请求日志
  4. class RestClient():
  5.     """
  6.     RestClient类,封装HTTP请求的方法
  7.     """
  8.     def __init__(self, api_root_url):
  9.         """
  10.         初始化RestClient类
  11.         :param api_root_url: API的根URL
  12.         """
  13.         self.api_root_url = api_root_url  # 设置API根URL
  14.         self.session = requests.session()  # 创建一个requests的会话对象,提高请求效率
  15.     def get(self, url, **kwargs):
  16.         """
  17.         发送GET请求
  18.         :param url: API接口路径
  19.         :param kwargs: 其他可选参数(如headers, params等)
  20.         :return: GET请求的响应对象
  21.         """
  22.         return self.request(url, "GET", **kwargs)
  23.     def post(self, url, data=None, json=None, **kwargs):
  24.         """
  25.         发送POST请求
  26.         :param url: API接口路径
  27.         :param data: 表单数据(可选)
  28.         :param json: JSON格式数据(可选)
  29.         :param kwargs: 其他可选参数(如headers等)
  30.         :return: POST请求的响应对象
  31.         """
  32.         return self.request(url, "POST", data, json, **kwargs)
  33.     def put(self, url, data=None, **kwargs):
  34.         """
  35.         发送PUT请求
  36.         :param url: API接口路径
  37.         :param data: 需要更新的数据
  38.         :param kwargs: 其他可选参数(如headers等)
  39.         :return: PUT请求的响应对象
  40.         """
  41.         return self.request(url, "PUT", data, **kwargs)
  42.     def delete(self, url, **kwargs):
  43.         """
  44.         发送DELETE请求
  45.         :param url: API接口路径
  46.         :param kwargs: 其他可选参数(如headers等)
  47.         :return: DELETE请求的响应对象
  48.         """
  49.         return self.request(url, "DELETE", **kwargs)
  50.     def patch(self, url, data=None, **kwargs):
  51.         """
  52.         发送PATCH请求
  53.         :param url: API接口路径
  54.         :param data: 需要部分更新的数据
  55.         :param kwargs: 其他可选参数(如headers等)
  56.         :return: PATCH请求的响应对象
  57.         """
  58.         return self.request(url, "PATCH", data, **kwargs)
  59.     def request(self, url, method, data=None, json=None, **kwargs):
  60.         """
  61.         统一的请求方法
  62.         :param url: API接口路径
  63.         :param method: 请求方法(GET, POST, PUT, DELETE, PATCH)
  64.         :param data: 表单数据(可选)
  65.         :param json: JSON格式数据(可选)
  66.         :param kwargs: 其他可选参数(如headers, params等)
  67.         :return: 请求的响应对象
  68.         """
  69.         url = self.api_root_url + url  # 拼接完整的URL
  70.         headers = dict(**kwargs).get("headers")  # 获取请求头
  71.         params = dict(**kwargs).get("params")  # 获取请求参数
  72.         files = dict(**kwargs).get("files")  # 获取文件上传参数
  73.         cookies = dict(**kwargs).get("cookies")  # 获取cookies参数
  74.         # 记录请求日志
  75.         self.request_log(url, method, data, json, params, headers, files, cookies)
  76.         # 根据请求方法调用相应的requests方法
  77.         if method == "GET":
  78.             return self.session.get(url, **kwargs)
  79.         if method == "POST":
  80.             return requests.post(url, data=data, json=json, **kwargs)
  81.         if method == "PUT":
  82.             if json:
  83.                 data = complexjson.dumps(json)  # 将json对象转换为字符串
  84.             return self.session.put(url, data=data, **kwargs)
  85.         if method == "DELETE":
  86.             return self.session.delete(url, **kwargs)
  87.         if method == "PATCH":
  88.             if json:
  89.                 data = complexjson.dumps(json)  # 将json对象转换为字符串
  90.             return self.session.patch(url, data=data, **kwargs)
  91.     def request_log(self, url, method, data=None, json=None, params=None, headers=None, files=None, cookies=None,
  92.                     **kwargs):
  93.         """
  94.         记录HTTP请求日志,方便调试和问题排查
  95.         :param url: 请求的URL
  96.         :param method: 请求方法(GET, POST, PUT, DELETE, PATCH)
  97.         :param data: 表单数据(可选)
  98.         :param json: JSON格式数据(可选)
  99.         :param params: URL查询参数(可选)
  100.         :param headers: 请求头(可选)
  101.         :param files: 上传的文件(可选)
  102.         :param cookies: 请求的cookies(可选)
  103.         :param kwargs: 其他可选参数
  104.         """
  105.         logger.info("接口请求地址 ==>> {}".format(url))
  106.         logger.info("接口请求方式 ==>> {}".format(method))
  107.         logger.info("接口请求头 ==>> {}".format(complexjson.dumps(headers, indent=4, ensure_ascii=False)))
  108.         logger.info("接口请求 params 参数 ==>> {}".format(complexjson.dumps(params, indent=4, ensure_ascii=False)))
  109.         logger.info("接口请求体 data 参数 ==>> {}".format(complexjson.dumps(data, indent=4, ensure_ascii=False)))
  110.         logger.info("接口请求体 json 参数 ==>> {}".format(complexjson.dumps(json, indent=4, ensure_ascii=False)))
  111.         logger.info("接口上传附件 files 参数 ==>> {}".format(files))
  112.         logger.info("接口 cookies 参数 ==>> {}".format(complexjson.dumps(cookies, indent=4, ensure_ascii=False)))
复制代码
rest_client.py 封装了 GET、POST、PUT、DELETE 请求,提供一个 RestClient 类,让其他模块可以直接调用 HTTP 请求方法,而不必要每次都手写 requests.get() 或 requests.post()。
4.2 result_base.py:封装接口返回结果

  1. class ResultBase:
  2.     """
  3.     结果基类,用于定义接口返回结果的标准结构。
  4.     该类可以在后续扩展时添加通用的返回数据处理逻辑。
  5.     """
  6.     pass
复制代码
result_base.py 负责剖析接口返回的 JSON 数据,并提供统一的访问方式,让测试用例更加简洁。
5.data/:测试数据管理

作用:
让测试用例数据分离,便于维护
支持数据驱动,自动化测试多个场景
6. operation/:业务封装层

  1. from core.result_base import ResultBase
  2. from api.user import user
  3. from common.logger import logger
  4. def get_all_user_info():
  5.     """
  6.     获取全部用户信息
  7.     :return: 自定义的关键字返回结果 result
  8.     """
  9.     result = ResultBase()  # 创建ResultBase对象,存储返回结果
  10.     res = user.list_all_users()  # 调用API获取全部用户信息
  11.     result.success = False  # 默认成功标志为False
  12.     if res.json()["code"] == 0:  # 判断返回码是否为0
  13.         result.success = True  # 如果返回码为0,表示成功
  14.     else:
  15.         result.error = "接口返回码是 【 {} 】, 返回信息:{} ".format(res.json()["code"], res.json()["msg"])  # 错误信息
  16.     result.msg = res.json()["msg"]  # 记录返回消息
  17.     result.response = res  # 记录完整的响应
  18.     return result  # 返回封装的结果
  19. def get_one_user_info(username):
  20.     """
  21.     获取单个用户信息
  22.     :param username:  用户名
  23.     :return: 自定义的关键字返回结果 result
  24.     """
  25.     result = ResultBase()  # 创建ResultBase对象
  26.     res = user.list_one_user(username)  # 获取单个用户信息
  27.     result.success = False  # 默认成功标志为False
  28.     if res.json()["code"] == 0:
  29.         result.success = True  # 成功时设置为True
  30.     else:
  31.         result.error = "查询用户 ==>> 接口返回码是 【 {} 】, 返回信息:{} ".format(res.json()["code"], res.json()["msg"])  # 错误信息
  32.     result.msg = res.json()["msg"]
  33.     result.response = res
  34.     logger.info("查看单个用户 ==>> 返回结果 ==>> {}".format(result.response.text))  # 记录日志
  35.     return result
  36. def register_user(username, password, telephone, sex="", address=""):
  37.     """
  38.     注册用户信息
  39.     :param username: 用户名
  40.     :param password: 密码
  41.     :param telephone: 手机号
  42.     :param sex: 性别
  43.     :param address: 联系地址
  44.     :return: 自定义的关键字返回结果 result
  45.     """
  46.     result = ResultBase()  # 创建ResultBase对象
  47.     json_data = {  # 请求体内容
  48.         "username": username,
  49.         "password": password,
  50.         "sex": sex,
  51.         "telephone": telephone,
  52.         "address": address
  53.     }
  54.     header = {  # 请求头
  55.         "Content-Type": "application/json"
  56.     }
  57.     res = user.register(json=json_data, headers=header)  # 调用API进行注册
  58.     result.success = False  # 默认失败
  59.     if res.json()["code"] == 0:
  60.         result.success = True  # 注册成功时标记为True
  61.     else:
  62.         result.error = "接口返回码是 【 {} 】, 返回信息:{} ".format(res.json()["code"], res.json()["msg"])  # 错误信息
  63.     result.msg = res.json()["msg"]
  64.     result.response = res
  65.     logger.info("注册用户 ==>> 返回结果 ==>> {}".format(result.response.text))  # 记录日志
  66.     return result
  67. def login_user(username, password):
  68.     """
  69.     登录用户
  70.     :param username: 用户名
  71.     :param password: 密码
  72.     :return: 自定义的关键字返回结果 result
  73.     """
  74.     result = ResultBase()  # 创建ResultBase对象
  75.     payload = {  # 登录请求参数
  76.         "username": username,
  77.         "password": password
  78.     }
  79.     header = {
  80.         "Content-Type": "application/x-www-form-urlencoded"
  81.     }
  82.     res = user.login(data=payload, headers=header)  # 调用API进行登录
  83.     result.success = False  # 默认失败
  84.     if res.json()["code"] == 0:
  85.         result.success = True  # 登录成功时标记为True
  86.         # result.token = res.json()["login_info"]["token"]  # 存储登录令牌
  87.     else:
  88.         result.error = "接口返回码是 【 {} 】, 返回信息:{} ".format(res.json()["code"], res.json()["msg"])  # 错误信息
  89.     result.msg = res.json()["msg"]
  90.     result.response = res
  91.     logger.info("登录用户 ==>> 返回结果 ==>> {}".format(result.response.text))  # 记录日志
  92.     return result
  93. def update_user(id, admin_user, new_password, new_telephone, token, new_sex="", new_address=""):
  94.     """
  95.     根据用户ID,修改用户信息
  96.     :param id: 用户ID
  97.     :param admin_user: 当前操作的管理员用户
  98.     :param new_password: 新密码
  99.     :param new_telephone: 新手机号
  100.     :param token: 当前管理员用户的token
  101.     :param new_sex: 新性别
  102.     :param new_address: 新联系地址
  103.     :return: 自定义的关键字返回结果 result
  104.     """
  105.     result = ResultBase()  # 创建ResultBase对象
  106.     header = {
  107.         "Content-Type": "application/json"
  108.     }
  109.     json_data = {  # 请求体内容
  110.         "admin_user": admin_user,
  111.         "password": new_password,
  112.         "token": token,
  113.         "sex": new_sex,
  114.         "telephone": new_telephone,
  115.         "address": new_address
  116.     }
  117.     res = user.update(id, json=json_data, headers=header)  # 调用API进行用户信息更新
  118.     result.success = False  # 默认失败
  119.     if res.json()["code"] == 0:
  120.         result.success = True  # 更新成功时标记为True
  121.     else:
  122.         result.error = "接口返回码是 【 {} 】, 返回信息:{} ".format(res.json()["code"], res.json()["msg"])  # 错误信息
  123.     result.msg = res.json()["msg"]
  124.     result.response = res
  125.     logger.info("修改用户 ==>> 返回结果 ==>> {}".format(result.response.text))  # 记录日志
  126.     return result
  127. def delete_user(username, admin_user, token):
  128.     """
  129.     根据用户名,删除用户信息
  130.     :param username: 用户名
  131.     :param admin_user: 当前操作的管理员用户
  132.     :param token: 当前管理员用户的token
  133.     :return: 自定义的关键字返回结果 result
  134.     """
  135.     result = ResultBase()  # 创建ResultBase对象
  136.     json_data = {  # 请求体内容
  137.         "admin_user": admin_user,
  138.         "token": token,
  139.     }
  140.     header = {
  141.         "Content-Type": "application/json"
  142.     }
  143.     res = user.delete(username, json=json_data, headers=header)  # 调用API进行用户删除
  144.     result.success = False  # 默认失败
  145.     if res.json()["code"] == 0:
  146.         result.success = True  # 删除成功时标记为True
  147.     else:
  148.         result.error = "接口返回码是 【 {} 】, 返回信息:{} ".format(res.json()["code"], res.json()["msg"])  # 错误信息
  149.     result.msg = res.json()["msg"]
  150.     result.response = res
  151.     logger.info("删除用户 ==>> 返回结果 ==>> {}".format(result.response.text))  # 记录日志
  152.     return result
复制代码
业务api封装,供测试用例调用。
7. 测试报告展示

运行用例后,在项目根目录下,实验命令启动 allure 服务:
  1. allure serve ./testcases/api_test/report
复制代码




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表