立志成为一名优秀测试开发工程师(第七天)——unittest框架的学习

news2025/6/3 17:35:13

目录

unittest框架的学习

一、测试类的编写

创建相关测试类cal.py、CountTest.py 

二、常见断言方法

使用unittest单元测试框架编写测试用例CountTest.py 

注意:执行的时候光标一定要放在括号后面,鼠标右键运行

三、对测试环境的初始化和清除模块

四、创建测试套件

五、跳过测试和预期失败

六、测试报告的生成,使用HtmlTestRunner生成测试报告

1.安装HtmlTestRunner.py

2.基本使用方法

3.自定义报告样式

4.高级配置

5.注意事项


unittest框架的学习

unittest是python单元测试框架,是受到JUnit的启发,
与其他语言中的主流单元测试框架有着相似的风格。
其支持测试自动化,配置共享和关键代码测试。
支持将测试样例聚合到测试集中,并将测试与报告框架独立。
它不仅适用于单元测试,还在自动化测试领域占有一席之地。
借助它组织执行测试用例,使用它提供的丰富的断言方法
进行测试结果的比对,并结合HTMLTestRunner生成
测试报告完成整个自动化测试流程。
即:用代码测试代码

unittest是python内置的单元测试框架,不需要,直接导入使用即可 测试用例需要继承unittest.TestCase 属性该类的测试用例其实就是一个实例方法 该测试用例方法,就必须要使用test开头 

一、测试类的编写

cal.pyCountTest.py 展示了如何使用 Python 的 unittest 框架进行单元测试。以下是对代码结构和功能的详细说明:

创建被测类cal.py 

cal.py 定义了一个 count 类,包含基础的数学运算和随机选择功能:

class count:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def add(self):
        return self.a + self.b

    def Subtraction(self):
        return self.a - self.b

    def func(self):
        return self.a - self.b > 10  # 简化为直接返回布尔值

    def func2(self):
        names = ['张三', '李四', '王五', '皮蛋']
        return random.choice(names)

二、常见断言方法

使用unittest单元测试框架编写测试用例CountTest.py 

常见断言方法 assertEqual()  assertNotEqual() assertTrue()
assertEqual 如果两个值相等则测试通过
assertNotEqual 如果两个值不相等则测试通过
assertTrue()表达式结果是True,返回True

import unittest
from Day.day07.calc import count

class CountTest(unittest.TestCase):
    #测试加法
    def test_add(self):
        #类的实例化 类名加上()
        c1=count(4,5)
        #调用方法
        r=c1.add()
        #测试的本质是实际结果和需求结果的就比较
        #断言
        self.assertEqual(r,11)
        #测试减法
    def test_sub(self):
        #类的实例化
        c2=count(6,3)
        #调用减法
        r=c2.Subtraction()
        #断言
        self.assertEqual(r,3)
    def test_func1(self):
        c1=count(20,1)
        r=c1.func()
        self.assertTrue(r,msg="测试不通过")
    def test_names(self):
        c3=count(4,5)
        r=c3.func2()
        new_names=['张三','李四','王五','皮蛋','翠花','王峰','李思','花花','草草']
        self.assertIn(r,new_names,msg="不存在")
if __name__=='__main__':
    CountTest.main()

注意:执行的时候光标一定要放在括号后面,鼠标右键运行

运行结果:

三、对测试环境的初始化和清除模块

TestFixture 对测试环境的初始化和清除模块
测试用例以来的测试数据准备活动就可以在环境的初始化完成
初始化的时候加了什么,清除的时候就删什么
注意这两个名字一定要写对

模块级别>类级别>用例级别

from Day.day07.calc import count
import unittest

def setUpModule():
    print("________这是setUpModule_________")
def tearDownModule():
    print("—————————这是tearDownModule—————————")


class CountTest(unittest.TestCase):
#用例的执行顺序按照ASCII码表来进行
    @classmethod
    def setUpClass(cls)->None:
        print("———————这是setUpClass—————————")
    #每一个用例执行之前都要执行用例的初始化,用例执行之后,都要执行用例的清除
    #用例级别的初始化
    def setUp(self) -> None:
        print("——----这是setUp-------————")
    def tearDown(self) -> None:
        print("---------这是tearDown---------")
    #类级别的清除
    @classmethod
    def tearDownClass(cls) -> None:
        print("------这是tearDownClass--------")
    def test_names(self):
        c3=count(4,5)
        r=c3.func2()
        new_names=['张三','李四','王五','皮蛋','翠花','王峰','李思','花花','草草']
        print(new_names)
        self.assertIn(r,new_names,msg="不存在")
    def test_func(self):
        print("加油加油加油")
    def test_add(self):
        c2=count(2,8)
        r3=c2.add()
        self.assertEqual(r3,10)


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

