news 2026/4/18 11:08:46

pytest 入门指南:从零开始掌握 Python 测试框架的核心概念与使用方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
pytest 入门指南:从零开始掌握 Python 测试框架的核心概念与使用方法

第15篇. pytest 入门指南:从零开始掌握 Python 测试框架的核心概念与使用方法**

1. 什么是 pytest?为什么选择它?

pytest是目前 Python 生态中最受欢迎的测试框架。它简洁、强大、插件丰富,被广泛用于单元测试、集成测试、API 测试、自动化测试等场景。

相比 unittest,pytest 的优势

  • 测试函数无需继承类,写法更简洁
  • 使用原生 assert 语句,失败信息更清晰
  • 支持参数化测试、fixture、标记、插件系统
  • 自动发现测试文件和测试函数
  • 丰富的命令行选项和报告

2. 安装与基本使用

Bash

pip install pytest

验证安装:

Bash

pytest --version

创建一个简单测试文件 test_demo.py:

Python

# test_demo.py def test_addition(): assert 1 + 1 == 2 def test_subtraction(): assert 5 - 3 == 2

运行测试:

Bash

pytest

或更详细输出:

Bash

pytest -v

3. 核心概念

3.1 测试发现规则

pytest 自动发现以下文件和函数:

  • 文件名以 test_ 开头 或 以 _test.py 结尾
  • 函数名以 test_ 开头
  • 类名以 Test 开头,方法名以 test_ 开头
3.2 断言(assert)

pytest 使用 Python 原生 assert,失败时会显示详细差异:

Python

def test_list(): numbers = [1, 2, 3] assert len(numbers) == 3 assert 2 in numbers assert numbers == [1, 2, 3] # 失败时会显示详细对比
3.3 测试类(可选)

Python

class TestCalculator: def test_add(self): assert 1 + 2 == 3 def test_divide(self): assert 10 / 2 == 5

4. 基本方法与常用特性

4.1 参数化测试(最常用特性)

使用 @pytest.mark.parametrize 一组数据运行多次测试:

Python

import pytest @pytest.mark.parametrize("a, b, expected", [ (1, 2, 3), (0, 0, 0), (-1, 1, 0), (10, -5, 5), ]) def test_add(a, b, expected): assert a + b == expected
4.2 fixture(测试前置/后置)

fixture 是 pytest 最强大的特性之一,用于准备测试数据、初始化对象、清理资源:

Python

import pytest @pytest.fixture def sample_list(): return [1, 2, 3, 4, 5] def test_list_length(sample_list): assert len(sample_list) == 5 def test_list_sum(sample_list): assert sum(sample_list) == 15

常用 fixture 作用域

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

使用 pytest.raises 验证异常:

Python

import pytest def divide(a, b): return a / b def test_divide_by_zero(): with pytest.raises(ZeroDivisionError): divide(10, 0)
4.4 标记(markers)

用于分类、跳过、预期失败等:

Python

import pytest @pytest.mark.smoke # 冒烟测试 def test_login(): assert True @pytest.mark.skip(reason="功能未完成") def test_new_feature(): assert False @pytest.mark.xfail(reason="已知 bug") def test_known_bug(): assert 1 + 1 == 3

常用标记:

  • @pytest.mark.skip
  • @pytest.mark.xfail
  • @pytest.mark.parametrize
  • @pytest.mark.slow
  • @pytest.mark.integration

5. 常用 pytest 命令

Bash

pytest # 运行所有测试 pytest -v # 详细输出 pytest tests/ # 指定目录 pytest -k "add" # 运行名称包含 "add" 的测试 pytest --tb=line # 简化错误堆栈 pytest --cov=src --cov-report=html # 生成覆盖率报告 pytest -m smoke # 运行带 @pytest.mark.smoke 的测试 pytest --maxfail=3 # 最多允许 3 个失败后停止

6. 最佳实践建议

  1. 测试文件统一命名为 test_xxx.py
  2. 一个测试函数只验证一个行为
  3. 使用 fixture 复用测试数据
  4. 优先使用参数化测试代替重复代码
  5. 为复杂 fixture 添加文档字符串
  6. 使用 conftest.py 定义全局 fixture
  7. 定期运行覆盖率检查(目标 > 80%)

7. 小结

pytest 的核心优势在于:

  • 简洁的语法(无需类继承,使用原生 assert)
  • 强大的参数化与 fixture
  • 灵活的发现与标记机制
  • 丰富的插件生态

掌握了测试函数、assert、参数化、fixture 这四个基本概念,你就已经具备了用 pytest 编写高质量测试的能力。

进阶方向

  • 自定义 fixture 作用域与依赖
  • pytest-mock 模拟外部依赖
  • 异步测试(pytest-asyncio)
  • API 测试(requests + pytest)
  • 报告生成(pytest-html、allure)

推荐资源

  • 官方文档:https://docs.pytest.org
  • pytest 中文文档:https://pytest.org.cn
  • Real Python pytest 教程

你现在就可以创建一个 tests/ 目录,写下第一个 test_xxx.py 文件,运行 pytest 试试看!

上一篇总目录下一篇

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:55:37

告别手动抠图!Qwen-Image-Layered自动分层实测

告别手动抠图!Qwen-Image-Layered自动分层实测 2025年12月19日,当设计师还在为一张电商主图反复调整蒙版、微调边缘、导出多层PSD时,阿里通义千问团队悄然发布了Qwen-Image-Layered——一个不生成“一张图”,而是直接输出“一套图…

作者头像 李华
网站建设 2026/4/18 0:28:09

AI如何智能管理你的LOCAL文件夹?

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个AI驱动的LOCAL文件夹管理工具,能够自动扫描指定目录,识别并分类文件类型(如代码、文档、图片等),检测重复文件并…

作者头像 李华
网站建设 2026/4/18 7:56:43

【Django毕设源码分享】django基于web的中医药膳慢性病食疗平台的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/18 10:58:23

ZCODE vs 传统开发:效率提升10倍的秘密

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个任务管理工具,对比传统手动编码和ZCODE自动生成的效率差异。工具应包含任务创建、分配、进度跟踪等功能。传统方式使用Java Spring Boot和Vue.js,Z…

作者头像 李华
网站建设 2026/4/18 9:57:40

量化回测框架全攻略:从策略研发到实盘部署的技术实践

量化回测框架全攻略:从策略研发到实盘部署的技术实践 【免费下载链接】backtrader 项目地址: https://gitcode.com/gh_mirrors/bac/backtrader 量化回测框架是量化交易系统的核心组件,它能够帮助开发者验证策略有效性、优化参数配置并降低实盘风…

作者头像 李华
网站建设 2026/4/18 8:15:52

零基础精通游戏菜单开发:YimMenuV2实战指南与7大核心模块解析

零基础精通游戏菜单开发:YimMenuV2实战指南与7大核心模块解析 【免费下载链接】YimMenuV2 Unfinished WIP 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenuV2 引言:为什么选择YimMenuV2? 游戏菜单开发往往面临技术门槛高、…

作者头像 李华