详细分析Python中的unittest测试框架

目录

  • 1. 基本知识
  • 2. API
    • 2.1 断言
    • 2.2 setUp() 和 tearDown()
  • 3. Demo

1. 基本知识

unittest 是 Python 标准库中的一个单元测试框架,用于编写和执行测试用例以验证代码的正确性

提供了一种结构化的方法来编写测试,使得测试代码更加模块化和易于维护

以下是对 unittest 的详细分析和示例:

概念:

  • 测试用例(Test Case):测试代码的最小单元,通常对应于要测试的函数、方法或类的特定行为或功能
    测试用例是独立的,不依赖于其他测试用例的执行顺序

  • 测试套件(Test Suite):一组相关的测试用例的集合
    可以使用测试套件来组织和运行一系列相关的测试

  • 测试运行器(Test Runner):用于执行测试用例或测试套件的组件
    unittest 提供了一个默认的测试运行器来运行测试

  • 断言(Assertion):在测试用例中用于判断实际结果与预期结果是否相符的表达式
    如果断言失败,测试用例将会失败

  • 设置(Setup)和清理(Teardown):在执行测试用例之前或之后执行的代码
    使用 setUp() 方法在每个测试用例执行前进行设置操作
    使用 tearDown() 方法在每个测试用例执行后进行清理操作

作用:

  • 自动化测试:通过编写测试用例,可以自动化地验证代码的正确性,提高代码的质量和稳定性
  • 回归测试:在修改或更新代码后,可以运行测试用例来确保修改不会破坏现有功能
  • 文档化:测试用例也可以作为代码的文档,说明每个函数或方法应该如何被正确使用

2. API

在编写单元测试时,通常会遵循一些规范和最佳实践,以确保测试的可读性、可维护性和准确性

以下是一些常见的单元测试规范要求:

  1. 测试用例命名规范:测试用例的命名应该清晰明了,描述被测试函数或方法的行为
    通常采用test_<functionality>的命名方式,例如test_add_positive_numberstest_add_negative_numbers

  2. 测试用例设计完整性:每个测试用例应该独立、完整地测试一个特定的行为或情况
    不要在一个测试用例中测试多个不相关的行为

  3. 测试用例覆盖率:尽可能覆盖被测试代码的各种情况,包括边界情况、异常情况等

  4. 断言选择:选择适当的断言来验证测试结果
    常见的断言包括assertEqualassertTrueassertFalse

  5. 测试组织结构:通常测试用例会被组织成一个测试类,每个测试方法对应一个测试用例
    在Python中,通常使用unittest模块来实现单元测试,可以通过继承unittest.TestCase来创建测试类

2.1 断言

以下是几个常见的断言及其使用方式:

  • assertEqual(expected, actual):用于验证预期值和实际值是否相等
import unittestclass TestExample(unittest.TestCase):def test_addition(self):result = 2 + 2self.assertEqual(result, 4)if __name__ == '__main__':unittest.main()
  • assertTrue(condition):用于验证条件是否为True
import unittestclass TestExample(unittest.TestCase):def test_positive_number(self):result = 10self.assertTrue(result > 0)if __name__ == '__main__':unittest.main()
  • assertFalse(condition):用于验证条件是否为False
import unittestclass TestExample(unittest.TestCase):def test_negative_number(self):result = -10self.assertFalse(result > 0)if __name__ == '__main__':unittest.main()
  • assertRaises(exception, callable, *args, **kwargs):用于验证是否会引发特定的异常
import unittestdef divide(x, y):return x / yclass TestExample(unittest.TestCase):def test_divide_by_zero(self):with self.assertRaises(ZeroDivisionError):divide(1, 0)if __name__ == '__main__':unittest.main()

这些断言方法之间的区别在于它们用于验证的条件以及验证的方式

  • assertEqual用于检查值是否相等
  • assertTrueassertFalse用于检查条件是否为True或False
  • assertRaises用于验证是否引发了特定的异常

在编写单元测试时,根据需要选择最适合场景的断言方法,以确保测试的准确性和可读性

2.2 setUp() 和 tearDown()

setUp()tearDown()unittest框架中的两个特殊方法,用于在测试用例执行前后进行设置和清理操作

它们的作用是确保测试用例在独立的环境中执行,从而保证测试的可靠性和可重复性

  • setUp()
    ~ 在每个测试用例执行前进行设置操作,例如初始化对象、创建临时文件或者建立数据库连接等
    ~ 这个方法可以在测试用例的每次执行前,提供一个统一的环境,以确保测试用例在相同的初始条件下执行。如果测试用例需要共享一些设置,setUp() 是一个很好的地方来定义它们,这样可以避免在每个测试用例中重复代码
  • tearDown()
    ~ 在每个测试用例执行后进行清理操作,例如关闭文件、释放资源或者关闭数据库连接等
    ~ 可以确保在测试用例执行后,环境得到适当的清理,以避免测试用例之间的相互影响。如果在 setUp() 中进行了一些设置,需要在 tearDown() 中进行相应的清理,以确保环境的恢复

