如何使用 Pytest 进行测试

news2024/9/24 15:22:45

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 add

def test_add():
    assert add(1, 2) == 3
    assert add(0, 0) == 0
    assert add(-1, 1) == 0

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

pytest

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

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

四、断言与错误信息

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

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

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

def test_divide():
    x, y = 10, 0
    with 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 == 2

    def 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 connection
    yield connection
    # Teardown database connection

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

@pytest.fixture
def resource():
    # Setup code
    resource = acquire_resource()
    yield resource
    # Teardown code
    release_resource(resource)

八、Mocking 与 Monkeypatch

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

from unittest.mock import Mock

def test_mocking():
    mock_obj = Mock()
    mock_obj.some_method.return_value = 42
    assert mock_obj.some_method() == 42

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

def test_monkeypatch(monkeypatch):
    def fake_function():
        return 42

    monkeypatch.setattr('module_under_test.function_to_patch', fake_function)
    from module_under_test import function_to_patch
    assert 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.coloradmin.cn/o/2081069.html

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

相关文章

锡废水回收实验

电镀厂的锡废水回收过程中&#xff0c;需要进行一系列实验以确保回收效率和环保标准。这些实验主要包括以下几个方面&#xff1a; 一、废水成分分析实验 目的&#xff1a;了解废水中锡及其他重金属、有机物、悬浮物等的含量和性质&#xff0c;为后续处理工艺提供依据。方法&am…

‌分布式计算技术与复杂算法优化:‌现代数据处理的基石

在当今信息时代&#xff0c;‌数据已成为企业和社会发展的核心资源。‌随着数据量的爆炸性增长&#xff0c;‌传统的单机计算模式已难以满足高效数据处理的需求。‌分布式计算技术应运而生&#xff0c;‌它通过将大规模计算任务分解成多个子任务&#xff0c;‌在多个计算节点上…

Docker Compose 部署 Kafka的KRaft模式 不用依赖 Zookeeper

前言 从 Kafka 2.8 开始&#xff0c;KRaft 模式允许 Kafka 在没有 Zookeeper 的情况下运行。本文将部署单机模式 1.新建 docker-compose.yml vim docker-compose.yml services:kafka:image: bitnami/kafka:3.6container_name: kafkaports:- "19092:9092"environm…

2024华为数通HCIP-datacom最新题库(H12-831变题更新⑩)

请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 近期打算考HCIP的朋友注意了&#xff0c;如果你准备去考试&#xff0c;还是用的之前的题库&#xff0c;切记暂缓。 1、…

SpringBoot整合SpringSecurity + JWT

SpringBoot整合SpringSecurity JWT 前置知识&#xff1a;Cookie&#xff0c;Session&#xff0c;Token Cookie&#xff0c;Session介绍 Cookie 、 Session 和 Token 是用于在 Web 应用程序中管理用户状态和身份验证的技术。因为在 Web 应用中&#xff0c; HTTP的通信是无状…

基于单片机的智能防盗窗户的设计

本设计是一种基于单片机的智能防盗窗户&#xff0c;采用STC89C52单片机作为核心控制器&#xff0c;配合DHT11温湿度传感器和MQ-2烟雾传感器等传感器和模块&#xff0c;用于收集室内环境数据&#xff0c;并通过单片机进行数据处理和控制。实现窗户状态的智能监测和防盗报警&…

CSEC:香港城市大学提出SOTA曝光矫正算法 | CVPR 2024

在光照条件不佳下捕获的图像可能同时包含过曝和欠曝。目前的方法主要集中在调整图像亮度上&#xff0c;这可能会加剧欠曝区域的色调失真&#xff0c;并且无法恢复过曝区域的准确颜色。论文提出通过学习估计和校正这种色调偏移&#xff0c;来增强既有过曝又有欠曝的图像。先通过…

HR人力资源OKR示例

O&#xff1a;提高内部员工敬业度和工作满意度 KR1: 开展9月每周五全体员工的会议与励志演讲主题 KR2: 采访36名员工&#xff0c;了解他们改善工作文化的需求 KR3: 在所有16个部门中使用OKR和Tita软件实施 KR4: 达到至少每周员工的满意度&#xff1a;4.7分 O&#xff1a;招聘工…

如何确定电脑与PLC有没有链接上

