news 2026/4/8 12:47:32

【Python】从0到1实现轻量级接口测试工具:基于Python+FastAPI+Pytest

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Python】从0到1实现轻量级接口测试工具:基于Python+FastAPI+Pytest

文章目录

    • 一、技术栈选型与核心思路
      • 1. 技术栈选型理由
      • 2. 核心实现思路
    • 二、环境准备
    • 三、核心模块实现
      • 1. 编写待测试的示例接口(FastAPI)
      • 2. 用例读取模块(Excel解析)
      • 3. 通用请求模块封装
      • 4. Pytest测试用例执行模块
    • 四、运行测试并生成报告
      • 1. 启动示例接口服务
      • 2. 执行测试用例
      • 3. 查看测试报告
    • 五、扩展优化方向
    • 六、总结与收获

在日常开发和学习中,接口测试是绕不开的环节。很多同学习惯用Postman手动测试,虽然便捷但无法批量执行;也有人会写零散的Python脚本,却面临复用性差、没有可视化报告的问题。作为软件专业学生,我花了两天时间,基于Python+FastAPI+Pytest搭建了一个轻量级接口测试工具,支持用例管理、批量执行、自动生成测试报告,核心代码仅300行左右。今天就把完整实现过程分享出来,所有核心代码均已附在文中,新手也能轻松复现!

一、技术栈选型与核心思路

1. 技术栈选型理由

技术框架选型原因
Python语法简洁,生态丰富,requests/openpyxl等库能快速实现功能
FastAPI高性能异步框架,自动生成接口文档,用来搭建待测试的示例接口
Pytest灵活的测试框架,支持参数化、夹具功能,适合批量执行测试用例
openpyxl读写Excel文件,实现数据驱动测试,非技术人员也能编写用例
pytest-html生成美观的HTML测试报告,直观展示用例执行结果

2. 核心实现思路

  1. 用Excel维护测试用例,包含接口地址、请求方法、请求头、参数、预期结果等字段;
  2. 编写用例读取模块,解析Excel数据并转换成Pytest可执行的测试数据;
  3. 基于FastAPI编写示例接口(如用户注册、商品查询),作为测试目标;
  4. 封装通用请求模块,支持GET/POST等请求方法;
  5. 用Pytest参数化执行所有用例,断言实际响应与预期结果;
  6. 生成HTML测试报告,统计用例通过率和失败原因。

二、环境准备

首先安装所需依赖库,创建requirements.txt文件:

fastapi==0.104.1 uvicorn==0.24.0 requests==2.31.0 pytest==7.4.3 openpyxl==3.1.2 pytest-html==4.0.2

执行安装命令:

pipinstall-r requirements.txt

三、核心模块实现

1. 编写待测试的示例接口(FastAPI)

创建app.py文件,实现两个简单接口:用户注册和商品查询,作为后续测试的目标。

fromfastapiimportFastAPIfrompydanticimportBaseModel app=FastAPI(title="示例接口服务")# 模拟用户数据库user_db={}# 定义请求体模型classUser(BaseModel):username:strpassword:str@app.post("/register",summary="用户注册接口")defregister(user:User):ifuser.usernameinuser_db:return{"code":1001,"msg":"用户名已存在","data":None}user_db[user.username]=user.passwordreturn{"code":200,"msg":"注册成功","data":{"username":user.username}}@app.get("/query_goods",summary="商品查询接口")defquery_goods(goods_id:int):# 模拟商品数据goods_data={1:{"name":"Python编程实战","price":59.9},2:{"name":"Java核心技术","price":79.9}}ifgoods_idnotingoods_data:return{"code":1002,"msg":"商品不存在","data":None}return{"code":200,"msg":"查询成功","data":goods_data[goods_id]}if__name__=="__main__":importuvicorn uvicorn.run(app,host="127.0.0.1",port=8000)

运行该文件,访问http://127.0.0.1:8000/docs即可看到自动生成的接口文档。

2. 用例读取模块(Excel解析)

