如何使用 Pytest 进行测试

Pytest 是一个强大的Python测试框架,支持简单单元测试和复杂的功能测试。它具有灵活的断言表达式、支持参数化测试、强大的插件生态系统等特点。

二、环境搭建

1、安装 Pytest

pip install pytest

安装完成后,可以通过命令行检查是否安装成功:

pytest --version

2、项目结构: 一般来说,项目的测试文件和代码文件可以按照以下结构组织:

my_project/
├── src/
│   └── my_module.py
└── tests/└── test_my_module.py
  • src/ 目录用于存放源代码。
  • tests/ 目录用于存放测试代码,测试文件通常以 test_ 开头。

三、基本使用

1、编写简单的测试用例: 假设我们在 src/my_module.py 中有一个函数:

def add(x, y):return x + y

我们可以在 tests/test_my_module.py 中编写测试:

from src.my_module import adddef test_add():assert add(1, 2) == 3assert add(0, 0) == 0assert add(-1, 1) == 0

2、运行测试: 在项目的根目录下运行命令:

pytest

Pytest 会自动发现并运行所有以 test_ 开头的文件和以 test_ 开头的函数。

3、查看测试结果: 如果测试通过,Pytest 会显示一份简洁的测试报告。如果某些测试失败了,Pytest 会显示失败的测试用例及相关的错误信息。

四、断言与错误信息

1、使用断言: Pytest 使用Python内置的 assert 语句来检查测试条件是否为真。如果条件不成立,测试将失败,并显示错误信息。

def test_subtract():result = 10 - 5assert result == 5

2、丰富的错误信息: Pytest 可以通过简单的断言表达式生成详细的错误信息。例如:

def test_divide():x, y = 10, 0with pytest.raises(ZeroDivisionError):result = x / y

这里,Pytest 检查是否会抛出 ZeroDivisionError,如果没有抛出,测试将失败。

五、测试组织与发现

1、测试文件与函数的命名

  • 测试文件名应以 test_ 开头,如 test_example.py
  • 测试函数名也应以 test_ 开头,如 test_function()

2、测试类的使用: 测试类可以用于组织相关的测试用例。测试类不需要继承任何类,但类名必须以 Test 开头。

class TestMathOperations:def test_addition(self):assert 1 + 1 == 2def test_subtraction(self):assert 2 - 1 == 1

3、测试套件: Pytest 允许通过 pytest.main(["<test_path>"]) 来指定测试路径,也可以通过命令行参数来选择特定的测试文件或测试函数:

pytest tests/test_my_module.py
pytest tests/test_my_module.py::test_add

六、参数化测试

1、基本参数化: Pytest 提供了 @pytest.mark.parametrize 装饰器,用于参数化测试。这样我们可以用多个输入测试同一个函数,而无需编写多个测试用例。

@pytest.mark.parametrize("x, y, expected", [(1, 2, 3),(0, 0, 0),(-1, 1, 0)
])
def test_add(x, y, expected):assert add(x, y) == expected

2、组合参数化: 通过组合多个 parametrize 装饰器,Pytest 可以生成参数的笛卡尔积,进行全面的测试。

@pytest.mark.parametrize("x", [0, 1, 2])
@pytest.mark.parametrize("y", [0, 1])
def test_multiply(x, y):assert x * y == x * y

七、Fixture

1、Fixture简介: Fixture 是 Pytest 中的一个重要概念,用于提供测试所需的环境和依赖。例如,准备测试数据、建立数据库连接、配置初始化等。

2、定义和使用Fixture: 使用 @pytest.fixture 装饰器定义 Fixture。测试函数可以通过传入参数的方式使用这些 Fixture。

@pytest.fixture
def sample_data():return {"key": "value"}def test_with_fixture(sample_data):assert sample_data["key"] == "value"

3、Fixture 的作用范围

  • 函数级别(默认):Fixture 每次测试函数调用时都会被执行。
  • 类级别:在每个测试类的开始和结束执行一次。
  • 模块级别:在模块的开始和结束执行一次。
  • 会话级别:在整个测试会话开始和结束时执行一次。

可以通过 scope 参数设置作用范围:

@pytest.fixture(scope="module")
def db_connection():# Setup database connectionyield connection# Teardown database connection

4、使用 yield 进行资源管理: 在Fixture 中使用 yield 可以在执行完测试后进行资源的清理或释放。

@pytest.fixture
def resource():# Setup coderesource = acquire_resource()yield resource# Teardown coderelease_resource(resource)

八、Mocking 与 Monkeypatch

1、使用 Mocking: Mocking 是一种测试技术,主要用于替换测试中的某些部分,使其返回特定值或行为。Python 的 unittest.mock 模块与 Pytest 兼容,可以在 Pytest 中轻松使用。

from unittest.mock import Mockdef test_mocking():mock_obj = Mock()mock_obj.some_method.return_value = 42assert mock_obj.some_method() == 42

2、使用 Monkeypatch: Pytest 提供了 monkeypatch 机制,用于动态替换模块或类中的属性、方法等。常用于临时修改环境变量或替换函数实现。