直接Ping一下 第一步&#xff1a;winR调出运行框 第二步&#xff1a;输入CMD-点确认 弹出运行框在里面输入Ping 192.168.10.1 失败状态 成功状态

关于Flink内存分配核心知识点

这个问题同样也是之前辅导过的同学的面试问题&#xff0c;这个问题非常接地气且考察面试者的实践经验。事实上&#xff0c;这也是我们大数据提高班的Flink专项提高部分内容。 下面我列举的这些就是核心&#xff0c;能答出这些重点即可。 内存模型在Flink1.9和Flink1.11版本做了…

EmguCV学习笔记 VB.Net 7.1 角点检测

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

【React】跨域问题详解及解决方案

文章目录 一、什么是跨域问题&#xff1f;1. 同源策略的定义2. CORS 机制 二、在 React 项目中遇到的跨域问题常见的跨域错误信息 三、解决 React 中跨域问题的方法1. 在后端服务器上配置 CORS2. 在 React 项目中使用代理 (Proxy)2.1 使用 http-proxy-middleware 实现代理1. 安…

SAP主数据删除

项目场景&#xff1a; SAP项目上线初期&#xff0c;主数据批到相关的操作 操作描述 需要对供应商&#xff0c;客户&#xff0c;科目进行维护操作&#xff0c;比如这些数据创建错误&#xff0c;不想留一些垃圾数据在系统里面 解决方案&#xff1a; 事务代码&#xff1a;OBR2…

低侧与高侧电流检测对比

1 简介 在处理低至中等电流水平时&#xff0c;电阻电流检测广泛用于印刷电路板组件。使用这种技术&#xff0c;将一个已知的电阻 R分流器与负载串联&#xff0c;并测量电阻两端的电压以确定负载电流。如下图所示。 电流检测电阻器&#xff0c;也称为分流电阻器或简称为分流器&a…

Python TensorFlow实战篇

概述 本篇博客将详细介绍如何使用Python和TensorFlow解决实际问题&#xff0c;包括图像分类、序列预测以及模型部署等内容。我们将从以下几个方面进行深入探讨&#xff1a; 图像分类实战&#xff1a;使用卷积神经网络&#xff08;CNN&#xff09;进行图像分类。序列预测实战&…

模型 KT决策法

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。系统分析&#xff0c;明智选择。 1 KT决策法的应用 1.1 餐饮连锁店菜单更新 一家餐饮连锁店计划更新菜单&#xff0c;以吸引更多顾客并提高销售额。使用 KT 决策法&#xff08;Kepner-Tregoe&#x…

哪些领域最适合采用音视频私有化解决方案?

随着数字化时代的到来&#xff0c;音视频通信已成为各行各业不可或缺的一部分&#xff0c;从企业内部沟通到在线教育、远程医疗、金融交易等&#xff0c;无一不依赖于稳定、高效且安全的音视频技术。然而&#xff0c;不同的行业对音视频通信的需求各不相同&#xff0c;尤其在数…

【Denuvo加密】黑神话悟空为什么没有破解版?Denuvo加密技术的详细解析与代码示例

文章目录 1. 引言2. 加密技术概述3. D加密技术的工作原理4. D加密技术的实现5. D加密技术的实际应用6.实现原理7. 本篇小结 更多相关内容可查看 1. 引言 随着游戏产业的蓬勃发展&#xff0c;游戏数据的保护成为了重要议题。《黑神话&#xff1a;悟空》作为一款备受期待的游戏&…

大型商业中心的绿色转型之路

在全球可持续发展浪潮的推动下&#xff0c;大型商业中心正悄然蜕变&#xff0c;从能源消耗大户转变为绿色运营的先锋。在这个转型的舞台上&#xff0c;商场电气管理者们以创新的智慧与坚定的决心&#xff0c;绘制出一幅幅节能减排、低碳生活的美好蓝图。 面对大型商业中心复杂…

职业本科物联网与智能感知实训室解决方案

一、前言 在当今这个数字化、智能化飞速发展的时代&#xff0c;物联网&#xff08;IoT&#xff09;与智能感知技术已成为推动产业升级、促进经济社会发展的重要力量。为了适应这一趋势&#xff0c;培养具备物联网技术应用与智能感知系统设计能力的高素质技术技能型人才&#xf…