当前位置: 首页 > news >正文

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 中非常流行的测试框架,简单易用,功能强大,适合编写单元测试和集成测试。相比于 unittestpytest 具有更简洁的语法和更丰富的插件生态。

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_functionteardown_function 用于在每个测试函数运行前后执行一些准备或清理工作,类似于 unittest 中的 setUptearDown

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天通关中级通信工程师】 终端与业务(四)&#xff1a;通信产品 本文是中级通信工程师考试《终端与业务》科目第四章《通信产品》的复习资料和真题汇总。终端与业务是通信考试里最简单的科目&#xff0c;有效复习通过率可达90%以上&#xff0c;本文结合了高频考点和近几…...

数据科学 - 字符文本处理

1. 字符串的基本操作 1.1 结构操作 1.1.1 拼接 • 字符串之间拼接 字符串之间的拼接使用进行字符串的拼接 a World b Hello print(b a) • 列表中的字符串拼接 将以分隔符‘,’为例子 str [apple,banana] print(,.join(str)); • 字符串中选择 通过索引进行切片操…...

python之装饰器、迭代器、生成器

装饰器 什么是装饰器&#xff1f; 用来装饰其他函数&#xff0c;即为其他函数添加特定功能的函数。 装饰器的两个基本原则&#xff1a; 装饰器不能修改被装饰函数的源码 装饰器不能修改被装饰函数的调用方式 什么是可迭代对象&#xff1f; 在python的任意对象中&#xff…...

Go语言实现后台管理系统如何根据角色来动态显示栏目

实现要点 根据不同的用户显示不同的栏目是后台管理的重要内容,那么如何实现这些功能呢? 栏目有很多分级这些需要递归查出来新增和删除也要满足层级规则且不影响其他层级各节点之间的关系因该明确,方便添加和删除数据库设置 存储栏目的数据库设计,要明确节点的关系最常用的…...

【深度学习】【TensorRT】【C++】模型转化、环境搭建以及模型部署的详细教程

【深度学习】【TensorRT】【C】模型转化、环境搭建以及模型部署的详细教程 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【TensorRT】【C】模型转化、环境搭建以及模型部署的详细教程前言模型转换--pytorch转engineWindows平台搭…...

LeetCode(Python)-贪心算法

文章目录 买卖股票的最佳时机问题穷举解法贪心解法 物流站的选址&#xff08;一&#xff09;穷举算法贪心算法 物流站的选址&#xff08;二&#xff09;回合制游戏快速包装 买卖股票的最佳时机问题 给定一个数组&#xff0c;它的第 i 个元素是一支给定股票第 i 天的价格。如果你…...

【C/C++】【基础数论】33、算数基本定理

算术基本定理&#xff0c;又称正整数的唯一分解定理。 说起来比较复杂&#xff0c;但是看一下案例就非常清楚了 任何一个大于 1 的正整数都可以唯一地分解成有限个质数的乘积形式&#xff0c;且这些质数按照从小到大的顺序排列&#xff0c;其指数也是唯一确定的。 例如&#…...

聚簇索引与非聚簇索引

物理存储方式不同&#xff1a; 1. InnoDb默认数据结构是聚簇索引&#xff1b;MyISAM 是非聚簇索引 2. 聚簇索引 中表索引与数据是在一个文件中 .ibd&#xff1b;非聚簇索引中表索引&#xff08;.MYI&#xff09;与数据(.MYD)是在两个文件中 3. 聚簇索引中表数据行都存放在索引树…...

“类型名称”在Go语言规范中的演变

Go语言规范&#xff08;The Go Programming Language Specification&#xff09;[1]是Go语言的核心文档&#xff0c;定义了该语言的语法、类型系统和运行时行为。Go语言规范的存在使得开发者在实现Go编译器时可以依赖一致的标准&#xff0c;它确保了语言的稳定性和一致性&#…...

c++----继承(初阶)

大家好呀&#xff0c;今天我们也是多久没有更新博客了&#xff0c;今天来讲讲我们c加加中的一个比较重要的知识点继承。首先关于继承呢&#xff0c;大家从字面意思看&#xff0c;是不是像我们平常日常生活中很容易出现的&#xff0c;比如说电视剧里面什么富豪啊&#xff0c;去了…...

数据库系列(1)常见的四种非关系型数据库(NoSQL)

非关系型数据库&#xff08;NoSQL&#xff09; 非关系型数据库适用于需要灵活数据模型和高可扩展性的场景。常见的非关系型数据库包括&#xff1a; MongoDB&#xff1a;文档数据库&#xff0c;以JSON-like格式存储数据&#xff0c;适合快速开发和迭代。Cassandra&#xff1a;…...

大规模预训练语言模型的参数高效微调

人工智能咨询培训老师叶梓 转载标明出处 大规模预训练语言模型&#xff08;PLMs&#xff09;在特定下游任务上的微调和存储成本极高&#xff0c;这限制了它们在实际应用中的可行性。为了解决这一问题&#xff0c;来自清华大学和北京人工智能研究院的研究团队探索了一种优化模型…...

一场大模型面试,三个小时,被撞飞了

去华为面试大模型&#xff0c;一点半去五点半回&#xff0c;已经毫无力气。 1️⃣一轮面试—1小时 因为一面都是各个业务的主管&#xff0c;所以专业性很强&#xff0c;面试官经验很丰富&#xff0c;建议大家还是需要十分熟悉所学内容&#xff0c;我勉强通过一面。 2️⃣二轮…...

Python每次for循环向list中添加多个元素

Python中&#xff0c;我每次for loop要产生几个结果。要将这些结果加到一个list中。怎么最高效&#xff1f; 答: list extend 方法 在Python中&#xff0c;如果你想在循环中将多个元素添加到列表中&#xff0c;最直接和最高效的方式是使用列表的 append() 方法。每次循环时&a…...

Java爬虫抓取数据的艺术

在信息时代&#xff0c;数据的重要性不言而喻。对于Java开发者来说&#xff0c;掌握如何使用Java进行数据抓取是一项宝贵的技能。通过编写爬虫程序&#xff0c;我们可以从互联网的海量信息中提取有价值的数据&#xff0c;用于市场分析、客户洞察、内容监控等多种场景。本文将介…...

Unity场景内画车道线(根据五阶曲线系数)

之前做过使用Dreamteck Splines插件构建车道线之前需求是给定车道线的点位&#xff0c;根据点位来进行构建。 由于AI识别出来的点位不线性&#xff0c;画出来的车道线经常是歪七扭八&#xff0c;所以使用五阶曲线系数进行构建。 使用在线图形计算器进行测试构建&#xff0c;公式…...

IPLOOK百万级用户容量核心网惊艳亮相北京PT展

2024年9月25日&#xff0c;以“推动数实深度融合&#xff0c;共筑新质生产力”为主题&#xff0c;本届中国国际信息通信展&#xff08;PT展&#xff09;在北京国家会议中心正式拉开帷幕。 广州爱浦路网络技术有限公司&#xff08;简称&#xff1a;IPLOOK&#xff09;&#xff…...

家庭网络的ip安全性高吗

家庭网络的IP安全性是一个重要的话题&#xff0c;涉及到如何保护家庭设备和用户的隐私。家庭网络的安全性既有其优势&#xff0c;也存在一些潜在的风险。以下是关于家庭网络IP安全性的几个关键点&#xff1a; 1. 家庭网络的优势 私有IP地址的使用 家庭网络中的设备通常使用私…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...