【Python单元测试】学习笔记1
文章目录
- 01-单元测试基础
- 什么是单元测试
- 常用的文件结构
- 运行单元测试
- 02. 断言函数
- 03. Test Fixtures
- 什么是Test Fixtures
- 模块级别的Fixtures
- 类级别的Fixtures
- 方法级别的Fixtures
- 04.Mock
python单元测试学习笔记1:https://blog.csdn.net/qq_42761751/article/details/141144477?spm=1001.2014.3001.5501
python单元测试学习笔记2 :https://blog.csdn.net/qq_42761751/article/details/141202123?spm=1001.2014.3001.5501
python单元测试学习笔记3 : https://blog.csdn.net/qq_42761751/article/details/141233236?spm=1001.2014.3001.5501
01-单元测试基础
- 什么是单元测试
- 常用的文件结构
- 编写第一个单元测试
- 运行单元测试
什么是单元测试
单元测试是指一个自动化的测试:
- 用来验证一小段代码(单元)的正确性,例如只测试某个函数写的是否正确
- 可以快速执行
- 在独立的环境中执行
常用的文件结构

myprj是项目代码目录tests是单元测试代码目录,一般来说测试代码与项目代码文件目录结构一样- 在
tests/basic中test_calculator.py必须以test_开头,因为测试的工具会寻找所有以test开头的文件,把他们当作单元测试文件运行,这算是一个规范
运行单元测试
myprj.basic中calculator.py代码:
class Calculator:def add(self, *args):res = 0for n in args:res += nreturn res
tests.basic中test_calculator.py代码:
import unittest
from myprj.basic.calculator import Calculator
"""文件要用"test_"开头测试类名要用"Test"开头
"""
class TestCalculator(unittest.TestCase):def test_add(self):"""测试类方法必须用"test_"开头通常分为三部分:setupactionassert"""# setupcal = Calculator()excepted_result = 10 # 期望输出为10# actionactual_result = cal.add(2,3,5)# assert 判断执行结果与期望结果是否相等,如果不相等,则测试失败# 说明代码有问题self.assertEqual(excepted_result, actual_result)
为了方便的运行测试:
pip install nose
pip install coverage# 运行一个测试文件
python -m unittest -v tests.basic.test_calculator
# 运行所有测试文件
nosetests --with-doctest -v tests/basic/
# 统计测试覆盖率
nosetests --with-coverage --cover-erase -v tests/
也可以使用pytest:
pytest --doctest-modules tests/
02. 断言函数
常用断言函数:

