阶段 组件名称 组件来源 功能描述 环境配置 user_info
配置层 conf/setting.py
存储用户敏感信息(如账号密码),用于鉴权参数替换(如 ${username}
→ 实际值)。data_dir
工具层 tools/handle_path.py
定义测试数据文件的存储路径(如 Excel 文件路径),统一管理测试资源路径依赖。 数据准备 handle_excel
工具层 tools/handle_excel.py
从 Excel 文件(如 test_data.xlsx
)中读取测试用例数据,解析为字典列表供测试用例分发。测试框架 unittest
Python 标准库 提供测试用例基类、测试运行方法(如 setUpClass
)及断言方法(如assertEqual
)。ddt
第三方库(需安装) 实现数据驱动测试,通过 @data
装饰器自动分发参数化测试用例(如多组登录账号测试)。参数处理 handle_replace
工具层 tools/handle_replace.py
动态替换请求参数中的占位符(如 ${token}
→ 全局变量值),并清洗非法字符(空格、换行符)。请求发送 requests
第三方库(需安装) 发送 HTTP 请求(如 POST、GET),支持文件上传( MultipartEncoder
)。handle_requests
工具层 tools/handle_requests.py
封装 requests
方法,统一处理鉴权头注入(如自动添加Authorization: bearer ${token}
)及请求异常处理。响应处理 handle_response
工具层 tools/handle_response.py
处理接口响应数据: 1. 识别 JSON/文本格式并统一封装 2. 使用 jsonpath
动态提取字段(如$..user_id
)。结果验证 handle_response
工具层 tools/handle_response.py
调用 unittest
的断言方法,对比接口实际响应与 Excel 预期值,标记测试失败或成功。数据库断言 handle_assert_db
工具层 tools/handle_assert_db.py
执行 SQL 查询并验证数据库结果(如订单状态、用户余额),通过 assertEqual
实现数据层校验。全局变量提取 handle_extract
工具层 tools/handle_extract.py
从接口响应中提取关键字段(如 token
、order_id
)存储为全局变量,供其他接口参数化使用(如支付依赖订单号)。
python""" 0、前置后置 1、参数替换:参数化 2、发送请求:鉴权的问题 3、响应结果的处理:接口返回类型不统一的问题 4、全局变量的提取:参数依赖问题 5、接口返回值的断言:校验接口层 6、数据库的断言:校验到数据层 """ import requests import unittest from ddt import ddt,data from tools.handle_assert_db import HandleAssertDb from tools.handle_extract import HandleExtract from tools.handle_requests import HandleRequests from tools.handle_path import data_dir from tools.handle_excel import HandleExcel from tools.handle_replace import HandleReplace from tools.handle_db import mysql from conf.setting import assert_db_info #获取测试用例数据 from tools.handle_reponse import HandleResponse case_list = HandleExcel(file_name=data_dir,sheet_name="upload").get_excel_test_cases() @ddt class TestUpload(unittest.TestCase): @classmethod def setUpClass(cls) -> None: #请求头 cls.headers = {"Content-Type":"application/json; charset=UTF-8","locale":"zh_cn"} cls.handle_replace = HandleReplace() #参数替换类的初始化 cls.handle_response = HandleResponse() # 响应结果封装 cls.handle_requests = HandleRequests() # 请求封装 cls.handle_extract = HandleExtract() # 全局变量提取 cls.handle_assert_db = HandleAssertDb() # 数据库断言 #后置处理 @classmethod def tearDownClass(cls) -> None: mysql.db_close() # str 关键字不要用,excel参数要用双引号 @data(*case_list) # [{},{}] def test_upload(self,case): # 1、参数替换,请求参数替换、删掉空格 new_data = self.handle_replace.replace_data(data=case["data"]) # 2、发送请求 new_response = self.handle_requests.send_requests(method=case["method"],url=case["url"],data=new_data,is_upload=case["is_upload"]) # 3、接口响应断言 self.handle_response.assert_reponse(expected_data=case["expected_data"],response=new_response) # 4、提取全局变量 self.handle_extract.handle_extract(extract_data=case["extract_data"],response=new_response) # 5、数据断言 self.handle_assert_db.assert_db(assert_db=case["assert_db"],assert_db_info=assert_db_info) if __name__ == '__main__': unittest.main()