pytest介绍(python测试框架)(@pytest.mark.parametrize、@pytest.fixtures)

文章目录

  • **1. 核心特点**
    • - **简洁易用**:无需复杂的配置,只需编写简单的函数或类即可进行测试。
    • - **丰富的断言**:直接使用 Python 内置的 `assert` 语句,失败时提供详细的错误信息。
    • - **自动发现测试**:通过约定的命名规则(如 `test_*.py` 或 `*_test.py`)自动收集测试用例。
    • - **参数化测试**:通过 `@pytest.mark.parametrize` 轻松实现多组输入和输出的测试。
    • - **Fixtures 管理资源**:通过 `fixture` 定义测试的前置条件和后置清理逻辑,支持重用和作用域控制。
    • - **插件生态**:丰富的插件(如 `pytest-html` 生成报告、`pytest-xdist` 并行执行)扩展功能。
    • - **模块化测试**:支持测试函数、测试类、测试方法等多种组织形式。
  • **2. 安装与快速入门**
    • **安装**
    • **编写第一个测试**
    • **运行测试**
  • **3. 核心功能详解**
    • **3.1 测试函数与类**
      • - **测试函数**:以 `test_` 开头的函数。
      • - **测试类**:以 `Test` 开头的类,类中的方法以 `test_` 开头。
    • **3.2 参数化测试**
    • **3.3 Fixtures(固定装置)**
      • 代码示例
      • **Fixtures 的作用域**:
    • **3.4 异常测试**
    • **3.5 插件系统**
      • - **生成 HTML 报告**:`pytest-html`
      • - **并行执行**:`pytest-xdist`
    • **3.6 命令行参数**
      • - `-v`:显示详细输出。
      • - `-k`:按关键字过滤测试(如 `pytest -k "add or subtract"`)。
      • - `-m`:按标记运行测试(如 `pytest -m slow`)。
      • - `--maxfail`:达到指定失败次数后停止测试。
  • **4. 高级用法**
    • **4.1 标记测试(Markers)**
    • **4.2 Hook 函数**
    • **4.3 多进程/分布式测试**
    • **4.4 模拟对象(Mock)**
  • **5. 实际应用场景**
    • - **单元测试**:验证单个函数或方法的正确性。
    • - **集成测试**:测试多个模块或系统的协作。
    • - **API 测试**:结合 `requests` 等库测试 HTTP 接口。
    • - **持续集成(CI/CD)**:集成到 Jenkins、GitHub Actions 等工具中,自动化运行测试。
  • **6. 优势总结**
  • **7. 学习资源**

pytest 是 Python 中最流行且功能强大的测试框架之一,以其简洁的语法、灵活的功能和强大的扩展性著称。它适用于从简单的单元测试到复杂的自动化测试场景,广泛用于开发、测试和持续集成流程中。以下是关于 pytest 的详细介绍:


1. 核心特点

- 简洁易用:无需复杂的配置,只需编写简单的函数或类即可进行测试。

- 丰富的断言:直接使用 Python 内置的 assert 语句,失败时提供详细的错误信息。

- 自动发现测试:通过约定的命名规则(如 test_*.py*_test.py)自动收集测试用例。

- 参数化测试:通过 @pytest.mark.parametrize 轻松实现多组输入和输出的测试。

- Fixtures 管理资源:通过 fixture 定义测试的前置条件和后置清理逻辑,支持重用和作用域控制。

- 插件生态:丰富的插件(如 pytest-html 生成报告、pytest-xdist 并行执行)扩展功能。

- 模块化测试:支持测试函数、测试类、测试方法等多种组织形式。


2. 安装与快速入门

安装

pip install pytest

编写第一个测试

创建一个文件 test_sample.py

def add(x, y):return x + ydef test_add():assert add(1, 2) == 3  # 断言

运行测试

在命令行中执行:

pytest test_sample.py

输出示例:

=========================== test session starts ============================
collected 1 itemtest_sample.py .                                                    [100%]============================ 1 passed in 0.01s =============================

3. 核心功能详解

3.1 测试函数与类

- 测试函数:以 test_ 开头的函数。

- 测试类:以 Test 开头的类,类中的方法以 test_ 开头。

class TestMath:def test_add(self):assert 1 + 1 == 2def test_subtract(self):assert 3 - 1 == 2

3.2 参数化测试

使用 @pytest.mark.parametrize 实现多组输入测试:

import pytest@pytest.mark.parametrize("a, b, expected", [(1, 2, 3), (4, 5, 9), (7, 8, 15)])
def test_add(a, b, expected):assert a + b == expected

3.3 Fixtures(固定装置)

Fixtures 用于管理测试的前置条件(如初始化资源)和后置清理(如关闭连接)。通过装饰器 @pytest.fixture 定义:

代码示例

