百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

使用pytest进行单元测试

off999 2025-05-21 15:44 6 浏览 0 评论

一、pytest 简介

pytest 是 Python 中最流行的单元测试框架,相比内置的 unittest 更简洁高效,支持自动发现测试用例、参数化测试、异常验证及丰富的插件生态。其核心优势包括:

  • 简洁语法:使用 assert 语句替代复杂的 TestCase 类
  • 自动发现:自动识别 test_*.py 或 *_test.py 文件中的测试用例
  • 扩展性强:支持 900+ 插件(如生成 HTML 报告、分布式测试等)

二、安装与验证

  1. 安装命令
pip install pytest  # 基础安装
pip install pytest-html  # 可选:生成 HTML 测试报告
  1. 验证安装:
pytest --version  # 显示版本号即成功
  1. 测试文件命名规则
    测试文件需以 test_*.py 或 *_test.py 命名,测试函数以 test_ 开头。

三、编写第一个测试用例

假设我们有一个加法函数 add(),编写测试用例:

# math_operations.py
def add(a, b):
    return a + b

# test_math_operations.py
from math_operations import add

def test_add():
    assert add(1, 2) == 3  # 基础测试
    assert add(-1, 1) == 0  # 边界测试
    assert add(0, 0) == 0  # 特殊值测试

运行测试

pytest  # 自动发现并执行测试

输出示例:

collected 1 item
test_math_operations.py .  [100%]

四、参数化测试

使用 @pytest.mark.parametrize 批量测试多组数据:

import pytest

@pytest.mark.parametrize("a, b, expected", [
    (1, 2, 3),
    (-1, -1, -2),
    (100, 200, 300),
    ("a", "b", "ab")  # 类型测试
])
def test_add_parametrized(a, b, expected):
    assert add(a, b) == expected

五、Fixtures(测试夹具)

用于测试前后的资源准备与清理:

# conftest.py  # 全局夹具文件
import pytest

@pytest.fixture
def sample_data():
    return [1, 2, 3]

def test_sum(sample_data):
    assert sum(sample_data) == 6  # 使用夹具数据

作用域控制

  • function(默认):每个测试函数执行前后运行
  • class:每个测试类执行前后运行
  • module:每个模块执行前后运行

六、异常与标记

  1. 异常测试
def divide(a, b):
    if b == 0:
        raise ZeroDivisionError("除零错误")
    return a / b

def test_divide_by_zero():
    with pytest.raises(ZeroDivisionError):
        divide(10, 0)  # 验证异常类型
  1. 测试标记
  2. 定义标记:在 pytest.ini 中配置
[pytest]
markers = smoke: 冒烟测试, serial: 串行执行
  1. 应用标记:
@pytest.mark.smoke
def test_feature():
    pass  # 只有标记为 smoke 的测试会被选中运行

七、持续集成集成

在 Jenkins 中配置 pytest:

pipeline {
    agent any
    stages {
        stage('Test') {
            steps {
                sh 'pytest --junitxml=test-report.xml'  # 生成测试报告
            }
        }
    }
}

八、扩展工具

  • pytest-cov:生成代码覆盖率报告
  • pytest-xdist:支持多核并行测试加速
  • pytest-bdd:行为驱动开发(BDD)支持

九、最佳实践

  1. 命名规范 测试函数名:test_<功能描述>_<场景> 测试类名:Test<功能模块>
  2. 独立性
    每个测试用例应独立运行,避免共享状态。
  3. 分层设计
    推荐分层结构:
tests/
├── conftest.py  # 全局夹具
├── test_unit/    # 单元测试
└── test_integration/  # 集成测试

通过以上步骤,您可以快速搭建基于 pytest 的自动化测试体系。如需更复杂的插件(如生成 HTML 报告),可通过 pip install pytest-html 安装。

相关推荐

python匿名函数lambda的语法特点和应用场景

