Python 模块 ddt 数据驱动测试

news2024/12/23 12:38:05

简介

  • ddt 提供了一种方便的方法来实现数据驱动测试(Data-Driven Testing)。
  • 数据驱动测试是一种测试方法,通过将测试数据与测试逻辑分开,可以使用不同的数据集来运行相同的测试用例。这样可以提高测试的灵活性和可维护性,减少代码的重复编写。

                         

目录

1. 常用方法说明

2. 数据驱动测试

2.1. 基本结构介绍

2.2. 简单的使用方法

2.3. 读取csv文件测试

2.4. 读取Excel文件测试


                         

1. 常用方法说明

ddt.data(*args)

  • 装饰器,用于指定测试方法的数据来源。
  • *args 可以接受多个数据集,每个数据集会生成一个独立的测试用例。

                         

ddt.unpack(data)

  • 装饰器,用于解压数据集。
  • 通常与 ddt.data(*args) 一起使用,将传入的数据集解压为多个参数,以便用于测试方法的参数化调用。

                         

ddt.file_data(file_path)

  • 装饰器,用于读取文件中的测试数据。
  • file_path 参数指定要读取的文件路径,文件可以是CSV、Excel等格式。

                         

                         

2. 数据驱动测试

2.1. 基本结构介绍

1、ddt 用于数据驱动,测试还需要导入 unittest 模块

import ddt
import unittest

                         

2、创建一个继承自测试框架的类(使用 @ddt.ddt 装饰器来标记该类为数据驱动测试类)

@ddt.ddt
class MyDataDrivenTest(unittest.TestCase):
    print("测试方法1")
    print("测试方法2")
    print("测试方法3")

                         

3、测试方法中,使用 @ddt.data 装饰器来指定测试数据集

'''指定多个数据作为测试用例'''
@ddt.data((1, 2), (3, 6), (4, 8))  
'''解压缩数据元组'''
@ddt.unpack
'''定义测试方法'''
def test_example(self, input_data, expected_result):
    # 运行另一个测试函数(test_func),代入输入数据,并返回结果
    result = test_func(input_data)  
    # 对返回结果断言(预期为指定的预期结果)
    self.assertEqual(result, expected_result)  

                         

4、执行数据驱动测试

if __name__ == '__main__':
    unittest.main()

                         

2.2. 简单的使用方法

通过 ddt.data 传入数据,测试方法根据数据个数依次调度,通过预期和实际结果进行断言。

import unittest
import ddt

'''继承自测试的框架,定义为数据驱动类'''
@ddt.ddt
class MyDataDrivenTest(unittest.TestCase):
    # 准备驱动数据 ([输入,预期] , [输入,预期]...)
    @ddt.data([1, 2], [2, 4], [3, 6])
    @ddt.unpack     # 解压数据
    def test_func1(self, input, expect):
        # 简单的测试方法
        result = input * 2
        # 打印数据信息
        print(f'输入数据:{input},输出数据:{result},预期结果:{expect}')
        # 断言输出数据和预期结果
        self.assertEqual(result, expect)

if __name__ == '__main__':
    unittest.main()     # 执行

注意:这里的 result = input * 2 只是一个简单的测试方法,一般对于实际场景会把这里改成一个专门的测试函数。

例如:测试Linux某个目录下有多少文件,则将输入数据定义为路径,预期结果定义为文件数量。通过一个专门的方法去获取文件数据,则 result = get_filenum(input) 通过 get_filenum 去获取文件数量,再将返回结果断言。

举一个异常的输出例子

                         

2.3. 读取csv文件测试

csv文件内容如下

 

                          

ddt.file_data 方法可以直接读取文件,但是打开文件出错,没有找到解决的方法。

使用 csv 模块自己封装一个读取文件的方法。

import csv

file_path = r'E:\test.csv'

def get_csv(file):
    '''定义一个读取csv文件内容的方法'''
    with open(file, encoding='utf-8') as f:
        # 创建读取对象
        csv_reader = csv.reader(f)
        # 跳过第一行(next() 函数用于获取迭代器的下一个元素)
        next(csv_reader)
        # 将文件内容赋值给变量
        csv_value = [v for v in csv_reader]
    # 返回结果
    return csv_value

'''调用方法'''
result = get_csv(file_path)
print(result)

结果如下

                         

套入方法,执行测试

import ddt
import csv
import unittest

# 指定测试文件路径
file_path = r'E:\test.csv'

def multiplication(input_data):
    '''定义一个测试方法,这里的名称不能以test开头,否则会被读取为框架方法'''
    return input_data * 2

def get_csv(file):
    '''定义一个读取csv文件内容的方法'''
    with open(file, encoding='utf-8') as f:
        csv_reader = csv.reader(f)
        next(csv_reader)
        csv_value = [v for v in csv_reader]
    return csv_value

@ddt.ddt
class MyDataDrivenTest(unittest.TestCase):
    '''封装一个数据驱动测试框架'''
    # 获取csv文件内容
    csv_data = get_csv(file_path)

    # 将内容当做数据传入驱动
    @ddt.data(*csv_data)
    @ddt.unpack     # 解压数据
    def test_func(self, *test_data):
        # 读取传入的两个数据
        input,expect = test_data
        # 因为测试方法是计算,将结果转换为int类型
        input = int(input); expect = int(expect)

        # 执行测试,将返回结果赋值
        result = multiplication(input)

        # 打印测试信息
        print(f'输入数据:{input},输出数据:{result},预期结果:{expect}')

        # 断言输出数据和预期结果
        self.assertEqual(result, expect)

if __name__ == '__main__':
    unittest.main()

输出结果

                         

2.4. 读取Excel文件测试

Excel 文件内容如下

                         

通过 openpyxl 去读取数据(不读第1行)

import openpyxl

file_path = r'E:\test.xlsx'

def get_excel(file):
    '''定义一个读取Excel文件内容的方法'''
    # 打开文件
    wb = openpyxl.load_workbook(file)
    # 指定工作表
    wb_sheet = wb['Sheet1']
    # 指定读取行、列(行:第2-最大行,列:第1-2列)
    wb_data = wb_sheet.iter_rows(min_row=2, min_col=1, max_col=2, values_only=True)
    # 通过行去遍历列的值(不需要手动关闭文件,load_workbook()自动关闭)
    return [i for i in wb_data]

'''调用方法'''
result = get_excel(file_path)
print(result)

结果如下

                         

套入方法,执行测试

import ddt
import openpyxl
import unittest

# 指定测试文件路径
file_path = r'E:\test.xlsx'

def get_excel(file):
    '''定义一个读取Excel文件内容的方法'''
    wb = openpyxl.load_workbook(file)
    wb_sheet = wb['Sheet1']
    wb_data = wb_sheet.iter_rows(min_row=2, min_col=1, max_col=2, values_only=True)
    return [i for i in wb_data]

@ddt.ddt
class TestExcel(unittest.TestCase):
    '''封装一个数据驱动的测试框架'''
    # 读取Excel文件数据
    excel_data = get_excel(file_path)

    # 将数据传入驱动
    @ddt.data(*excel_data)
    @ddt.unpack
    def test_func(self, *test_data):
        # 仅设定了2列数据,所以结果只需要2个
        input,expect = test_data
        # 输出获取到的结果
        print(f'input:{input},expect:{expect}')
        # 执行测试、断言
        pass

if __name__ == '__main__':
    unittest.main()

结果如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/779450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL SERVER ANALYSIS SERVICES决策树、聚类、关联规则挖掘分析电商购物网站的用户行为数据...

全文链接:http://tecdat.cn/?p32118 假如你有一个购物类的网站,那么你如何给你的客户来推荐产品呢?(点击文末“阅读原文”获取完整文档、数据) 相关视频 这个功能在很多电商类网站都有,那么,通…

Flink CEP (一)原理及概念

目录 1.Flink CEP 原理 2.Flink API开发 2.1 模式 pattern 2.2 模式 pattern属性 2.3 模式间的关系 1.Flink CEP 原理 Flink CEP内部是用NFA(非确定有限自动机)来实现的,由点和边组成的一个状态图,以一个初始状态作为起点&am…

Unity进阶-消息框架的理论知识与实际操作学习笔记

文章目录 Unity进阶-消息框架的理论知识与实际操作学习笔记 Unity进阶-消息框架的理论知识与实际操作学习笔记 笔记来源课程:https://study.163.com/course/courseMain.htm?courseId1212756805&_trace_c_p_k2_8c8d7393c43b400d89ae94ab037586fc 这种框架其实…

实现锂电池形状的数据可视化css+js

1.效果图 2.需求根据后端返回数据改变里面的高度 HTML&#xff1a; <div class"dianchichi"><div class"limian" id"divElementId"></div></div> css: .dianchichi {width: 84px;height: 146px;display: flex;justify-…

Two Days wpf 分享 分页组件

迟来的wpf分享。 目录 一、序言 二、前期准备 三、前端界面 四、后台代码部分 1、先定义些变量后面使用 2、先是按钮事件代码。 首页按钮 上一页按钮 下一页按钮 末尾按钮 画每页显示等数据 每页显示多少条 判断是否为数字的事件 分页数字的点击触发事件 跳转到…

Docker安装Nexus并配置Maven私服

1 准备工作 1 服务器已安装docker, docker各命令无报错 2 通过dockerhub查看nexus的版本信息&#xff0c;此次使用的镜像为&#xff1a;sonatype/nexus3&#xff0c;可以看到latest版本更前的的是3.58.0&#xff0c;我们这次就使用这个版本的nexus3. 2 开始安装 # 下载镜像 do…

springcloudAlibaba之springboot如何加载nacos配置文件

配置文件想必大家都很熟悉&#xff0c;无论什么架构 都离不开配置&#xff0c;虽然spring boot已经大大简化了配置&#xff0c;但如果服务很多 环境也好几个&#xff0c;管理配置起来还是很麻烦&#xff0c;并且每次改完配置都需要重启服务&#xff0c;nacos config出现就解决了…

【JavaEE】Servlet常用的API

目录 前言 一、HttpServlet类 1、Servlet的生命周期 ✨tomcat的两个端口 ✨设置告诉浏览器使用那种字符集解析响应 ✨Java中Unicode和utf8字符集的使用 二、HttpServletRequest类 1、获取请求的信息 2、 前端给后端传递数据的三种方式 2.1、通过query string传递 2.2…

unity--2d( A*寻路)

目录 一.网格式寻路 1.创建一个A*寻路脚本&#xff0c;命名为"AStarPathfinding.cs"。 2.创建一个人物控制的脚本&#xff0c;命名为"CharacterController2D.cs"。 3.创建一个游戏管理脚本&#xff0c;命名为"GameManager.cs"。 二.UGUI下的…

《零基础入门学习Python》第063讲:论一只爬虫的自我修养11:Scrapy框架之初窥门径

上一节课我们好不容易装好了 Scrapy&#xff0c;今天我们就来学习如何用好它&#xff0c;有些同学可能会有些疑惑&#xff0c;既然我们懂得了Python编写爬虫的技巧&#xff0c;那要这个所谓的爬虫框架又有什么用呢&#xff1f;其实啊&#xff0c;你懂得Python写爬虫的代码&…

基于半监督算法的工业图像缺陷检测方法:MemSeg

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文&#xff1a;https://arxiv.org/ftp/arxiv/papers/2205/2205.00908.pdf 代码&#xff1a;https://github.com/TooTouch/MemSeg 主要贡献 提出了一个精心设计的异常模拟策略&#xff0c;用于模型的自监督…

缓存雪崩问题及解决思路

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。为了解决这个问题&#xff0c;我们可以采取以下几种方案。 1. 给不同的Key的TTL添加随机值 在设置缓存的过期时间&#xff08;TTL&#xff09;时…

PhpStudy靶场首页管理

PhpStudy靶场首页管理 一、源码一二、源码二三、源码三四、源码四 一、源码一 index.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>靶场访问首页</title><style>body {background-color: #f2f2f2;colo…

一个月学通Python(二十三):RESTful架构和DRF入门

专栏介绍 结合自身经验和内部资料总结的Python教程&#xff0c;每天3-5章&#xff0c;最短1个月就能全方位的完成Python的学习并进行实战开发&#xff0c;学完了定能成为大佬&#xff01;加油吧&#xff01;卷起来&#xff01; 全部文章请访问专栏&#xff1a;《Python全栈教…

【字符流】案例:集合到文件(改进版)

案例&#xff1a;集合到文件&#xff08;改进版&#xff09; 1.需求&#xff1a; 把ArrayList集合中的学生数据写入到文本文件。要求&#xff1a;每一个学生对象的数据作为文件中的一行数据 ​ 格式&#xff1a;学号&#xff0c;姓名&#xff0c;年龄&#xff0c;居住地 2.思…

python与深度学习(五):CNN和手写数字识别

目录 1. 说明2. 卷积运算3. 填充4. 池化5. 卷积神经网络实战-手写数字识别的CNN模型5.1 导入相关库5.2 加载数据5.3 数据预处理5.4 数据处理5.5 构建网络模型5.6 模型编译5.7 模型训练、保存和评价5.8 模型测试5.9 模型训练结果的可视化 6. 手写数字识别的CNN模型可视化结果图7…

HideSeeker论文阅读

文章目录 3.1 Overview of Our System HideSeeker3.2 Visual Information Extraction3.3 Relation Graph Learning3.4 Hidden Object Inference 4 EVALUATIONS4.7 Summary 6 DISCUSSIONS AND CONCLUSION 3.1 Overview of Our System HideSeeker 我们设计了一种名为“HideSeeke…

【Selenium+Pytest+allure报告生成自动化测试框架】附带项目源码和项目部署文档

目录 前言 【文章末尾给大家留下了大量的福利】 测试框架简介 首先管理时间 添加配置文件 conf.py config.ini 读取配置文件 记录操作日志 简单理解POM模型 简单学习元素定位 管理页面元素 封装Selenium基类 创建页面对象 简单了解Pytest pytest.ini 编写测试…

保护数字世界的壁垒

随着科技的不断发展和互联网的普及&#xff0c;我们的生活日益依赖于数字化的世界。然而&#xff0c;随之而来的是网络安全威胁的不断增加。网络攻击、数据泄露和身份盗窃等问题已经成为我们所面临的现实。因此&#xff0c;网络安全变得尤为重要&#xff0c;我们需要采取措施来…

MySQL常见的几种约束

系列文章目录 后续补充 文章目录 系列文章目录前言一、主键约束二、非空约束三、唯一约束四、检查约束五、默认值约束六、字段值自动增加约束七、外键约束总结 前言 为防止不符合规范的数据存入数据库&#xff0c;在用户对数据进行插入、修改、删除等操作时&#xff0c;MySQL提…