四、创建测试套件

unittest提供了实现某紫于求的装饰器,在执行测试用例时每个装饰前面加@符号。

@unittest.skip(feason):无条件的跳过装饰的测试,说明跳过测试的原因

@unittest.skiplf(condition,reason):跳过装饰的测试,如果条件为真。

@unittest.skipUnless(condition,reason):跳过装饰的测试,除非条件为真。

@unittest.expectedFailure():测试标记为失败,不管执行结果是否失败,统一标记为失败,但不会抛出错误信息。

@unittest.expectedFailure #如果断言失败,不计入执行case数目中

方法1.通过addTest()加载TestCase到TestSuite中,用于少量的测试用例

#方法1.通过addTest()加载TestCase到TestSuite中,用于少量的测试用例
#创建测试套件
suite=unittest.TestSuite()
#给测试套件添加测试用例
#测试类类名+用例名字
suite.addTest(CountTest('test_add'))
suite.addTest(CountTest('test_names'))

#执行测试套件 TextTestRunner
#创建执行器
runner=unittest.TextTestRunner()
#使用上面那个创建的执行器,执行测试套件
runner.run(suite)
#执行用例之后显示一个'.'代表通过一个测试用例

执行用例之后显示一个'.'代表通过一个测试用例

方法2:同时添加多个测试用例进入到套件之中

#addTests可以接受一个列表
suite=unittest.TestSuite()
cases=[CountTest('test_names'),CountTest('test_add')]
suite.addTests(cases)

#生成执行器
runner=unittest.TextTestRunner()
runner.run(suite)

方法3:添加整个类的测试用例到套件中

suite=unittest.TestSuite()
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(CountTest))
#创建执行器
runner=unittest.TextTestRunner()
runner.run(suite)

方法四 模糊匹配 给套件指定需要执行的测试用例

#制定匹配规则,会自动生成测试套件,将用例添加进去
#加载路径
test_dir='../day07'
#名字不用写完,后面加上*
discover=unittest.defaultTestLoader.discover(start_dir=test_dir,pattern='Cou*.py')
#创建执行器
runner =unittest.TextTestRunner()

# #执行测试用例
runner.run(discover)

五、跳过测试和预期失败

对原有代码进行修改,加上相应注释,如下:

未显示“加油加油”这条用例内容,说明成功跳过,再做修改:

结果同上

结果同上

六、测试报告的生成,使用HtmlTestRunner生成测试报告

HtmlTestRunner是一个用于生成HTML格式测试报告的工具,可以方便地将unittest测试结果可视化。以下是如何使用HtmlTestRunner生成测试报告的方法。

借助HtmlTestRunner来生成,下载下来是一个.py文件
方式一、将下载的文件保存到...\python\lib目录下,不推荐
方式二、创建一个包,将py文件放进去就行了

1.安装HtmlTestRunner.py

通过网盘分享的文件:HTMLTestRunner.py
链接: https://pan.baidu.com/s/137-UO-ZDesn_bO_2c1NhGA 提取码: pz5q

2.基本使用方法

以下是一个完整的示例代码,展示了如何生成测试报告:

import os
import unittest
from common.HTMLTestRunner import HTMLTestRunner
import time

report_path = './report'

# 测试报告的标题
report_title = '冒烟测试'

# 测试的描述
report_desc = "对加减法功能的测试"

# 创建报告目录
if not os.path.exists(report_path):
    os.mkdir(report_path)

# 构建时间戳作为报告文件名
rtime = time.strftime("%Y%m%d%H%M%S")
filepath = os.path.join(report_path, f'report{rtime}.html')

# 发现测试用例
case_path = '../day07'
suite = unittest.defaultTestLoader.discover(start_dir=case_path, pattern="C*.py")

# 使用HTMLTestRunner运行测试并生成报告
with open(filepath, "wb") as f1:
    runner = HTMLTestRunner(
        stream=f1,
        title=report_title,
        description=report_desc
    )
    runner.run(suite)  # 这里要使用HTMLTestRunner的run方法,不是TextTestRunner
