news 2026/6/9 18:58:44

unittestreport 数据驱动 (DDT) 的实现源码解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
unittestreport 数据驱动 (DDT) 的实现源码解析
前言

在做自动化过程中,通过数据驱动主要是为了将用例数据和用例逻辑进行分离,提高代码的重用率以及方便用例后期的维护管理。很多小伙伴在使用unittest做自动化测试的时候,都是用的ddt这个模块来实现数据驱动的。也有部分小伙伴对ddt内部实现的源码比较感兴趣,前段时间小编在开发unttestreport的时候也写了一版数据驱动,使用的入口和ddt差不多,今天就给大家分析一下unittestreport中数据驱动(ddt),源码实现的过程!

一、快速使用

在给大家分析源码之前先给大家讲解一下unittestreport中的ddt如何使用!unittestreport.dataDriver模块中实现了三个使用方法,支持使用列表(可迭代对象)、json文件、yaml文件来生成测试用例,这边给大家介绍一下使用方法:

  • 1、模块导入

    from unittestreport.dataDriver import ddt, list_data
  • 2、使用案例

    • 第一步:使用ddt装饰测试用例类

    • 第二步:根据使用的数据选择对应的方法进行驱动

    from unittestreport import ddt, list_data @ddt class TestClass(unittest.TestCase): cases = [{'title': '用例1', 'data': '用例参数', 'expected': '预期结果'}, {'title': '用例2', 'data': '用例参数', 'expected': '预期结果'}, {'title': '用例3', 'data': '用例参数', 'expected': '预期结果'}] @list_data(cases) def test_case(self, data): pass
    • 第三步:运行上面用例文件,就会发现执行了三条测试用例

二、源码分析

在上面的使用案例中我们使用了一个ddt的装饰器去装饰测试用例类,一个list_data的装饰器去装饰测试用例方法。

1、ddt

在上面的用例类前面我们用了一个@ddt这行代码的作用到底是什么呢?

# @ddt这个是装饰器的语法,这行代码的作用等同于 TestClass = ddt(TestClass)

我们来看一下ddt里面的源码

def ddt(cls): for name, func in list(cls.__dict__.items()): if hasattr(func, "PARAMS"): for index, case_data in enumerate(getattr(func, "PARAMS")): # 生成用例名称, new_test_name = _create_test_name(index, name) # 生成用例描述 if isinstance(case_data, dict) and case_data.get("title"): test_desc = case_data.get("title") elif isinstance(case_data, dict) and case_data.get("desc"): test_desc = case_data.get("desc") else: test_desc = func.__doc__ func2 = _update_func(new_test_name, case_data, test_desc, func) setattr(cls, new_test_name, func2) else: delattr(cls, name) return cls

从上面的源码我们可以看出来,把测试类当成参数传入data之后,在内部做了一系列操作之后将测试类返回了出来。这一系列操作其实就是根据测试用例数据,创建测试用例方法添加到测试类中,代码中重要步骤如下图描述所示。

对于上面遍历,判断方法是否拥有PARAMS属性,这个PARAMA属性是怎么来的呢?PARAMA属性是@list_data(cases)的时候添加的,接下来我们来看一下list_data的源码

2、list_data

上面案例中@list_data(cases)这行代码的作用等同于test_case = list_data(cases)(test_case),我们来看一下源码。

def list_data(datas): """ :param datas: 测试数据 :return: """ def wrapper(func): setattr(func, "PARAMS", datas) return func return wrapper

'

运行

运行

通过源码我们可以发现执行@list_data(cases)的时候只做了一件事情,就是给测试用例方法添加了一个PARAMS属性。

通过上面的源码分析,我们来简单的讲一下,关于ddt实现的具体流程。

3、其他的内部实现方法

在ddt这个函数中我们调用了_create_test_name方法和_update_func这两个内部方法,那么这两个内部方法中分别做了什么事情呢?接下来分别来看一下

  • _create_test_name:创建用例的方法名

    def _create_test_name(index, name): if index + 1 < 10: test_name = name + "_0" + str(index + 1) else: test_name = name + "_" + str(index + 1) return test_name

    可以看到该方法会根据传进来的index(用例数据的索引)和原用例名进行拼接,生成一个新的用例方法名。

  • _update_func:创建一个新的用例方法

    def _update_func(new_func_name, params, test_desc, func, *args, **kwargs): @wraps(func) def wrapper(self): return func(self, params, *args, **kwargs) wrapper.__wrapped__ = func wrapper.__name__ = new_func_name wrapper.__doc__ = test_desc return wrapper

    从上面的代码可以看到,这个函数内部重写定义了一个函数,将原来的函数保存为了这个函数对象的属性,并设置了函数名,以及函数相关的文档字符串,最后将函数返回了。函数内部调研的还是原来的函数(测试用例方法)。