03. Test Fixtures
- 什么是Test Fixtures
- 模块级别的Fixtures
- 类级别的Fixtures
- 方法级别的Fixtures
什么是Test Fixtures
在测试之前或者之后执行的函数或者方法被称之为Test Fixtures
比如:在测试前需要先连接数据库,在测试后需要断开与数据建库的连接
模块级别的Fixtures
setUpModule() 在整个模块执行之前需要执行的函数
tearDownModule() 在整个模块执行结束之后需要执行的函数
import unittest
from myprj.fixtures.bank_account import BankAccountdef setUpModule():print("calling setUpModule")def tearDownModule():print("calling tearDownModule")class TestBankAccount(unittest.TestCase):def test_deposit_success(self):bank_account = BankAccount(0)bank_account.deposit(10)self.assertEqual(10, bank_account.balance)def test_withdraw_success(self):bank_account = BankAccount(10)bank_account.withdraw(10)self.assertEqual(0, bank_account.balance)
上述代码中,当单独执行test_deposit_success 与test_withdraw_success时候,代码会自动执行setUpModule 与 tearDownModule.
当执行TestBankAccount进行测试时,虽然有两个测试用例,但是setUpModule 与 tearDownModule只会执行一次
类级别的Fixtures
setUpClass() 在整类执行之前需要执行的函数
tearDownClass() 在整个类执行结束之后需要执行的函数
import unittest
from myprj.fixtures.bank_account import BankAccountdef setUpModule():print("calling setUpModule")def tearDownModule():print("calling tearDownModule")class TestBankAccount(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:print("calling setUpClass")@classmethoddef tearDownClass(cls) -> None:print("calling tearDownClass")def test_deposit_success(self):bank_account = BankAccount(0)bank_account.deposit(10)self.assertEqual(10, bank_account.balance)def test_withdraw_success(self):bank_account = BankAccount(10)bank_account.withdraw(10)self.assertEqual(0, bank_account.balance)
方法级别的Fixtures
setUp() 在任何一个方法执行之前都会被执行
tearDown()
import unittest
from myprj.fixtures.bank_account import BankAccountclass TestBankAccount(unittest.TestCase):def setUp(self) -> None:'''每一个类方法都要新建一个对象在任何一个方法执行之前都会执行'''print("calling setUp")self.bank_account = BankAccount(10)def tearDown(self) -> None:print("calling tearDown")self.bank_account = Nonedef test_deposit_success(self):self.bank_account.deposit(10)self.assertEqual(20, self.bank_account.balance)def test_withdraw_success(self):self.bank_account.withdraw(10)self.assertEqual(0, self.bank_account.balance)
04.Mock
- 什么是Mock
- Mock和MagicMock
- Mock实例
本文参考:
https://www.bilibili.com/video/BV1SP4y1D7Wd/?spm_id_from=333.999.0.0
相关文章:
【Python单元测试】学习笔记1
文章目录 01-单元测试基础什么是单元测试常用的文件结构运行单元测试 02. 断言函数03. Test Fixtures什么是Test Fixtures模块级别的Fixtures类级别的Fixtures方法级别的Fixtures 04.Mock python单元测试学习笔记1:https://blog.csdn.net/qq_42761751/article/detai…...
NVDLA专题10:具体模块介绍——Planar Data Processor
概述 平面数据处理器(Planar Data Processor, PDP)沿宽x高的前两个维度平面执行操作,在NVDLA版中,PDPD旨在实现池化层,module定义在NV_NVDLA_pdp.v。支持最大、最小和平均池化方法。平面内的几个相邻输入元素将被发送到非线性函数来计算一个…...
面向财商人群的AI垂直产品 —— AI股票助手
在数字化转型的大潮中,AI技术正在重塑各行各业,尤其是金融市场。对于那些渴望在瞬息万变的股市中保持敏锐洞察力的金融分析师、投资者及股票爱好者来说,一款强大而智能的工具显得尤为重要。今天,我们将向大家介绍一款专为财商人群打造的AI垂直产品——AI股票助手。 一、产…...
玩AI第二步——python 环境安装
python 环境安装 前言 通常,我们会直接去python官网下载一个安装包直接安装即可. 但是这样很不好,总不能把所有版本的python都安装一遍 所以,这里安装minconda,是一个轻量级的Python环境管理工具,仅包括conda、Python及其所需的基本依赖库。因此,它的…...
【图解秒杀系列】秒杀技术点——静态化
【图解秒杀系列】秒杀技术点——静态化 什么是静态化、静态化的作用如何实现静态化FreeMarker、Thymleaf处理流程问题 OpenResty Lualua_shared_dict & lua-resty-template处理流程具体操作 什么是静态化、静态化的作用 静态化就是指通过某种静态化技术,将原本…...
Simple RPC - 05 从零开始设计一个客户端(下)_ 依赖倒置和SPI
文章目录 Pre概述依赖倒置原则与解耦设计与实现1. 定义接口来隔离调用方与实现类2. 实现类DynamicStubFactory3. 调用方与实现类的解耦 依赖注入与SPI的解耦依赖注入SPI(Service Provider Interface) 总结 Pre Simple RPC - 01 框架原理及总体架构初探 …...
2024新型数字政府综合解决方案(三)
新型数字政府综合解决方案通过融合人工智能、大数据和云计算技术,建立了一个智能化、互联互通的政府服务平台,旨在提升政府服务效率与透明度。该方案通过全面数字化政务流程,实现数据的实时共享和自动化处理,使公众能够便捷地访问…...
计算机毕业设计hadoop+spark+hive知识图谱音乐推荐系统 音乐数据分析可视化大屏 音乐爬虫 LSTM情感分析 大数据毕设 深度学习 机器学习
流程: 1.Python采集网易云音乐歌手、歌词、音乐、评论等约10-20万海量数据,存入mysql数据库; 2.使用pandasnumpy/MapReduce对mysql中四类数据进行数据清洗,写入.csv文件并上传至hdfs(含评论NLP文本分类/lsm情感分析); 3.使用hive建…...
值类型与引用类型
值类型 在Swift中,如果一个对象是用struct实现的,则该对象为值类型,在被赋值给常量或者变量时或者作为参数传递给函数时,值类型总是被复制,复制后的对象与之前的对象指向不同的内存。 Swift的基本类型(Array、Dictio…...
C++STL初阶(12):stack和queue的初阶实现
1. stack的选型 对于栈的实现是我们非常熟悉的过程: C语言基础数据结构——栈和队列_栈和队列 插入取出数据-CSDN博客 _top表示下标,_capacity表示空间大小: 那么按照我们原来的思路,利用_top和_capacity T*来给stack构形。 temp…...
汽车IVI中控OS Linux driver开发实操(二十三):驱动的设备probe及匹配
第一个函数:probe linux驱动模型是分成三个部分的,设备(结构体device),驱动(结构体device_driver),总线(结构体bus_type)。在Linux内核中,设备驱动通常会实现一个probe函数,它是...
华为od(D卷)二叉树计算
文章目录 题目描述输入描述输出描述示例1思路代码 题目描述 给出一个二叉树如下图所示: 6/ \7 9\ / -2 6 请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。 20 (7-296)/ \-2 6\ / 0 0 左子树…...
技术爱好者完全用台式机部件定制游戏笔记本电脑
高端笔记本电脑的功能强大到令人难以置信的地步,但大多数笔记本电脑在至少几个关键性能方面仍然落后于台式机。一位 YouTuber 对这种情况感到厌倦,为了抹除这种差距,他开始了为期 14 个月的旅程,使用真正的台式机硬件打造自己的笔…...
100个练习学习Rust!if・Panic・演练
之前的文章 【0】准备 【1】构文・整数・变量 ← 上回 【2】 if・Panic・演练 ← 本次 这是“100 Exercise To Learn Rust”的第2次练习!本次的主题包括 if 表达式、panic 机制,以及对前面内容的总结练习。 本次相关的页面如下: 2.3. Bran…...
MODELSIM仿真报错解决记录
目录 问题:Modelsim报错:Error (10228): Verilog HDL error at Line_Shift_RAM_1Bit.v(39): module “Line_Shift_RAM_1 原因:创建的IP核放到了别的位置 解决方法:删掉IP核以及QIP等文件,将IP核创建到工程目录下 问…...
day33-负载均衡实战
01.问题总结 1.rsync同步注意目录加/和不加/的区别 2.安装wordpress过程中禁止使用IP安装,解析成域名安装 比如安装过程 10.0.0.7--->填写数据库信息--->写入数据库中 如果安装完成后再使用www.wp.com访问,不能访问页面乱码的问题。 3.挂载wordpress挂载uplo…...
网络接口 eno1 未连接或未托管
网络接口 eno1 未连接或未托管,通常意味着该接口没有被识别或没有被配置为自动连接到网络。以下是一些可能的解决方案: 检查物理连接: 确保您的以太网电缆正确连接到 eno1 接口和调制解调器/路由器。 启用网络接口: 使用以下命令…...
Linux I/O 多路复用机制详解
文章目录 1 文件描述符(File Descriptor)1.1 什么是文件描述符?1.2 文件描述符与文件的关系 2 文件描述符集合(File Descriptor Set)2.1 什么是文件描述符集合?2.2 fd_set 结构体 3 select() 函数的工作原理…...
第43课 Scratch入门篇:雪花随风飘
雪花随风飘 故事背景: 雪花轻轻地从灰蒙蒙的天空中飘落下来,它们像是天空中飘洒下来的羽毛,又像是冬日的精灵在翩翩起舞。每一片雪花都独一无二,它们在空中旋转、飘荡,最终缓缓降落在屋顶、树枝、街道和行人的肩头。 程序原理: 众多的雪花肯定是克隆功能,降落过程是通过…...
VueUse 基于 Vue 3 Composition API 的高质量 Hooks 库
VueUse 是什么? VueUse 是基于 Vue 3 Composition API 的高质量 Hooks 库。例如获取滚动的距离 VueUse 官网:VueUse | VueUse VueUse 什么使用? 1、通过npm安装 VueUse npm i @vueuse/core 2、搜索需要使用的函数,例如搜索 useScroll 滚动 3、使用useScroll 滚动函数 …...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