创建case_reader.py文件,实现读取Excel用例的功能。首先准备一个Excel用例文件test_cases.xlsx,格式如下:

case_idurlmethodheadersparamsexpected_codeexpected_msg
1/registerPOST{“Content-Type”:“application/json”}{“username”:“test01”,“password”:“123456”}200注册成功
2/registerPOST{“Content-Type”:“application/json”}{“username”:“test01”,“password”:“123456”}1001用户名已存在
3/query_goodsGET{}{“goods_id”:1}200查询成功
4/query_goodsGET{}{“goods_id”:99}1002商品不存在

接下来编写解析代码:

importopenpyxlfromtypingimportList,Dictdefread_excel_cases(file_path:str)->List[Dict]:""" 读取Excel中的测试用例 :param file_path: Excel文件路径 :return: 测试用例列表 """wb=openpyxl.load_workbook(file_path)ws=wb.active# 获取表头headers=[cell.valueforcellinws[1]]cases=[]# 读取数据行forrowinws.iter_rows(min_row=2,values_only=True):case=dict(zip(headers,row))# 处理参数格式:字符串转字典case["params"]=eval(case["params"])ifcase["params"]else{}case["headers"]=eval(case["headers"])ifcase["headers"]else{}cases.append(case)wb.close()returncasesif__name__=="__main__":test_cases=read_excel_cases("test_cases.xlsx")forcaseintest_cases:print(case)

3. 通用请求模块封装

创建request_client.py文件,封装支持GET/POST的通用请求函数:

importrequestsdefsend_request(url:str,method:str,headers:dict=None,params:dict=None)->dict:""" 发送HTTP请求 :param url: 完整接口地址 :param method: 请求方法 GET/POST :param headers: 请求头 :param params: 请求参数 :return: 响应结果字典 """base_url="http://127.0.0.1:8000"full_url=base_url+url headers=headersor{}params=paramsor{}try:ifmethod.upper()=="GET":response=requests.get(full_url,headers=headers,params=params)elifmethod.upper()=="POST":response=requests.post(full_url,headers=headers,json=params)else:raiseValueError(f"不支持的请求方法:{method}")returnresponse.json()exceptExceptionase:return{"code":500,"msg":f"请求异常:{str(e)}","data":None}

4. Pytest测试用例执行模块

创建test_runner.py文件,这是整个工具的核心执行模块,使用Pytest参数化驱动用例执行:

importpytestfromcase_readerimportread_excel_casesfromrequest_clientimportsend_request# 读取Excel用例test_cases=read_excel_cases("test_cases.xlsx")@pytest.mark.parametrize("case",test_cases)deftest_interface(case):""" 接口测试用例 :param case: 单个测试用例 """# 发送请求response=send_request(url=case["url"],method=case["method"],headers=case["headers"],params=case["params"])# 断言响应码和响应信息assertresponse["code"]==case["expected_code"],f"用例{case['case_id']}失败: 预期code{case['expected_code']}, 实际{response['code']}"assertresponse["msg"]==case["expected_msg"],f"用例{case['case_id']}失败: 预期msg{case['expected_msg']}, 实际{response['msg']}"

四、运行测试并生成报告

1. 启动示例接口服务

先运行app.py,确保接口服务在8000端口正常启动。

2. 执行测试用例

在终端执行以下命令,生成HTML测试报告:

pytest test_runner.py -s -v --html=test_report.html

命令说明:

  • -s:显示打印信息;
  • -v:显示详细测试过程;
  • --html=test_report.html:生成HTML格式测试报告。

3. 查看测试报告

执行完成后,会在当前目录生成test_report.html文件,打开后可以看到:

  • 用例总数、通过数、失败数统计;
  • 每个用例的执行详情、失败原因;
  • 测试执行时间。

五、扩展优化方向