def test_monkeypatch(monkeypatch):def fake_function():return 42monkeypatch.setattr('module_under_test.function_to_patch', fake_function)from module_under_test import function_to_patchassert function_to_patch() == 42

九、插件与扩展

1、安装插件: Pytest 拥有一个强大的插件生态,可以通过安装插件扩展 Pytest 的功能。安装插件非常简单,例如:

pip install pytest-cov

2、常用插件

  • pytest-cov:生成测试覆盖率报告。
  • pytest-xdist:并行运行测试以加快测试速度。
  • pytest-html:生成HTML格式的测试报告。

3、编写自定义插件: 除了使用现有的插件,Pytest 还支持用户编写自定义插件来满足特定需求。这些插件可以通过定义钩子函数实现。

十、测试报告与调试

1、生成测试报告: 通过使用插件 pytest-html,可以生成详细的 HTML 测试报告:

生成测试报告: 通过使用插件 pytest-html,可以生成详细的 HTML 测试报告:

2、捕获日志: Pytest 可以捕获测试过程中的日志信息,并将其与测试结果一起显示。通过 --log-cli-level 参数可以设置日志捕获级别。

pytest --log-cli-level=INFO

3、调试失败的测试: 失败的测试可以通过 pytest --pdb 命令进入Python调试器(PDB),以便详细检查失败原因。

十一、代码覆盖率

1、安装 pytest-covpytest-cov 插件可以帮助我们了解哪些代码在测试时被执行了,哪些代码没有被覆盖。

pip install pytest-cov

2、生成覆盖率报告: 使用 pytest --cov=<src_directory> 来生成覆盖率报告。

pytest --cov=src

3、输出格式: 可以将覆盖率报告输出为HTML或XML等格式,便于阅读和集成:

pytest --cov=src --cov-report=html

Pytest 是一个强大且灵活的Python测试框架,适合从小型项目到大型项目的各种测试需求。Pytest的基本使用方法和高级功能,包括如何编写测试用例、组织测试、使用Fixture、进行参数化测试、使用Mocking技术、生成测试报告等。通过合理地使用这些功能,可以显著提高测试效率和测试质量,为Python项目的开发和维护提供强有力的保障。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/412907.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Adobe DC 2022提示无法识别的错误 - 解决方案

Adobe DC 2022提示无法识别的错误 - 解决方案 问题解决方案更改安装&#xff08;推荐&#xff09;重新安装&#xff08;推荐&#xff09;降级安装&#xff08;不推荐&#xff09; 问题 使用Adobe DC 2022合并图片创建PDF时&#xff0c;会提示无法识别的错误&#xff0c;这是因…

同步技术难点

在Java中&#xff0c;同步技术主要用于控制多个线程对共享资源的访问&#xff0c;以避免数据不一致和线程安全问题。然而&#xff0c;同步技术也带来了一些难点&#xff0c;主要包括以下几个方面&#xff1a; 死锁&#xff08;Deadlock&#xff09;&#xff1a; 死锁是同步技术…

Python私教张大鹏FastAPI开源框架和项目第一次整理 20240830

去我的Github搜fastzdp开头的&#xff1a;https://github.com/zhangdapeng520?tabrepositories&qfastzdp&type&language&sort fastzdp_api&#xff1a;基于FastAPI二次开发的HTTP REST API 框架。目前刚开始开发&#xff0c;这里面主要记录了FastAPI的一些基础…

大一新生入学证件照采集,手机拍照轻松搞定收集

又到了一年一度大中专院校新生入学的时候了&#xff0c;在开学时很重要的一项工作就是新生照片采集。证件照采集是为了建立学生学籍档案、校园门禁系统登记、校园卡制发、大学四级英语考试报名等&#xff0c;往往要求全校新生使用统一的证件照尺寸、颜色背景&#xff0c;甚至是…

Access OpenAI (json) API from R

题意&#xff1a;“从 R 访问 OpenAI (JSON) API” 问题背景&#xff1a; I want to access the OpenAI API with the following curl command from R: “我想从 R 中使用以下 curl 命令访问 OpenAI API&#xff1a;” curl https://api.openai.com/v1/engines/davinci/comp…

视频结构化从入门到精通——行为分析类应用

行为分析类应用 1. 认识行为分析 监控/判断视频画面中目标的运动过程、携带属性等。从数据中自动识别、跟踪和理解人类或物体行为。 1. 车的行为分析应用 车辆行为分析主要用于监控和管理车辆的动态行为&#xff0c;广泛应用于智能交通、城市管理和安全监控。关键应用包括&…

操作系统:实验五内存管理实验

一、实验目的 1、了解操作系统动态分区存储管理过程和方法。 2、掌握动态分区存储管理的主要数据结构--空闲表区。 3、加深理解动态分区存储管理中内存的分配和回收。 4、掌握空闲区表中空闲区3种不同放置策略的基本思想和实现过程。 5、通过模拟程序实现动态分区存储管理…