import pytest@pytest.fixture
def tmp_dir(tmpdir):  # 使用内置的 tmpdir fixturereturn tmpdir.mkdir("test_data")def test_tmp_dir(tmp_dir):file = tmp_dir.join("test.txt")file.write("Hello")assert file.read() == "Hello"

上述代码具体解释参见:pytest tmpdir fixture介绍(tmpdir_factory)(自动在测试开始前创建一个临时目录,并在测试结束后删除该目录)

Fixtures 的作用域

  • function(默认):每个测试函数执行一次。
  • class:每个测试类执行一次。
  • module:每个模块执行一次。
  • session:整个测试会话执行一次。

3.4 异常测试

测试是否抛出特定异常:

def test_exception():with pytest.raises(ValueError):raise ValueError("Invalid input")

3.5 插件系统

通过插件扩展功能:

- 生成 HTML 报告pytest-html

pytest --html=report.html

- 并行执行pytest-xdist

pytest -n 4  # 使用 4 个 CPU 并行运行

3.6 命令行参数

- -v:显示详细输出。

- -k:按关键字过滤测试(如 pytest -k "add or subtract")。

- -m:按标记运行测试(如 pytest -m slow)。

- --maxfail:达到指定失败次数后停止测试。


4. 高级用法

4.1 标记测试(Markers)

为测试添加标签,用于分类或过滤:

import pytest@pytest.mark.slow
def test_slow():assert 1 + 1 == 2

运行标记为 slow 的测试:

pytest -m slow

4.2 Hook 函数

通过钩子函数(Hook)自定义测试流程,例如修改测试报告或收集用例逻辑。需在 conftest.py 中定义。

4.3 多进程/分布式测试

结合 pytest-xdist 插件实现多进程或分布式测试,提升执行效率。

4.4 模拟对象(Mock)

使用 unittest.mock 模块模拟函数或对象行为:

from unittest.mock import Mockdef test_mock():mock = Mock(return_value=42)assert mock() == 42

5. 实际应用场景

- 单元测试:验证单个函数或方法的正确性。

- 集成测试:测试多个模块或系统的协作。

- API 测试:结合 requests 等库测试 HTTP 接口。

- 持续集成(CI/CD):集成到 Jenkins、GitHub Actions 等工具中,自动化运行测试。


6. 优势总结

  • 学习成本低:语法简单,无需继承基类。
  • 可扩展性强:丰富的插件生态支持各种需求。
  • 社区活跃:文档完善,社区支持强大。
  • 高效调试:失败时自动显示详细的错误信息和中间值。

7. 学习资源

  • 官方文档:https://docs.pytest.org
  • 中文教程:Pytest 中文文档
  • 实战示例:GitHub 上的开源项目(如 GitCode 的 Pytest 教程)。

通过掌握 pytest,你可以显著提升 Python 项目的测试效率和代码质量!

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

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

相关文章

[Python 基础课程]继承

在 Python 的面向对象编程(OOP)中,继承(Inheritance) 是一种重要的机制,它允许一个类(称为子类或派生类)从另一个类(称为父类、基类或超类)中继承属性和方法。…

QT之设计器组件功能(8大类55个组件)

组件名称 功能描述关键属性1. Layouts(布局组件)(1) Vertical Layout(垂直布局)将子控件按垂直方向依次排列layoutSpacing:控件之间的间距layoutMargin:布局边缘的边距layoutStretch:设置各控件…

java中list的api详细使用

在Java中,List是集合框架中最常用的接口之一,继承自Collection,代表有序、可重复的元素集合(允许null元素)。其核心实现类有ArrayList(数组实现,随机访问高效)、LinkedList&#xff…

Azure AI Search 探索总结

Azure AI Search 原名 Azure Cognitive Service,是Azure中用来给AI项目构建知识库的组件。知识库本质和数据库很像,但是内部的存储结构和检索算法不一样。比如并不是知识库的每一列都可以用来过滤、检索或group by,而是要根据实际情况配置。A…

高效解决 pip install 报错 SSLError: EOF occurred in violation of protocol

高效解决 pip install 报错 SSLError: EOF occurred in violation of protocol 标签: Python, pip, SSLError, Clash, 网络代理, 问题解决 一、问题描述 在Python开发中,pip 是我们最亲密的伙伴。然而,当你身处需要科学上网的环境&#xff0c…

CSS 核心知识点全解析:从基础到实战应用

大家好!今天这篇文章将系统总结 CSS 的核心知识点,从最基础的样式引入到复杂的选择器应用,再到盒子模型、文本处理等实战技巧,全程结合代码示例,让你轻松掌握 CSS 的精髓。一、CSS 是什么?为什么需要它&…

ClickHouse的学习与了解

什么是ClickHouse? ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 在传统的行式数据库系统中,数据按如下顺序存储:RowWatchIDJavaEnableTitleGoodEventEventTime#0893543506621Investor Relations12016/5/18 5:19#1903295…