4、实现流程的分析

  • 1、将所有的测试用例数据保存为测试方法的PARAMS属性。

  • 2、遍历测试类的所有属性和方法。

  • 3、判断遍历出来的属性或者方法是否拥有PARAMS属性。

  • 4、如果拥有PARAMS属性,那么就遍历PARAMS中的测试数据。

  • 5、每遍历出来一条数据,就创建一个测试方法,并将测试方法添加为测试类的类属性。

关于数据驱动实现的源码就给大家介绍到这里了,另附unittestreport模块详细的使用文档,里面有关于更多的uniitestreport扩展使用功能哦。

最后作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些软件测试的学习资料,这些资料希望能给你前进的路上带来帮助。

视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

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

【Open-AutoGLM黑科技解析】:3步实现手机全场景自动操作

第一章&#xff1a;Open-AutoGLM黑科技概览Open-AutoGLM 是新一代开源自动化生成语言模型框架&#xff0c;专为提升大模型在复杂任务中的自主推理与执行能力而设计。其核心理念是将自然语言理解、工具调用、上下文记忆与动态规划深度融合&#xff0c;实现从“被动响应”到“主动…

作者头像 李华
网站建设 2026/6/8 23:00:06

2025 年加密市场背景:为何“选对交易平台”成为更重要的决策

随着加密资产市场逐步进入相对成熟的发展阶段&#xff0c;2025 年的行业环境已明显不同于早期的高速扩张时期。市场仍然存在波动&#xff0c;但用户结构正在发生变化&#xff1a;一方面&#xff0c;新入场用户持续增加&#xff1b;另一方面&#xff0c;用户对交易体验、系统稳定…

作者头像 李华
网站建设 2026/6/9 18:43:45

为什么90%的人装不上Open-AutoGLM?深度剖析安装失败的7大根源

第一章&#xff1a;为什么90%的人装不上Open-AutoGLM&#xff1f;许多开发者在尝试部署 Open-AutoGLM 时遭遇失败&#xff0c;主要原因并非项目本身复杂&#xff0c;而是环境配置和依赖管理的细节被普遍忽视。该项目对 Python 版本、CUDA 驱动及 PyTorch 编译版本有严格要求&am…

作者头像 李华
网站建设 2026/6/9 18:41:07

为什么顶尖开发者都在关注Open-AutoGLM?(内含稀缺使用场景曝光)

第一章&#xff1a;Open-AutoGLM电脑能干嘛Open-AutoGLM 是一款基于开源大语言模型的智能计算平台&#xff0c;专为自动化任务与本地化推理设计。它能在普通个人电脑上运行&#xff0c;无需依赖云端服务&#xff0c;实现数据隐私保护与高效响应。本地自然语言处理 用户可通过 O…

作者头像 李华
网站建设 2026/6/9 0:32:43

零基础小白学习企业级 CI/CD 生态 详细教学大纲【20251127】001篇

文章目录 零基础小白学习企业级CI/CD生态 详细教学大纲 核心学习原则 整体学习路径(共8周,可按自身节奏调整) 阶段1:CI/CD核心概念扫盲(第1周) 阶段目标 每日学习任务(按5天规划) 推荐资源 阶段2:前置工具筑基(Git+Docker)(第2-3周) 第2周:Git核心入门 阶段目标 …

作者头像 李华
网站建设 2026/6/9 0:47:26

构建高可用AI系统:TensorFlow的企业级架构设计

构建高可用AI系统&#xff1a;TensorFlow的企业级架构设计 在金融风控模型每秒处理数万笔交易、医疗影像系统要求99.99%服务可用性的今天&#xff0c;AI早已不再是实验室里的“黑盒玩具”&#xff0c;而是企业核心业务链条中不可或缺的一环。这种转变带来了一个根本性挑战&…

作者头像 李华