如何通过WinRAR软件有效禁止RAR压缩包内文件的修改

RAR压缩包作为一种广泛使用的文件格式&#xff0c;凭借其高压缩比和强大的功能&#xff0c;成为了许多用户保存和传输文件的首选。然而&#xff0c;在某些情况下&#xff0c;我们可能希望确保RAR压缩包内的文件不被随意修改或删除&#xff0c;以维护文件的安全性和完整性。本文…

C++:list篇

前言: 观看C的list前需要对链表有一些了解&#xff0c;如C语言的链表结构。本片仅介绍list容器中常用的接口函数概念以及使用。 list的概念&#xff1a; 简而言之&#xff0c;C的list是一个双向带哨兵位的链表容器模板 list的构造&#xff1a; 1.list():默认构造 2.li…

关于自定义控件,头文件找不到问题的解决办法

在ui文件中使用控件提升的时候&#xff0c;突然发现ui_xxxx.h竟然报错了&#xff0c; 这在之前是没有碰到过&#xff0c;苦思过后认为是环境变量的问题&#xff0c;因为现在正在用的构建套件是 mingw 的&#xff0c;但在此之前我一直用的是msvc&#xff0c;并且环境变量的配置…

PDF文本指令解析与文本水印去除

上次我在《PDF批量加水印 与 去除水印实践》一文中完成了对图片水印和文字水印的去除。 链接&#xff1a;https://xxmdmst.blog.csdn.net/article/details/139483535 但是对于页面对象的内容对象是单层&#xff0c;不是数组的情况&#xff0c;无法去除水印。今天我们专门研究…

idea付费插件,SequenceDiagram有哪些优点

以下idea付费插件你们都用过哪些呢&#xff1f; SequenceDiagram插件是一种用于绘制时序图的工具。时序图是一种图形化的表示对象之间消息传递顺序的方法。 该插件可以在使用各种编程语言编写代码时&#xff0c;方便地绘制时序图&#xff0c;以帮助开发者更好地理解和描述系统…

<Rust>egui学习之小部件(七):如何在窗口中添加颜色选择器colorpicker部件?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析&#xff0c;主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统&#xff1a;windows 平台&#xff1a;visual studio code 语言&#xff1a;rust 库&#xff1a;egui、eframe 概述 本文是本专栏的第七篇博…

IBM是中国IT界的黄埔军校

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 我第一次听说IBM还是小的时候&#xff0c;当时很多人都说IBM是厉害&#xff0c;外号“蓝色巨人”&#xff0c;潜移默化我也知道IBM牛了。 而且当年我买的第一款笔记本电脑就是IBM的ThinkPad系列&#xff0c;花了6…

[Labview]图片叠加下的表格视图拖拽功能:挖坑粗糙版

没错&#xff0c;又是Labview表格T - T 由于项目中用到的表格上有一张用于画框的二维图片&#xff0c;感兴趣可看这篇 [Labview] 表格单元格外边框 二维图片叠加绘图 因此在滚动条与鼠标滚轮的基础上&#xff0c;想再增加一个拖拽移动的功能。 但 [二维图片] 并没有 拖拽开始…

科技与文化的完美碰撞 德施曼玄武•紫禁城K80亮相成都车展

8月30日-9月8日&#xff0c;第二十七届成都国际汽车展览会将在中国西部国际博览城举行&#xff0c;德施曼将与海尔、美的、松下等知名品牌携旗下重磅产品集中参展。大会同期“京东MALL智享家生活”活动也将开启&#xff0c;行业首个与紫禁城IP联名的智能锁产品德施曼玄武•紫禁…

江协科技stm32————10-5 硬件I2C读写MPU6050

步骤 一、配置I2C外设&#xff0c;对I2C2外设进行初始化&#xff08;MyI2C_Init&#xff09; 开启I2C外设和对应的GPIO口的时钟把I2C对应的GPIO口初始化为复用开漏模式使用结构体配置I2CI2C_Cmd,使能I2C I2C_GenerateSTART //生产起始条件 I2C_GenerateSTOP /…

LavaDome:一款基于ShadowDOM的DOM树安全隔离与封装工具

关于LavaDome LavaDome是一款针对HTML代码安全和Web安全的强大工具&#xff0c;该工具基于ShadowDOM实现其功能&#xff0c;可以帮助广大研究人员实现安全的DOM节点/树隔离和封装。 在当今的Web标准下&#xff0c;尚无既定方法可以安全地选择性地隔离DOM子树。换句话说&#x…

Unity获取SceneView尺寸

获取SceneView尺寸 var sceneView SceneView.lastActiveSceneView; var size new Vector2(sceneView.position.width,sceneView.position.height);

设计模式结构型模式之代理模式

结构型模式之代理模式 一、概念和使用场景1、概念2、核心思想3、java实现代理模式的方式4、使用场景 二、示例讲解1. 静态代理2. 动态代理 三、总结1、使用规则2、代理模式的优点包括&#xff1a;3、代理模式的缺点包括&#xff1a; 一、概念和使用场景 1、概念 代理模式是一…