这个轻量级工具满足了基础的接口测试需求,作为学生项目已经足够体现技术能力。如果想进一步优化,可以尝试这些方向:

  1. 添加数据库支持:用SQLite/MySQL存储测试用例,替代Excel,支持用例的增删改查;
  2. 开发GUI界面:用PyQt5或Tkinter做可视化界面,实现“点击运行”“用例编辑”等功能;
  3. 支持更多协议:添加对WebSocket、gRPC等协议的测试支持;
  4. 集成CI/CD:配置自动化流程,实现代码修改后自动运行测试;
  5. 添加鉴权处理:支持Token、Cookie等接口鉴权方式,覆盖更多实际场景。

六、总结与收获

通过这个项目,我不仅巩固了Python、FastAPI、Pytest等技术的实战用法,还理解了数据驱动测试的核心思想。相比于单纯背理论,这种“从0到1”的项目实战更能提升技术能力,而且把这个工具写进简历,比“熟悉Python”这样的描述更有说服力。

所有代码均已完整附在文中,大家可以直接复制创建对应文件,按照步骤操作即可复现整个工具。如果在运行过程中遇到问题,欢迎在评论区留言交流,我会尽力帮忙解答!


写在最后:如果这篇文章对你有帮助,别忘了点赞+收藏!后续我还会分享更多Python实战项目,关注我不迷路~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/8 21:57:37

Qwen3-VL工业检测案例:云端GPU低成本验证方案

Qwen3-VL工业检测案例:云端GPU低成本验证方案 你是不是也遇到过这样的情况:作为工厂的工程师,想试试用AI来做流水线上的产品质量检测,比如自动识别零件有没有划痕、装配是否到位、标签贴得正不正。但公司IT规定严格,不…

作者头像 李华
网站建设 2026/3/31 2:38:20

Qwen3-Embedding-4B代码实例:如何实现指令感知向量化

Qwen3-Embedding-4B代码实例:如何实现指令感知向量化 1. 通义千问3-Embedding-4B:面向多语言长文本的高性能向量化模型 Qwen3-Embedding-4B 是阿里云通义千问(Qwen)系列中专为文本向量化任务设计的双塔结构模型,参数…

作者头像 李华
网站建设 2026/3/31 14:35:51

5分钟快速部署:Lucky Draw专业年会抽奖系统完整指南

5分钟快速部署:Lucky Draw专业年会抽奖系统完整指南 【免费下载链接】lucky-draw 年会抽奖程序 项目地址: https://gitcode.com/gh_mirrors/lu/lucky-draw 还在为年会抽奖环节的公平性和趣味性发愁吗?Lucky Draw作为一款基于Vue.js的开源年会抽奖…

作者头像 李华
网站建设 2026/4/8 21:42:19

AI照片修复业务落地:线下门店技术实施方案

AI照片修复业务落地:线下门店技术实施方案 1. 引言 1.1 业务场景与痛点分析 在传统摄影冲印店、老照片修复工作室以及社区便民服务站中,大量用户携带老旧、模糊或低分辨率的照片前来寻求修复服务。这些图像普遍存在以下问题: 分辨率过低&…

作者头像 李华
网站建设 2026/4/6 3:46:38

通义千问3-Embedding-4B性能测试:中英代码三场景

通义千问3-Embedding-4B性能测试:中英代码三场景 1. 模型概述:Qwen3-Embedding-4B 的核心定位与技术特征 1.1 中等体量下的高效向量化能力 Qwen3-Embedding-4B 是阿里云通义千问 Qwen3 系列中专为文本向量化任务设计的双塔模型,参数规模为…

作者头像 李华
网站建设 2026/4/5 12:50:50

小白也能玩转AI文本生成:DeepSeek-R1-Qwen-1.5B保姆级教程

小白也能玩转AI文本生成:DeepSeek-R1-Qwen-1.5B保姆级教程 1. 引言 1.1 为什么选择 DeepSeek-R1-Distill-Qwen-1.5B? 在当前大模型快速发展的背景下,如何选择一个性能强、易部署、功能专精的轻量级推理模型,成为许多开发者和初…

作者头像 李华