安卓11 12系统修改定制化_____修改系统 解锁system分区 去除data加密 自由删减系统应用

在定制化系统中。修改系统分区 解锁system。让用户可以自由删减应用。这个在定制化服务中比较常见。对于此项修改服务。需要我们了解基础的分区常识以及常用的几种基础修改步骤。 通过博文了解💝💝💝 1💝💝💝-----修改rom 解锁 system 分区有什么意义 2💝💝…

JetPack系列教程(八):PDF库——让Android应用也能优雅“翻页”

JetPack系列教程(八):PDF库——让Android应用也能优雅“翻页” 在Android开发的世界里,加载PDF文件一直是个让人又爱又恨的“小妖精”。爱它,因为PDF是文档界的“万能钥匙”;恨它,因为原生Andr…

Three.js三大组件:场景(Scene)、相机(Camera)、渲染器(Renderer)

上一篇中我们学习了第一个Three.js场景"Hello World"。这一篇就来学习three.js的核心组件。 此图来源(Three.js中文网) three.js的核心由三大组件构成:场景(Scene)、相机(Camera)和渲染器(Renderer)。下面我将详细介绍这三大件的作…

AI幻觉终结之后:GPT-5开启的“可靠性”新赛道与开发者生存指南

摘要: Sam Altman关于GPT-5将基本终结幻觉的宣告,不仅仅是一次技术升级,它标志着一个“万物皆可AI,但万事皆需验证”的混乱时代的结束。本文将从一个全新的战略视角出发,探讨当“可靠性”取代“创造性”成为AI竞赛的核…

ubuntu远程桌面很卡怎么解决?

服务端方案 完成XRDP的性能优化配置: 1. 首先检查当前的xrdp.ini文件 grep -n "tcp_send_buffer_bytes" /etc/xrdp/xrdp.ini2. 编辑xrdp.ini文件,修改TCP发送缓冲区大小 sudo sed -i s/#tcp_send_buffer_bytes32768/tcp_send_buffer_bytes4194…

[Linux] Linux系统负载监控 Linux服务管理

目录 Linux系统负载监控 系统负载介绍 查看系统负载 负载解读 top 命令 Linux服务管理 systemd 介绍 系统启动管理进程 基本概念 systemd 架构 unit 类型 查看 unit 列表信息 查看单个 unit 信息 控制系统服务 systemctl 命令 unit 配置文件 例:开发…

vector 手动实现 及遇到的各种细节问题

之前对vector的一些功能使用了一下 接下来手动实现一下vector vector的实现和string还是有不小区别的 有很多地方都有细节的问题不同于string的成员变量一个指针一个size一个capacity的成员变量 vector里面存的是三个迭代器iterator 这的迭代器其实就是模版T的指针 这样就…

OpenStack Neutron中的L2 Agent与L3 Agent:新手友好指南

引言:云网络的幕后英雄 在当今的云计算世界中,OpenStack作为开源云平台的佼佼者,为成千上万的企业提供了灵活、可扩展的基础设施服务。而在OpenStack的众多组件中,Neutron(网络服务)扮演着至关重要的角色—…

【自用】JavaSE--特殊文件Properties与XML、日志技术

特殊文件概述使用特殊文件可以存储多个有关系的数据,作为系统的配置信息属性文件类似于键值对,一一对应存储数据(比如用户名与密码)XML文件存储多个用户的多个属性更适合,适合存储更复杂的数据Properties注:这个属性文件的后缀即使…

中本聪思想与Web3的困境:从理论到现实的跨越

一、中本聪思想的核心精髓中本聪通过比特币白皮书提出的核心思想,可归纳为三大支柱:去中心化货币体系目标:摆脱中央机构控制,避免通货膨胀和政治干预(如2008年金融危机暴露的中心化风险)。实现路径&#xf…

Centos 用户管理

一.创建用户 在 root账户 或 sudo 权限下 1. 创建用户 useradd xiaoyangzi2.为该用户设置密码或修改密码 passwd xiaoyangzi3. 将用户加入wheel用户组 在 CentOS 中,属于 wheel 组的用户默认可以使用 sudo 权限。 查看所属用户组: groups xiaoyangzi将 xiaoyangzi 加…

C++枚举算法习题

1. 3的倍数枚举(基础)题目:在之间有10和50多少个数是3的倍数?列举这些数。 解析:枚举10到50之间的数,判断是否能被3整除。优化:计算第一个≥10的3的倍数(1234)&#xff0…

【SpringBoot系列-01】Spring Boot 启动原理深度解析

【SpringBoot系列-01】Spring Boot 启动原理深度解析 大家好!今天咱们来好好聊聊Spring Boot的启动原理。估计不少人跟我一样,刚开始用Spring Boot的时候觉得这玩意儿真神奇,一个main方法跑起来就啥都有了。但时间长了总会好奇:这…