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地址的使用 家庭网络中的设备通常使用私…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