生成后能在我们提前建好的包中找到:

点击即可选择浏览器打开:

3.自定义报告样式

HtmlTestRunner允许自定义报告的样式和内容:

runner = HTMLTestRunner(
    output=report_path,
    report_name='custom_report',
    add_timestamp=False,
    combine_reports=True
)
4.高级配置

可以在测试用例中添加更多信息来丰富报告内容:

class TestMath(unittest.TestCase):
    """测试数学运算"""
    
    def test_addition(self):
        """测试加法"""
        self.assertEqual(1 + 1, 2)
        
    def test_subtraction(self):
        """测试减法"""
        self.assertEqual(3 - 1, 2)
5.注意事项
  • 确保测试用例的命名规范一致,便于discover方法查找
  • 报告路径需要有写入权限
  • 时间戳可以避免报告文件被覆盖
  • 测试用例中的docstring会显示在报告中

这种方法生成的HTML报告包含测试结果统计、详细测试步骤和错误信息,方便团队查看和分析测试结果。

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

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

相关文章

论坛系统(4)

用户详情 获取用户信息 实现逻辑 ⽤⼾提交请求,服务器根据是否传⼊Id参数决定返回哪个⽤⼾的详情 1. 不传⽤⼾Id,返回当前登录⽤⼾的详情(从session获取) 2. 传⼊⽤⼾Id,返回指定Id的⽤⼾详情(根据用户id去查) 俩种方式获得用户信息 参…

力扣面试150题--二叉树的层平均值

Day 54 题目描述 思路 初次做法(笨):使用两个队列,一个队列存放树的节点,一个队列存放对应节点的高度,使用x存放上一个节点,highb存放上一个节点的高度,sum存放当前层的节点值之和…

【Doris入门】Doris初识:分布式分析型数据库的核心价值与架构解析

目录 1 Doris简介与核心价值 2 Doris架构深度解析 2.1 Frontend(FE)架构 2.2 Backend(BE)架构 3 Doris核心概念详解 3.1 数据分布模型 3.2 Tablet与Replica 3.3 数据模型 4 Doris关键技术解析 4.1 存储引擎 4.2 查询执…

数据结构与算法学习笔记(Acwing 提高课)----动态规划·区间DP

数据结构与算法学习笔记----动态规划区间DP author: 明月清了个风 first publish time: 2025.5.26 ps⭐️区间DP的特征在于子结构一般是一个子区间上的问题,涉及到的问题也非常多,如环形区间,记录方案数,高精度,二维…

从0到1搭建AI绘画模型:Stable Diffusion微调全流程避坑指南

从0到1搭建AI绘画模型:Stable Diffusion微调全流程避坑指南 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 从0到1搭建AI绘画模型:Stable Diffusion微调全流程避坑指南摘要引言一、数据集构…

从一到无穷大 #46:探讨时序数据库Deduplicate与Compaction的设计权衡

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言Compaction AlgorithmsCompact Execution Flow Based On VeloxLocalMergeSource的…

vue3 导出excel

需求&#xff1a;导出自带格式的excel表格 1.自定义二维数组格式 导出 全部代码&#xff1a; <el-button click"exportExcel">导出</el-button> const exportExcel () > {const data [[商品, 单价, 数量, 总价],[A, 100, 1.55, { t: n, f: B2*C2…

day024-网络基础-TCP与UDP、DNS

文章目录 1. 李导推荐书籍2. OSI七层模型2.1 传输层2.2 网络层2.2.1 问&#xff1a;两端处于不同局域网的设备怎么网络通信&#xff1f; 2.3 数据链路层2.4 物理层2.5 图解OSI七层模型 3. 数据传输模式3.1 全双工3.2 半双工3.3 单工 4. TCP 3次握手4.1 抓包 5. TCP 4次挥手5.1 …

专场回顾 | 重新定义交互,智能硬件的未来设计

自2022年起&#xff0c;中国智能硬件行业呈现出蓬勃发展的态势&#xff0c;市场规模不断扩大。一个多月前&#xff0c;“小智AI”在短视频平台的爆火将智能硬件带向了大众视野&#xff0c;也意味着智能硬件已不再仅仅停留在概念和技术层面&#xff0c;而是加速迈向实际落地应用…

WPS 免登录解锁编辑

