【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 滚动函数 …...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
