Python 自动化测试框架:基于 Unittest 与 Excel 的数据驱动及可视化报告生成
引言
在自动化测试实践中,构建一个能够自动生成精美可视化报告的测试框架至关重要。本文介绍如何运用 Python 的 Unittest、数据驱动测试(DDT)、Excel、Jinja2 和 HTML 技术,构建一个能够自动生成精美可视化测试报告的自动化测试框架。该框架旨在减少重复代码,提高用例维护效率,并实现测试结果的即时通知。
构建基于 Python Unittest 的自动化测试框架,利用 Excel 管理用例数据并通过自定义装饰器实现数据驱动测试。框架整合 Jinja2 模板引擎生成 HTML 可视化报告,支持日志记录与结果回显。同时集成邮件、钉钉及企业微信通知机制,实现测试流程的自动化闭环与团队信息同步。

在自动化测试实践中,构建一个能够自动生成精美可视化报告的测试框架至关重要。本文介绍如何运用 Python 的 Unittest、数据驱动测试(DDT)、Excel、Jinja2 和 HTML 技术,构建一个能够自动生成精美可视化测试报告的自动化测试框架。该框架旨在减少重复代码,提高用例维护效率,并实现测试结果的即时通知。
discover() 方法找到匹配的测试用例,由自定义 Runner 执行并生成报告。为了匹配框架使用,我们重新编写了类似 DDT 的装饰器,结合用例名称生成测试函数名称,从而兼容 unittest 的框架特性。核心代码如下:
import yaml
def list_data(datas):
"""
:param datas: Test data
:return:
"""
def wrapper(func):
setattr(func, "PARAMS", datas)
return func
return wrapper
def yaml_data(file_path):
"""
:param file_path: YAML file path
:return:
"""
def wrapper(func):
try:
with open(file_path, "r", encoding="utf-8") as f:
datas = yaml.load(f, Loader=yaml.FullLoader)
except:
with open(file_path, "r", encoding="gbk") as f:
datas = yaml.load(f, Loader=yaml.FullLoader)
setattr(func, "PARAMS", datas)
return func
return wrapper
此设计允许测试用例根据外部数据源动态生成,极大提升了用例的可维护性。
将上述装饰器应用于测试方法,通过多集成、封装及反射机制,最终的执行脚本代码精简为关键部分。以下是一个典型的测试类结构:
import unittest
from config import Config
from utils.do_excel import DoExcel
from action import Action
extensions = []
test_file = Config.TEST_CASE # 获取 excel 文件路径
excel = DoExcel(test_file)
test_case, databases, initialize_data, host = excel.get_excel_init_and_cases()
@ddt
class TestProjectApi(unittest.TestCase):
maxDiff = None
action = Action(initialize_data, databases)
@classmethod
def setUpClass(cls) -> None:
cls.action.load_modules_from_folder(extensions)
def setUp(self) -> None:
pass
@list_data(test_case)
def test_api(self, item):
sheet, iid, condition, st, name, desc, method, expected = self.action.base_info(item)
if self.action.is_run(condition):
self.skipTest("这个测试用例听说泡面比较好吃,所以放弃执行了!!")
regex, keys, deps, jp_dict, ex_request_data = self.action.extractor_info(item)
self.action.pause_execution(st)
self.action.exc_sql(item)
if self.action.is_only_sql(method):
self.skipTest("这条测试用例被 SQL 吃了,所以放弃执行了!!")
self.action.send_request(host, method, ex_request_data)
self.action.analysis_response(sheet, iid, name, desc, regex, keys, deps, jp_dict)
self.action.execute_validation(excel, sheet, iid, name, desc, expected)
@classmethod
def tearDownClass(cls) -> None:
excel.close_excel()
所有测试数据填写在 Excel 中,需要评审时直接将 Excel 文件交给开发,一劳永逸。Excel 的强大之处在于其易读性和筛选能力。以下是封装读取 Excel 的核心逻辑片段:
import openpyxl
class DoExcel:
def get_excel_data(self):
wb = openpyxl.load_workbook(self.file_path)
sheets = eval(self.get_excel_init().get(FieldNames.SHEETS))
for sheet_name in sheets:
sheet = wb[sheet_name]
max_row = self.get_max_row(sheet)
max_column = self.get_max_column(sheet)
first_header = []
for i in range(1, max_column + 1):
first_header.append(sheet.cell(1, i).value)
for i in range(2, max_row + 1):
sub_data = {}
for k in range(1, max_column + 1):
sub_data[first_header[k - 1]] = sheet.cell(i, k).value
sub_data[FieldNames.SHEET] = sheet_name
yield sub_data
用例运行过程中,日志信息的输出是重要环节。我们重写优化了 unittestReport 的核心代码,测试结果不再是枯燥的文字,而是以漂亮的 HTML 展示。报告中的每个测试用例都得到了详尽展示,包括输入数据、预期输出和实际结果。
支持多种样式报告,可根据团队需求切换。报告包含测试概览、详细用例状态及错误堆栈信息。
测试完成后,可将结果回写至 Excel 文件中,方便后续追踪历史版本对比。
生成美观的测试报告后,及时分享给团队同样重要。通过 SMTP 库、钉钉和企业微信等渠道,可以自动发送测试报告,确保团队成员即时了解测试进展和结果。
利用 Python 的 smtplib 库配置 SMTP 服务器,将 HTML 报告作为附件或内嵌内容发送邮件。
本框架通过整合 Unittest、Excel 数据驱动、HTML 报告生成及多渠道通知,实现了测试流程的自动化闭环。它不仅降低了用例维护成本,还提升了测试结果的可视化和团队协作效率。开发者只需关注业务逻辑,无需频繁配置 Jenkins 或处理 Allure 乱码问题,可专注于测试专业工作。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online