遇到 WPS 需要登录才能启用编辑功能&#xff1f; 如何免登录使用编辑功能&#xff1f; 方法一 解锁方法 1、关闭 WPS&#xff1b; 2、桌面右键→ “新建”→“文本文档”&#xff0c;粘贴以下内容&#xff08;见最下面&#xff09;&#xff1b;编码保持默认&#xff08;ANSI …

技术分享 | Oracle SQL优化案例一则

本文为墨天轮数据库管理服务团队第70期技术分享&#xff0c;内容原创&#xff0c;作者为技术顾问马奕璇&#xff0c;如需转载请联系小墨&#xff08;VX&#xff1a;modb666&#xff09;并注明来源。 一、问题概述 开发人员反映有条跑批语句在测试环境执行了很久都没结束&…

华为手机用的时间长了,提示手机电池性能下降,需要去换电池吗?平时要怎么用能让电池寿命长久一些?

华为手机提示电池性能下降时&#xff0c;是否需要更换电池以及如何延长电池寿命&#xff0c;取决于电池老化程度和使用习惯。以下是具体分析和建议&#xff1a; 一、是否需要更换电池&#xff1f; 电池健康度低于80% 如果手机提示“电池性能下降”&#xff0c;通常意味着电池…

BERT***

​​1.预训练&#xff08;Pre-training&#xff09;​​ 是深度学习中的一种训练策略&#xff0c;指在大规模无标注数据上预先训练模型&#xff0c;使其学习通用的特征表示&#xff0c;再通过​​微调&#xff08;Fine-tuning&#xff09;​​ 适配到具体任务 2.sentence-lev…

超级对话2:大跨界且大综合的学问融智学应用场景述评(不同第三方的回应)之二

摘要&#xff1a;《人机协同文明升维行动框架》提出以HIAICI/W公式推动认知革命&#xff0c;构建三大落地场景&#xff1a;1&#xff09;低成本认知增强神经接口实现300%学习效率提升&#xff1b;2&#xff09;全球学科活动化闪电战快速转化知识体系&#xff1b;3&#xff09;人…

深度学习常见实验问题与实验技巧

深度学习常见实验问题与实验技巧 有一定的先后顺序的 还在迷茫深度学习中的改进实验应该从哪里开始改起的同学&#xff0c;一定要进来看看了&#xff01;用自身经验给你推荐实验顺序&#xff01; YOLOV8-硬塞注意力机制&#xff1f;这样做没创新&#xff01;想知道注意力怎么…

一张Billing项目的流程图

流程图 工作记录 2016-11-11 序号 工作 相关人员 1 修改Payment Posted的导出。 Claim List的页面加了导出。 Historical Job 加了Applied的显示和详细。 郝 识别引擎监控 Ps (iCDA LOG :剔除了160篇ASG_BLANK之后的结果): LOG_File 20161110.txt BLANK_CDA/ALL 45/10…

理想树图书:以科技赋能教育,开启AI时代自主学习新范式

深耕教育沃土 构建全场景教辅产品矩阵 自2013年创立以来&#xff0c;理想树始终以教育匠心回应时代命题。在教辅行业这片竞争激烈的领域&#xff0c;由专业教育工作者组成的理想树图书始终秉持“知识互映”理念&#xff0c;经过十余年的精耕细作&#xff0c;精心打造了小学同步…

【大模型02】Deepseek使用和prompt工程

文章目录 DeepSeekDeepseek 的创新MLA &#xff08;低秩近似&#xff09; MOE 混合专家混合精度框架总结DeepSeek-V3 与 DeepSeek R1 DeepSeek 私有化部署算例市场&#xff1a; autoDLVllM 使用Ollma复习 API 调用deepseek-r1Prompt 提示词工程Prompt 实战设置API Keycot 示例p…

大学大模型教学:基于NC数据的全球气象可视化解决方案

引言 气象数据通常以NetCDF(Network Common Data Form)格式存储,这是一种广泛应用于科学数据存储的二进制文件格式。在大学气象学及相关专业的教学中,掌握如何读取、处理和可视化NC数据是一项重要技能。本文将详细介绍基于Python的NC数据处理与可视化解决方案,包含完整的代…

MediaMtx开源项目学习

这个博客主要记录MediaMtx开源项目学习记录,主要包括下载、推流(摄像头,MP4)、MediaMtx如何使用api去添加推流,最后自定义播放器,播放推流后的视频流,自定义Video播放器博客地址 1 下载 MediaMTX MediaMTX 提供了预编译的二进制文件,您可以从其 GitHub 页面下载: Gi…