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

如何使用 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项目的开发和维护提供强有力的保障。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【AI绘画】Midjourney前置指令/describe、/shorten详解
  • 给自己复盘用的tjxt笔记day12第一部分
  • Android 事件分发:为什么有时候会出现事件冲突?事件的顺序是如何的?出现事件冲突如何解决呢?比如为什么左右可以滑动,而上下却不行?
  • 中信银行与中国国家地理携手致敬中国极地考察40周年
  • 查看 mysql 密码过期策略,设置永不过期
  • 医疗器械法规笔记
  • 虚幻5|按键触发学习
  • 低代码技术:快速构建应用的未来
  • 华为HCIP-datacom 真题 (2024年下半年最新题库)
  • 华为OD机试算法精选题解汇总:提前准备,稳步通关的关键
  • rust单线程下异步代码的意义
  • 进程间通信--IPC机制
  • APP 数据抓取 - Charles 抓包工具的使用(Charles 端口配置、CA 证书配置、Charles Android 模拟器配置)
  • redis面试(二十三)写锁释放
  • 如何使用Svg矢量图封装引用到vue3项目中
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Fabric架构演变之路
  • gops —— Go 程序诊断分析工具
  • Hibernate【inverse和cascade属性】知识要点
  • JavaScript标准库系列——Math对象和Date对象(二)
  • linux学习笔记
  • Next.js之基础概念(二)
  • node和express搭建代理服务器(源码)
  • opencv python Meanshift 和 Camshift
  • rabbitmq延迟消息示例
  • spring boot 整合mybatis 无法输出sql的问题
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • Web设计流程优化:网页效果图设计新思路
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前端性能优化——回流与重绘
  • 使用 @font-face
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 异步
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #Z2294. 打印树的直径
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (39)STM32——FLASH闪存
  • (6)设计一个TimeMap
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (离散数学)逻辑连接词
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (一)插入排序
  • (轉)JSON.stringify 语法实例讲解
  • .gitignore不生效的解决方案
  • .Net - 类的介绍
  • .NET 8.0 中有哪些新的变化?
  • .NET Core 成都线下面基会拉开序幕
  • .NET Core使用NPOI导出复杂,美观的Excel详解