当前位置: 首页 > news >正文

【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

执行安装命令:

pip install -r requirements.txt

三、核心模块实现

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

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

from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI(title="示例接口服务")
# 模拟用户数据库
user_db = {}
# 定义请求体模型
class User(BaseModel):
username: str
password: str
@app.post("/register", summary="用户注册接口")
def register(user: User):
if user.username in user_db:
return {"code": 1001, "msg": "用户名已存在", "data": None}
user_db[user.username] = user.password
return {"code": 200, "msg": "注册成功", "data": {"username": user.username}}
@app.get("/query_goods", summary="商品查询接口")
def query_goods(goods_id: int):
# 模拟商品数据
goods_data = {
1: {"name": "Python编程实战", "price": 59.9},
2: {"name": "Java核心技术", "price": 79.9}
}
if goods_id not in goods_data:
return {"code": 1002, "msg": "商品不存在", "data": None}
return {"code": 200, "msg": "查询成功", "data": goods_data[goods_id]}
if __name__ == "__main__":
import uvicorn
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商品不存在

接下来编写解析代码:

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

3. 通用请求模块封装

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

import requests
def send_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 = headers or {}
params = params or {}
try:
if method.upper() == "GET":
response = requests.get(full_url, headers=headers, params=params)
elif method.upper() == "POST":
response = requests.post(full_url, headers=headers, json=params)
else:
raise ValueError(f"不支持的请求方法: {method}")
return response.json()
except Exception as e:
return {"code": 500, "msg": f"请求异常: {str(e)}", "data": None}

4. Pytest测试用例执行模块

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

import pytest
from case_reader import read_excel_cases
from request_client import send_request
# 读取Excel用例
test_cases = read_excel_cases("test_cases.xlsx")
@pytest.mark.parametrize("case", test_cases)
def test_interface(case):
"""
接口测试用例
:param case: 单个测试用例
"""
# 发送请求
response = send_request(
url=case["url"],
method=case["method"],
headers=case["headers"],
params=case["params"]
)
# 断言响应码和响应信息
assert response["code"] == case["expected_code"], f"用例{case['case_id']}失败: 预期code{case['expected_code']}, 实际{response['code']}"
assert response["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实战项目,关注我不迷路~

http://www.jsqmd.com/news/387292/

相关文章:

  • 适用于室内和室外的集成式LED PCBA解决方案
  • 基础入门 Flutter for OpenHarmony:battery_plus 电池状态监控详解
  • ArcPy 脚本:批量生成郑州市 1990-2019 年空间分析结果(核密度、热点、平均中心、标准差椭圆)
  • 这次终于选对!圈粉无数的一键生成论文工具 —— 千笔AI
  • 2026年阿里巴巴/1688平台开户代运营权威评测:深圳昊客网络 脱颖而出 - 深圳昊客网络
  • WAC集团推出WAC建筑品牌,以先进、技术驱动的解决方案赋能照明设计师
  • 使用 ArcPy 批量裁剪建筑面矢量:根据城区边界提取城市建筑数据
  • 2026最新!千笔,专科生专属降AI神器
  • 毕业论文神器!千笔,备受喜爱的AI论文平台
  • Windows Powershell 打开即闪退 | Windows PowerShell 内部错误。加载托管的 Windows Powershell 失败,返回错误 80131018。
  • 强烈安利!千笔,口碑爆棚的一键生成论文工具
  • 服务器运维(四十)日服务器linux-ps分析工具—东方仙盟
  • 用 Python 批量提取 1990–2019 年高层建筑并按城市导出 Shapefile
  • delphi10.3中UpDown1使用
  • 【信息科学与工程学】【智能交通】第五篇 自动驾驶02
  • 看完就会:AI论文平台,千笔 VS 灵感风暴AI,本科生写作神器!
  • vue3+nodejs校园活动管理系统的设计与实现
  • 人工智能之核心基础 机器学习 第十八章 经典实战项目 - 实践
  • vue3+nodejs气象数据共享平台 天气预报数据共享系统
  • axure: 下拉菜单
  • 香港中巴租赁市场分析:2026口碑租赁公司哪家强?大巴租车/汽车租赁/跨境租车/班车租赁/跨境包车,租赁公司推荐 - 品牌推荐师
  • vue3+nodejs的运动减肥计划系统的设计与实现
  • 洋葱好坏腐烂检测数据集VOC+YOLO格式1015张3类别
  • vue3+nodejs基于智能推荐算法的网上生鲜销售系统 开题
  • 毕业论文神器!降AIGC平台 千笔 VS 云笔AI,自考党必备!
  • vue3+nodejs基于算能平台的个性化商品 商城推荐系统
  • vue3+nodejs农田多源数据智能采集与可视化系统设计
  • 2026年阿里巴巴/1688平台开户代运营深度测评:深圳昊客网络 实力出圈 - 深圳昊客网络
  • 二、Claude Opus 4.6 三体深度解析:角色灵魂 童话隐喻 伦理困境
  • vue3+nodejs基于微服务架构的校内电动车租赁系统的设计与实现