在Python的编程过程中,有时我们会碰到一些很简单的计算,但是感觉专门为这个计算创建个函数又觉得太小题大做,这时就可以用到lambda表达式。lambda是用于创建匿名函数,也就是没有具体名称的函...

Waitress,一个神奇的python库!

基本介绍WaitressWaitress是一个纯Python写的WSGI服务器,适用于开发与部署。它简单易用,能够满足基本的Web服务需求,并且具有较好的性能。特性简单性:易于配置和使用。可靠性:稳定...

Python 中的三个不寻常的事情 柯里化、海象和 Interning

柯里化柯里化是指不是一次性给函数所有参数,而是逐个给出。因此,每次都会创建一个新的函数。让我们看看Python中的快速手动实现defadd_curried(x):definner(y)...

带你使用Python在两类场景下自动采集日志数据(附程序)

各位同学,大家好。采集日志数据是重要的数据来源。本次课程教大家使用Python技术从Windows和Linux两个环境去自动采集日志数据,轻松应对各类日志采集需求。01Python实时采集本地文件数...

python多进程的分布式任务调度应用场景及示例

多进程的分布式任务调度可以应用于以下场景:分布式爬虫:importmultiprocessingimportrequestsdefcrawl(url):response=re...

Python自动化操控术:PyAutoGUI全场景实战指南

一、PyAutoGUI核心武器库解析1.1鼠标操控三剑客importpyautogui#绝对坐标移动(闪电速度)pyautogui.moveTo(100,200,duration=0....

python学习——031编程中需要定义函数的几种场景

在编程里,当出现下面几种情形时,定义函数是非常有必要的:代码复用当某段代码在程序里要多次使用时,把它定义成函数,能避免代码重复。这样既让代码更加简洁,也方便维护。比如在一个计算多个数字的平方和的程序中...

如何在python中开发桌面应用程序?请看文章

常用的工具和框架1.TkinterTkinter是Python的标准GUI库,适合简单的桌面应用。importtkinterastkdefon_button_click():label.co...

Python多进程与多线程应用场景对比

在Python中,多进程(Multiprocessing)和多线程(Multithreading)的选择取决于任务类型(I/O密集型vsCPU密集型)、Python的GIL限制以及并...

Python 集合的应用场景

Python集合的应用场景包括:去重:集合中的元素都是唯一的,可以用于去除列表或其他可迭代对象中的重复项。成员检查:可以快速地判断一个元素是否在集合中,这比在列表或其他可迭代对象中搜索要高效。数学操作...

Python缓存应用场景与实现分析

在Python开发中,缓存是优化性能的重要手段。以下是对缓存应用场景、实现方式及常见问题的系统分析:一、缓存应用场景计算密集型函数结果缓存O示例:递归计算斐波那契数列、复杂数学运算。O优势:避免重...

Python 从入门到精通:一个月就够了

要知道,一个月是一段很长的时间。如果每天坚持用6-7小时来做一件事,你会有意想不到的收获。作为初学者,第一个月的月目标应该是这样的:熟悉基本概念(变量,条件,列表,循环,函数)练习超过30个编...

Python 编程算法级优化

大家好,我是ICodeWR。今天要记录的是Python编程算法级优化相关知识。1空间换时间经典案例1.1预计算加速三角函数importmathimportnumpyasnp#传...

Python开发工程师必会技巧:匿名函数

点赞、收藏、加关注,下次找我不迷路一、啥是匿名函数?先把名字搞清楚咱们平时定义的普通函数,都是有名字的。比如这样:defsquare(x):returnx*x这里的square就是...

越聪明越会撒谎?OpenAI推理模型o3/o4-mini幻觉率翻倍,嘴还很硬

OpenAI最新发布的推理AI模型o3和o4-mini在性能上又创新高,就在大家期待它能进一步提升日常工作的生产力时,许多用户却发现,它们的幻觉率却比前代模型要高了不少。据OpenAI...

取消回复欢迎 发表评论: