摘要
本文介绍如何利用 Python 构建一个接口自动化测试工具。该工具以 Excel 为驱动,通过手动维护用例表格数据实现测试用例管理,支持用例之间的依赖关联,每次执行时自动初始化测试数据,防止数据残留干扰测试结果。同时,工具能够生成中文 HTML 格式的测试报告,并对可能出现的异常做详细中文提示,方便快速定位问题。本文将详细说明项目目录结构、各模块代码实现及测试运行说明,适合大家参考改造。
关键词
接口自动化测试、Python、Excel、中文报告、数据初始化、Pycharm
目录
项目背景与需求分析
在实际工作中,作为软件测试工程师,我们经常需要验证各类 API 接口的有效性和稳定性。为了提高测试效率,本项目提出如下需求:
-
使用 Excel 手动维护接口测试用例,支持依赖关联(如登录后返回的 token 可供后续接口使用)。
-
每次测试用例执行后执行数据初始化,防止数据干扰。
-
自动执行接口请求,并针对请求异常(如解析 JSON 响应失败、请求超时等)进行中文提示,帮助快速定位错误。
-
最终生成中文 HTML 格式的测试报告,展示各用例执行情况。
通过本文示例,可以搭建一个简单实用的自动化测试框架,再根据业务需求进一步扩展。
工程目录结构设计
下面是项目的建议目录结构,大家可在 PyCharm 中直接创建该工程目录,并按照说明编写各模块代码:
project/
├── tests/
│ ├── test_cases.xlsx # 用例数据(Excel 表格)
│ ├── test_api.py # 测试用例执行逻辑及依赖处理
│ └── __init__.py
├── reports/
│ └── test_report.html # 自动生成的中文测试报告
├── utils/
│ ├── api_request.py # 封装 HTTP 请求及错误提示
│ ├── data_handler.py # 读取 Excel 用例及数据初始化模块
│ ├── report_generator.py # 测试报告生成模块
│ └── __init__.py
└── main.py # 执行入口文件
关键模块代码实现
API 请求封装
在 utils/api_request.py
模块中,我们封装了 HTTP 请求逻辑,包括异常捕获和 JSON 响应解析。若出现错误,将在控制台输出中文提示及错误位置。
python
# utils/api_request.py
import requests
class APIRequest:
@staticmethod
def send_request(method, url, headers=None, payload=None):
"""
发送 HTTP 请求,返回状态码和响应数据。
"""
try:
response = requests.request(method=method, url=url, headers=headers, json=payload, timeout=10)
try:
return response.status_code, response.json()
except Exception as json_err:
# 响应内容非标准 JSON 格式
print(f"错误:在解析响应 JSON 时发生错误。错误位置:api_request.py -> send_request | 错误详情:{json_err}")
return response.status_code, None
except Exception as req_err:
print(f"错误:请求接口时发生错误。错误位置:api_request.py -> send_request | 错误详情:{req_err}")
return None, None
Excel 数据读取与数据初始化
在 utils/data_handler.py
模块中,主要负责从 Excel 表格中读取用例数据,并在每条测试用例执行后初始化数据,避免测试数据干扰。
python
# utils/data_handler.py
import pandas as pd
class DataHandler:
@staticmethod
def load_test_cases(file_path):
"""
从 Excel 表中读取测试用例数据。
"""
try:
df = pd.read_excel(file_path)
return df
except Exception as e:
print(f"错误:读取 Excel 文件失败。错误位置:data_handler.py -> load_test_cases | 错误详情:{e}")
return None
@staticmethod
def reset_data():
"""
初始化测试数据(例如清空缓存、重置状态)。
"""
# 根据实际情况扩展重置逻辑,此处仅输出提示信息
print("信息:测试数据已初始化。")
测试用例执行逻辑与依赖处理
在 tests/test_api.py
文件中,我们实现了以下功能:
-
遍历 Excel 表格中每条测试用例;
-
自动处理请求头、请求体的 JSON 解析;
-
根据设置的依赖用例,提取之前接口返回数据推送到当前请求中;
-
每执行完一个用例后调用数据初始化;
-
汇总测试结果,供后续报告生成使用。
python
# tests/test_api.py
import json
import pandas as pd
from utils.api_request import APIRequest
from utils.data_handler import DataHandler
from utils.report_generator import ReportGenerator
class TestAPI:
@staticmethod
def execute_test_cases(file_path):
"""
执行测试用例:
1. 从 Excel 加载用例数据;
2. 遍历每条用例,处理解析、依赖关系(将前序返回数据存储到变量中);
3. 发起接口请求并记录响应结果;
4. 调用数据初始化,防止数据残留;
5. 生成中文测试报告。
"""
df = DataHandler.load_test_cases(file_path)
if df is None:
return
test_results = []
dependency_data = {} # 存储依赖用例返回数据,供后续用例使用
for index, row in df.iterrows():
case_name = str(row.get('用例名称')).strip()
method = str(row.get('请求方法')).upper().strip()
url = str(row.get('接口URL')).strip()
headers = row.get('请求头')
payload = row.get('请求体')
dependency = row.get('依赖用例') # 依赖关系(可选)
# 解析请求头(JSON 字符串)
try:
if pd.isna(headers) or headers.strip() == "" or headers.strip() == "{}":
headers_dict = {}
else:
headers_dict = json.loads(headers)
except Exception as e:
print(f"错误:解析请求头失败。错误位置:test_api.py -> execute_test_cases | 用例名称:{case_name} | 错误详情:{e}")
headers_dict = {}
# 解析请求体(JSON 字符串)
try:
if pd.isna(payload) or str(payload).strip() == "" or str(payload).strip() == "{}":
payload_dict = {}
else:
payload_dict = json.loads(payload)
except Exception as e:
print(f"错误:解析请求体失败。错误位置:test_api.py -> execute_test_cases | 用例名称:{case_name} | 错误详情:{e}")
payload_dict = {}
# 处理依赖用例——将依赖用例返回的数据嵌入当前请求中
if pd.notna(dependency) and str(dependency).strip() != "":
dependency = str(dependency).strip()
if dependency in dependency_data and dependency_data[dependency]:
# 此处示例:将依赖用例返回的“token”数据传入当前请求的字段中
payload_dict['dependency'] = dependency_data[dependency]
else:
print(f"警告:依赖用例【{dependency}】数据未找到,可能尚未执行或执行失败。")
# 发起 HTTP 请求
status_code, response_data = APIRequest.send_request(method, url, headers_dict, payload_dict)
status = "成功" if status_code == 200 else f"失败(HTTP 状态码:{status_code})"
# 保存当前用例的返回结果,用于后续依赖
dependency_data[case_name] = response_data
# 记录当前测试用例的执行结果
test_results.append({
'case_name': case_name,
'url': url,
'method': method,
'status': status,
'response': response_data
})
# 每个用例执行后初始化数据,防止数据干扰
DataHandler.reset_data()
# 根据测试结果生成中文测试报告
ReportGenerator.generate_report(test_results)
中文测试报告生成
在 utils/report_generator.py
模块中我们利用 jinja2
模板引擎生成详细的 HTML 测试报告,报告中列出用例名称、接口 URL、请求方法、执行状态与响应结果等信息。
python
# utils/report_generator.py
from jinja2 import Template
class ReportGenerator:
@staticmethod
def generate_report(results, output_file="reports/test_report.html"):
"""
根据测试结果生成 HTML 格式的中文测试报告。
"""
template = Template("""
<html>
<head>
<meta charset="utf-8">
<title>测试报告</title>
<style>
table { border-collapse: collapse; width: 100%; }
table, th, td { border: 1px solid black; }
th, td { padding: 8px; text-align: left; }
pre { white-space: pre-wrap; word-wrap: break-word; }
</style>
</head>
<body>
<h1>测试报告</h1>
<table>
<thead>
<tr>
<th>用例名称</th>
<th>接口 URL</th>
<th>请求方法</th>
<th>状态</th>
<th>响应结果</th>
</tr>
</thead>
<tbody>
{% for result in results %}
<tr>
<td>{{ result.case_name }}</td>
<td>{{ result.url }}</td>
<td>{{ result.method }}</td>
<td>{{ result.status }}</td>
<td><pre>{{ result.response }}</pre></td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
""")
try:
report_content = template.render(results=results)
with open(output_file, "w", encoding="utf-8") as f:
f.write(report_content)
print(f"信息:测试报告已生成 - {output_file}")
except Exception as e:
print(f"错误:生成测试报告失败。错误位置:report_generator.py -> generate_report | 错误详情:{e}")
入口文件
最后在 main.py
中调用整个测试流程,指定 Excel 用例文件路径并启动测试。
python
# main.py
from tests.test_api import TestAPI
if __name__ == "__main__":
# 指定测试用例 Excel 文件路径,确保该文件路径正确
excel_file_path = "tests/test_cases.xlsx"
TestAPI.execute_test_cases(excel_file_path)
Excel 用例表格设计说明
在 tests/test_cases.xlsx
文件中,请按照以下示例设计表格,并确保各列名称与代码中获取的字段一致(注意大小写):
用例名称 | 请求方法 | 接口URL | 请求头 | 请求体 | 依赖用例 |
---|---|---|---|---|---|
获取所有帖子 | GET | https://******/posts | {} | {} | |
创建新帖子 | POST | https://******/posts | {"Content-Type": "application/json"} | {"title": "foo", "body": "bar", "userId": 1} | |
更新现有帖子 | PUT | https://******/posts/1 | {"Content-Type": "application/json"} | {"id": 1, "title": "foo", "body": "bar", "userId": 1} | |
删除帖子 | DELETE | https://******/posts/1 | {} | {} |
如存在依赖关系(例如登录接口返回的数据),请在“依赖用例”列填写对应依赖用例名称,框架将自动把依赖结果传入当前测试用例中。
测试运行与错误调试
-
使用 PyCharm 打开整个
project
工程; -
确保已安装所需第三方库:
bash
pip install requests pandas openpyxl jinja2
-
根据实际应用情况更新 Excel 测试用例数据;
-
运行
main.py
启动测试。 -
如遇到错误,系统会在控制台输出详细的中文提示及错误发生位置(如
api_request.py -> send_request
、data_handler.py -> load_test_cases
等),便于快速定位问题。 -
测试结束后,在
reports/test_report.html
中查看详细测试报告。
实例运行截图
若用例依赖执行失败时,运行中会进行提示
总结与扩展思考
本文详细介绍了如何基于 Python 构建一个接口自动化测试工具,重点在于:
-
Excel 用例驱动:测试用例统一维护,便于管理和扩展;
-
异常处理:在接口调用、JSON 解析、报告生成等环节均设计了详细的错误提示;
-
数据初始化:每条用例执行后重置测试数据,避免历史数据干扰;
-
中文报告生成:最终生成 HTML 格式的中文测试报告,直观展示测试结果。
希望本篇文章能对大家构建接口自动化测试工具提供一些帮助与启发。欢迎在评论区交流讨论,共同进步!