示例代码:

import unittestclass MyTestCase(unittest.TestCase):def setUp(self):# 设置操作,例如初始化对象self.my_list = [1, 2, 3]def tearDown(self):# 清理操作,例如释放资源del self.my_listdef test_list_append(self):self.my_list.append(4)self.assertEqual(self.my_list, [1, 2, 3, 4])def test_list_remove(self):self.my_list.remove(2)self.assertEqual(self.my_list, [1, 3])if __name__ == '__main__':unittest.main()
  • setUp() 方法用于在每个测试用例执行前初始化了一个列表 self.my_list
  • tearDown() 方法用于在每个测试用例执行后清理了这个列表

两个测试方法 test_list_append()test_list_remove() 分别对这个列表执行了添加和删除操作,并通过断言来验证操作的正确性
setUp()tearDown() 方法确保了每个测试方法在独立的环境中执行,不会相互影响。

3. Demo

通过简易的Demo熟悉这个库的基本用法

import unittestdef add(x, y):return x + yclass TestAddFunction(unittest.TestCase):def test_add_positive_numbers(self):self.assertEqual(add(1, 2), 3)self.assertEqual(add(0, 0), 0)self.assertEqual(add(-1, 1), 0)def test_add_negative_numbers(self):self.assertEqual(add(-1, -1), -2)self.assertEqual(add(-5, -7), -12)if __name__ == '__main__':unittest.main()

截图如下:

在这里插入图片描述

对应如果修改某个参数,让程序报错,截图如下:

在这里插入图片描述

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

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

相关文章

【ACW 服务端】页面操作Java增删改查代码生成

版本: 1.2.2-JDK17-SNAPSHOT 项目地址&#xff1a;wu-smart-acw 演示地址&#xff1a;演示地址 admin/admin Java增删改查代码生成 找到对应菜单 选择你需要的数据实例 选择数据库 选择数据库表 选择客户端&#xff08;如果是本地ACW服务代码启动默认注册上的客户端ID是…

腾讯云主机Ubuntu22.04安装Odoo17

一、安装PostgreSQL16 参见之前的文章 Ubuntu22.04安装PostgreSQL-CSDN博客 二、安装Odoo17 本方案使用的nightly版的odoo&#xff0c;安装的都是最新版odoo wget -O - https://nightly.odoo.com/odoo.key | apt-key add - echo "deb http://nightly.odoo.com/17.0/n…

Maven【1】(命令行操作)

文章目录 一丶创建maven工程二、理解pom.xml三、maven的构建命令1.编译操作2.清理操作3.测试操作4.打包操作5.安装操作 一丶创建maven工程 首先创建这样一个目录&#xff0c;然后从命令行里进入这个目录&#xff1a; 然后接下来就在这个命令行里进行操作了。 这个命令是&…

Python学习笔记——PySide6设计GUI应用之UI与逻辑分离

1、打开PySide6的UI设计工具pyside6-designer&#xff0c;设计一个主窗口&#xff0c;保存文件名为testwindow.ui 2、使用PySide6的RCC工具把testwindow.ui文件转换为testwindow_rc.py文件&#xff0c;此文件中有一个类Ui_MainWindow&#xff08;包含各种控件对象&#xff09;…

设计模式浅析(八) ·外观模式

设计模式浅析(八) 外观模式 日常叨逼叨 java设计模式浅析&#xff0c;如果觉得对你有帮助&#xff0c;记得一键三连&#xff0c;谢谢各位观众老爷&#x1f601;&#x1f601; 外观模式 概念 外观模式&#xff08;Facade Pattern&#xff09;是一种设计模式&#xff0c;它为…

深度学习发展里程碑事件2006-2024

2006-2024年&#xff0c;深度学习发展经历众多的里程碑事件&#xff0c;一次次地刺激着人们的神经&#xff0c;带来巨大的兴奋。电影还在继续&#xff0c;好戏在后面&#xff0c;期待…… 2006年 深度信念网络&#xff08;DBNs&#xff09;&#xff1a;Geoffrey Hinton与他的学…

备战蓝桥杯 Day10(背包dp)

