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 == b
assertNotEqual(a, b)
: 检查a != b
assertTrue(x)
: 检查x
是否为True
assertFalse(x)
: 检查x
是否为False
assertIs(a, b)
: 检查a is b
assertIsNot(a, b)
: 检查a is not b
assertIsNone(x)
: 检查x
是否为None
assertIsNotNone(x)
: 检查x
是否不为None
assertIn(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地址的使用 家庭网络中的设备通常使用私…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...