python功能测试
文章目录
- unnittest
- 1. 基本结构
- 2. 常用断言方法
- 3. 测试生命周期方法
- 4. 跳过测试
- 5. 运行测试
- pytest
- 1. 基本测试用法
- 2. 安装 `pytest`
- 3. 运行测试
- 4. 使用 `assert` 断言
- 5. 异常测试
- 6. 参数化测试
- 7. 测试前后设置
- 8. 跳过测试和标记失败
- 9. 测试夹具 (Fixtures)
- 10. 生成测试报告
- 11. 插件
- 12. 运行整个目录中的测试
unnittest
unittest 是 Python 自带的单元测试框架,用于编写、组织和运行测试。下面是一些常见的 unittest 用法:
1. 基本结构
在 unittest 中,通常通过创建类继承自 unittest.TestCase 来定义测试用例,并在该类中编写测试方法。测试方法的名称必须以 test_ 开头。
import unittest# 定义要测试的函数
def add(x, y):return x + y# 定义测试类
class TestMath(unittest.TestCase):# 编写测试方法def test_add(self):self.assertEqual(add(1, 2), 3) # 测试 1 + 2 是否等于 3self.assertEqual(add(-1, 1), 0) # 测试 -1 + 1 是否等于 0# 运行测试
if __name__ == '__main__':unittest.main()
2. 常用断言方法
unittest.TestCase 提供了一些常见的断言方法来检查代码的行为:
assertEqual(a, b): 检查a == bassertNotEqual(a, b): 检查a != bassertTrue(x): 检查x是否为TrueassertFalse(x): 检查x是否为FalseassertIs(a, b): 检查a is bassertIsNot(a, b): 检查a is not bassertIsNone(x): 检查x是否为NoneassertIsNotNone(x): 检查x是否不为NoneassertIn(a, b): 检查a是否在b中assertNotIn(a, b): 检查a是否不在b中assertRaises(exc, callable, *args, **kwds): 检查是否抛出异常
3. 测试生命周期方法
unittest 提供了一些方法来管理测试前后的操作:
setUp(): 每个测试方法执行前调用tearDown(): 每个测试方法执行后调用setUpClass(): 在所有测试开始之前调用(类方法,使用@classmethod修饰)tearDownClass(): 在所有测试结束之后调用(类方法,使用@classmethod修饰)
class TestMath(unittest.TestCase):@classmethoddef setUpClass(cls):print("所有测试之前调用")def setUp(self):print("每个测试之前调用")def test_add(self):self.assertEqual(add(1, 2), 3)def tearDown(self):print("每个测试之后调用")@classmethoddef tearDownClass(cls):print("所有测试之后调用")
4. 跳过测试
有时某些测试可能需要跳过或被标记为待定,unittest 提供了几种方式来实现:
@unittest.skip(reason): 跳过测试@unittest.skipIf(condition, reason): 条件为真时跳过@unittest.skipUnless(condition, reason): 条件为假时跳过@unittest.expectedFailure: 预期会失败的测试
class TestMath(unittest.TestCase):@unittest.skip("跳过此测试")def test_add(self):self.assertEqual(add(1, 2), 3)@unittest.skipIf(1 < 2, "条件为真时跳过")def test_subtract(self):self.assertEqual(subtract(2, 1), 1)
5. 运行测试
可以直接通过命令行运行测试文件:
python -m unittest test_module.py
也可以一次性运行整个目录的测试:
python -m unittest discover
以上是 Python 中 unittest 框架的常见用法,你可以根据需要编写单元测试并运行以确保代码的正确性。
pytest
pytest 是 Python 中非常流行的测试框架,简单易用,功能强大,适合编写单元测试和集成测试。相比于 unittest,pytest 具有更简洁的语法和更丰富的插件生态。
1. 基本测试用法
pytest 可以直接通过函数来编写测试,而不需要像 unittest 那样定义测试类。测试函数的名称必须以 test_ 开头。
# test_example.pydef add(x, y):return x + y# 编写测试函数
def test_add():assert add(1, 2) == 3assert add(-1, 1) == 0
2. 安装 pytest
pip install pytest
3. 运行测试
直接在命令行中运行 pytest 命令,它会自动发现所有以 test_ 开头的文件和函数:
pytest
还可以指定某个具体的测试文件或测试函数:
pytest test_example.py
pytest test_example.py::test_add
4. 使用 assert 断言
pytest 直接使用 Python 的 assert 语句进行断言,而不需要使用 unittest 中复杂的断言方法。当断言失败时,pytest 会给出详细的错误报告。
def test_add():assert add(1, 2) == 3assert add(-1, 1) == 0assert add(0, 0) == 0
5. 异常测试
pytest 提供了 pytest.raises 来检查代码是否抛出指定的异常。
import pytestdef divide(x, y):if y == 0:raise ValueError("除数不能为零")return x / ydef test_divide():with pytest.raises(ValueError, match="除数不能为零"):divide(1, 0)
6. 参数化测试
通过 pytest.mark.parametrize 装饰器,可以实现参数化测试,让同一个测试函数可以测试多个输入和预期输出。
import pytest# 参数化测试
@pytest.mark.parametrize("x, y, expected", [(1, 2, 3),(-1, 1, 0),(0, 0, 0),
])
def test_add(x, y, expected):assert add(x, y) == expected
7. 测试前后设置
pytest 提供了 setup_function 和 teardown_function 用于在每个测试函数运行前后执行一些准备或清理工作,类似于 unittest 中的 setUp 和 tearDown。
def setup_function():print("每个测试之前执行")def teardown_function():print("每个测试之后执行")def test_example():assert 1 == 1
8. 跳过测试和标记失败
pytest 支持条件跳过测试以及标记测试为预期失败:
@pytest.mark.skip(reason="跳过原因"):跳过某个测试@pytest.mark.skipif(condition, reason="跳过原因"):条件为真时跳过@pytest.mark.xfail:标记为预期失败的测试
import pytest@pytest.mark.skip(reason="暂时跳过")
def test_skip():assert 1 == 1@pytest.mark.skipif(1 < 2, reason="条件为真时跳过")
def test_skipif():assert 1 == 1@pytest.mark.xfail
def test_xfail():assert 1 == 2 # 预期失败
9. 测试夹具 (Fixtures)
pytest 提供了强大的夹具功能(Fixture)来在测试中共享和复用资源。通过使用 @pytest.fixture 装饰器可以定义一个夹具,并在测试函数中传入它。
import pytest@pytest.fixture
def sample_data():return {"name": "Alice", "age": 30}def test_sample_data(sample_data):assert sample_data["name"] == "Alice"assert sample_data["age"] == 30
10. 生成测试报告
运行 pytest 时可以生成更详细的报告:
pytest -v # 显示每个测试的详细信息
pytest --maxfail=3 -v # 最多失败3个测试后停止
pytest --tb=short # 输出简短的回溯信息
11. 插件
pytest 具有丰富的插件生态系统。例如:
pytest-cov: 用于生成代码覆盖率报告pytest-xdist: 并行运行测试pytest-mock: 与unittest.mock集成的插件
安装插件的方式:
pip install pytest-cov
pytest --cov=your_module test_example.py # 运行并生成覆盖率报告
12. 运行整个目录中的测试
pytest 可以一次运行整个目录中的测试文件,自动查找所有 test_ 开头的文件和测试函数:
pytest tests/
pytest 的语法简单而灵活,非常适合写 Python 的测试代码。希望这些用法对你有帮助!
相关文章:
python功能测试
文章目录 unnittest1. 基本结构2. 常用断言方法3. 测试生命周期方法4. 跳过测试5. 运行测试 pytest1. 基本测试用法2. 安装 pytest3. 运行测试4. 使用 assert 断言5. 异常测试6. 参数化测试7. 测试前后设置8. 跳过测试和标记失败9. 测试夹具 (Fixtures)10. 生成测试报告11. 插件…...
【秋招笔试】09.25华子秋招(已改编)-三语言题解
🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集…...
【中级通信工程师】终端与业务(四):通信产品
【零基础3天通关中级通信工程师】 终端与业务(四):通信产品 本文是中级通信工程师考试《终端与业务》科目第四章《通信产品》的复习资料和真题汇总。终端与业务是通信考试里最简单的科目,有效复习通过率可达90%以上,本文结合了高频考点和近几…...
数据科学 - 字符文本处理
1. 字符串的基本操作 1.1 结构操作 1.1.1 拼接 • 字符串之间拼接 字符串之间的拼接使用进行字符串的拼接 a World b Hello print(b a) • 列表中的字符串拼接 将以分隔符‘,’为例子 str [apple,banana] print(,.join(str)); • 字符串中选择 通过索引进行切片操…...
python之装饰器、迭代器、生成器
装饰器 什么是装饰器? 用来装饰其他函数,即为其他函数添加特定功能的函数。 装饰器的两个基本原则: 装饰器不能修改被装饰函数的源码 装饰器不能修改被装饰函数的调用方式 什么是可迭代对象? 在python的任意对象中ÿ…...
Go语言实现后台管理系统如何根据角色来动态显示栏目
实现要点 根据不同的用户显示不同的栏目是后台管理的重要内容,那么如何实现这些功能呢? 栏目有很多分级这些需要递归查出来新增和删除也要满足层级规则且不影响其他层级各节点之间的关系因该明确,方便添加和删除数据库设置 存储栏目的数据库设计,要明确节点的关系最常用的…...
【深度学习】【TensorRT】【C++】模型转化、环境搭建以及模型部署的详细教程
【深度学习】【TensorRT】【C】模型转化、环境搭建以及模型部署的详细教程 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【TensorRT】【C】模型转化、环境搭建以及模型部署的详细教程前言模型转换--pytorch转engineWindows平台搭…...
LeetCode(Python)-贪心算法
文章目录 买卖股票的最佳时机问题穷举解法贪心解法 物流站的选址(一)穷举算法贪心算法 物流站的选址(二)回合制游戏快速包装 买卖股票的最佳时机问题 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你…...
【C/C++】【基础数论】33、算数基本定理
算术基本定理,又称正整数的唯一分解定理。 说起来比较复杂,但是看一下案例就非常清楚了 任何一个大于 1 的正整数都可以唯一地分解成有限个质数的乘积形式,且这些质数按照从小到大的顺序排列,其指数也是唯一确定的。 例如&#…...
聚簇索引与非聚簇索引
物理存储方式不同: 1. InnoDb默认数据结构是聚簇索引;MyISAM 是非聚簇索引 2. 聚簇索引 中表索引与数据是在一个文件中 .ibd;非聚簇索引中表索引(.MYI)与数据(.MYD)是在两个文件中 3. 聚簇索引中表数据行都存放在索引树…...
“类型名称”在Go语言规范中的演变
Go语言规范(The Go Programming Language Specification)[1]是Go语言的核心文档,定义了该语言的语法、类型系统和运行时行为。Go语言规范的存在使得开发者在实现Go编译器时可以依赖一致的标准,它确保了语言的稳定性和一致性&#…...
c++----继承(初阶)
大家好呀,今天我们也是多久没有更新博客了,今天来讲讲我们c加加中的一个比较重要的知识点继承。首先关于继承呢,大家从字面意思看,是不是像我们平常日常生活中很容易出现的,比如说电视剧里面什么富豪啊,去了…...
数据库系列(1)常见的四种非关系型数据库(NoSQL)
非关系型数据库(NoSQL) 非关系型数据库适用于需要灵活数据模型和高可扩展性的场景。常见的非关系型数据库包括: MongoDB:文档数据库,以JSON-like格式存储数据,适合快速开发和迭代。Cassandra:…...
大规模预训练语言模型的参数高效微调
人工智能咨询培训老师叶梓 转载标明出处 大规模预训练语言模型(PLMs)在特定下游任务上的微调和存储成本极高,这限制了它们在实际应用中的可行性。为了解决这一问题,来自清华大学和北京人工智能研究院的研究团队探索了一种优化模型…...
一场大模型面试,三个小时,被撞飞了
去华为面试大模型,一点半去五点半回,已经毫无力气。 1️⃣一轮面试—1小时 因为一面都是各个业务的主管,所以专业性很强,面试官经验很丰富,建议大家还是需要十分熟悉所学内容,我勉强通过一面。 2️⃣二轮…...
Python每次for循环向list中添加多个元素
Python中,我每次for loop要产生几个结果。要将这些结果加到一个list中。怎么最高效? 答: list extend 方法 在Python中,如果你想在循环中将多个元素添加到列表中,最直接和最高效的方式是使用列表的 append() 方法。每次循环时&a…...
Java爬虫抓取数据的艺术
在信息时代,数据的重要性不言而喻。对于Java开发者来说,掌握如何使用Java进行数据抓取是一项宝贵的技能。通过编写爬虫程序,我们可以从互联网的海量信息中提取有价值的数据,用于市场分析、客户洞察、内容监控等多种场景。本文将介…...
Unity场景内画车道线(根据五阶曲线系数)
之前做过使用Dreamteck Splines插件构建车道线之前需求是给定车道线的点位,根据点位来进行构建。 由于AI识别出来的点位不线性,画出来的车道线经常是歪七扭八,所以使用五阶曲线系数进行构建。 使用在线图形计算器进行测试构建,公式…...
IPLOOK百万级用户容量核心网惊艳亮相北京PT展
2024年9月25日,以“推动数实深度融合,共筑新质生产力”为主题,本届中国国际信息通信展(PT展)在北京国家会议中心正式拉开帷幕。 广州爱浦路网络技术有限公司(简称:IPLOOK)ÿ…...
家庭网络的ip安全性高吗
家庭网络的IP安全性是一个重要的话题,涉及到如何保护家庭设备和用户的隐私。家庭网络的安全性既有其优势,也存在一些潜在的风险。以下是关于家庭网络IP安全性的几个关键点: 1. 家庭网络的优势 私有IP地址的使用 家庭网络中的设备通常使用私…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