01背包问题 1267&#xff1a;【例9.11】01背包问题 【题目描述】 一个旅行者有一个最多能装 M&#xfffd; 公斤的背包&#xff0c;现在有 n&#xfffd; 件物品&#xff0c;它们的重量分别是W1&#xff0c;W2&#xff0c;...,Wn&#xfffd;1&#xff0c;&#xfffd;2&#…

蓝桥杯刷题--python-10(2023填空题3)

0工作时长 - 蓝桥云课 (lanqiao.cn) import datetime time_str_list=[] while(True):tmp=input()if not tmp: breaktime_str_list.append(tmp)# time_list=[datetime.datetime.strptime(t,"%Y-%m-%d %H:%M:%S")for t in time_str_list] time_list.sort() sum=0 for i…

【代码随想录算法训练营Day25】● 216.组合总和III ● 17.电话号码的字母组合

文章目录 Day 25 第七章 回溯算法part02216.组合总和III自己的思路&#xff08;✅通过&#xff09; 17.电话号码的字母组合思路代码 Day 25 第七章 回溯算法part02 今日内容&#xff1a; ● 216.组合总和III● 17.电话号码的字母组合 216.组合总和III 如果把 组合问题理解了…

计算机组成原理(9)----硬布线控制器

控制单元CU若想发出对应的控制信号&#xff0c;则需要以下信息&#xff1a;指令操作码&#xff0c;目前的机器周期&#xff0c;节拍信号&#xff0c;机器状态条件&#xff0c;根据这些信息&#xff0c;CU就能确定在这个节拍下应该发出哪些"微命令"&#xff0c;也就是…

SQL注入:使用预编译防御SQL注入时产生的问题

目录 前言 模拟预编译 真正的预编译 预编译中存在的SQL注入 宽字节 没有进行参数绑定 无法预编译的位置 前言 相信学习过SQL注入的小伙伴都知道防御SQL注入最好的方法&#xff0c;就是使用预编译也就是PDO是可以非常好的防御SQL注入的&#xff0c;但是如果错误的设置了…

计算机设计大赛 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

从零学算法238

238.给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复…

Python自动化UI测试之Selenium基础实操

1. Selenium简介 Selenium 是一个用于 Web 应用程序测试的工具。最初是为网站自动化测试而开发的&#xff0c;可以直接运行在浏览器上&#xff0c;支持的浏览器包括 IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Googl…

SVN忽略已提交的文件(ignore,移出版本控制)

本文适用于已安装TortoiseSVN客户端的同学。 1、右键点击要忽略的文件夹或文件&#xff0c;鼠标移到“TortoiseSVN”&#xff0c;找到“Unversion and add to ignore list”&#xff0c;选择文件夹&#xff0c;弹出提示框确认忽略。 2、设置完忽略文件后&#xff0c;还需要做…

多维时序 | Matlab实现GRU-MATT门控循环单元融合多头注意力多变量时间序列预测模型

多维时序 | Matlab实现GRU-MATT门控循环单元融合多头注意力多变量时间序列预测模型 目录 多维时序 | Matlab实现GRU-MATT门控循环单元融合多头注意力多变量时间序列预测模型预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.多维时序 | Matlab实现GRU-MATT门控循环单元融…

【Maven】介绍、下载及安装、集成IDEA

目录 一、什么是Maven Maven的作用 Maven模型 Maven仓库 二、下载及安装 三、IDEA集成Maven 1、POM配置详解 2、配置Maven环境 局部配置 全局设置 四、创建Maven项目 五、Maven坐标详解 六、导入Maven项目 方式1&#xff1a;使用Maven面板&#xff0c;快速导入项目 …

React Native框架开发介绍,以及其优点

大家好&#xff0c;我是咕噜铁蛋&#xff0c;在今天的文章中&#xff0c;我通过科技手段和大家一起探讨一下React Native框架的开发介绍以及其优点。我深知选择合适的开发工具对于项目的成功至关重要。而React Native作为一款流行的跨平台移动应用开发框架&#xff0c;其独特之…

Linux并发与竞争的基本概念

一. 简介 Linux是一个多任务操作系统&#xff0c;肯定会存在多个任务共同操作同一段内存或者设备的情况&#xff0c; 多个任务甚至中断都能访问的资源叫做共享资源&#xff0c;在驱动开发中要注意对共享资源的保护&#xff0c;也就是要处理对共享资源的并发访问。比如&#xf…

【服务器数据恢复】FreeNAS+ESXi虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器通过FreeNAS&#xff08;本案例使用的是UFS2文件系统&#xff09;实现iSCSI存储&#xff0c;整个UFS2文件系统作为一个文件挂载到ESXi虚拟化系统&#xff08;安装在另外2台服务器上&#xff09;上。该虚拟化系统一共有5台虚拟机&…