pytest安装与第一个测试用例编写指南

Miles
Miles
发布时间:2026-10-26| 4人浏览过
原创

在 Python 生态中,自动化测试能够确保程序逻辑在持续迭代中保持可靠。本文的核心任务是:在独立的虚拟环境中规范安装 pytest 测试框架,理解其自动发现机制,并编写与运行首个基于原生 assert 的测试用例。跟随本文步骤,读者可以在本地终端中建立完整的测试执行流程,并掌握测试结果分析方法。

一、准备环境与安装 pytest

在安装测试工具之前,推荐先为项目创建隔离的虚拟环境。通过虚拟环境管理依赖,可以避免不同项目间的包版本冲突,保持操作系统全局 Python 环境的清洁。

1. 依赖管理方式的选择:虚拟环境 vs 全局安装

在开发过程中,安装 Python 库通常有两种途径:直接执行全局安装,或在专属虚拟环境中按需配置。了解两者在一致运行条件下的差异有助于避免后续隐患:

  • 全局环境安装:使用 pip install pytest 直接作用于系统或用户主环境。虽然免去了环境切换操作,但如果多个项目分别依赖不同版本的第三方插件或底层库,版本覆盖会导致难以排查的环境污染。
  • 虚拟环境隔离安装:通过 python -m venv .venv 在工程目录下创建沙盒。项目所有依赖及其二进制执行脚本(如 pytest 命令)均被限定在当前文件夹内,与外部隔离,保证了测试环境在不同机器上的可重现性。

2. 创建虚拟环境并安装

打开终端进入你的代码目录,按照顺序执行以下命令:

# 1. 创建名为 .venv 的虚拟环境目录
python3 -m venv .venv

# 2. 激活虚拟环境 (macOS / Linux)
source .venv/bin/activate

# 若在 Windows PowerShell 环境中,请使用:
# .venv\Scripts\Activate.ps1

# 3. 安装 pytest 核心库
pip install pytest

3. 验证安装结果

安装完成后,可以直接查询 pytest 版本号,以确认可执行程序已正确链接到当前虚拟环境中:

pytest --version
示例命令输出
pytest 8.3.3 (Python 3.11.x)

如果终端能够准确输出版本号,说明 pytest 工具链已准备就绪。

pytest安装与第一个测试用例编写指南
图 1:pytest 从环境创建、安装到执行验证的标准操作路径

二、理解 pytest 的测试用例发现规则

与许多需要手动注册测试清单的工具不同,pytest 采用了开箱即用的“测试发现”(Test Discovery)机制。当在项目根目录运行 pytest 命令时,它会按固定的命名约定自动遍历目录并识别测试目标:

  • 测试文件命名:只搜集文件名以 test_*.py 开头或以 *_test.py 结尾的 Python 脚本。例如 test_calc.py 合法,而 calc_tests.py(复数形式)默认会被跳过。
  • 测试函数命名:文件中定义的顶层函数必须以 test_*() 作为前缀,pytest 会将其视作一个独立的测试用例。
  • 测试类规范(可选):如果将用例组织在类中,类名必须以 Test* 开头,且该类不能包含 __init__ 构造方法。类内的方法同样需以 test_*() 开头。
pytest安装与第一个测试用例编写指南
图 2:pytest 从文件遍历到函数收集的自动发现流程机制

三、编写第一个测试用例

为了让用例具有明确的针对性,先编写一个待测的业务函数,再为其设计对应的单元测试。

1. 编写业务逻辑代码

在项目根目录下新建一个名为 calculator.py 的文件,编写包含两个基础数值运算的函数:

# calculator.py
def add(a: int, b: int) -> int:
    """返回两数相加之和"""
    return a + b

def divide(a: float, b: float) -> float:
    """返回两数相除结果,除数为0时抛出 ValueError"""
    if b == 0:
        raise ValueError("除数不能为零")
    return a / b

2. 编写测试代码

在同级目录下新建测试文件 test_calculator.py。这里使用标准的前缀命名,确保 pytest 可以自动识别:

# test_calculator.py
import pytest
from calculator import add, divide

def test_add_positive_numbers():
    """验证正整数相加结果"""
    result = add(2, 3)
    assert result == 5

def test_add_negative_numbers():
    """验证负数相加结果"""
    result = add(-1, -1)
    assert result == -2

def test_divide_normal():
    """验证正常除法计算"""
    assert divide(10, 2) == 5.0

def test_divide_zero_exception():
    """验证除以零时正确抛出指定的异常类型与信息"""
    with pytest.raises(ValueError) as exc_info:
        divide(5, 0)
    assert "除数不能为零" in str(exc_info.value)

3. 断言风格对比:pytest 原生 assert vs unittest 断言方法

在传统测试框架(如 Python 内置的 unittest)中,测试用例必须使用专门的方法进行判定,例如 self.assertEqual(a, b) 或 self.assertRaises(...)。这种差异对代码书写和理解产生直接影响:

  • unittest 编写模式:必须继承 unittest.TestCase 基类,测试逻辑被束缚在面向对象的模板中。开发者需要记忆数十个专用断言方法,增加心智负担。
  • pytest 编写模式:直接使用 Python 核心语言的 assert 关键字,不需要记忆框架特有的断言 API。更重要的是,pytest 在运行阶段通过 AST(抽象语法树)进行“断言重写”(Assert Rewriting),在断言失败时能够自动解析并打印出等式左右两边的所有中间变量与表达式值,既保留了语法的极简,又提供了工业级的诊断信息。
pytest安装与第一个测试用例编写指南
图 3:pytest 原生断言与 unittest 传统断言机制的核心差异对比

四、执行测试与分析控制台输出

编写完测试文件后,在当前项目根目录下运行测试命令。

1. 常用执行命令

# 基础命令:自动搜集所有测试并打印摘要
pytest

# 详细模式(推荐):逐一显示每个测试函数的名称与执行状态
pytest -v

# 仅指定执行某一文件:
pytest test_calculator.py

# 关键字筛选执行:仅运行函数名包含 "divide" 的用例
pytest -k "divide"

2. 运行通过时的示例输出

运行 pytest -v 后,控制台将显示类似下方的报告:

示例运行成功输出 (pytest -v)
============================= test session starts ============================== platform darwin -- Python 3.11.8, pytest-8.3.3, pluggy-1.5.0 -- /workspace/.venv/bin/python rootdir: /workspace collected 4 items test_calculator.py::test_add_positive_numbers PASSED [ 25%] test_calculator.py::test_add_negative_numbers PASSED [ 50%] test_calculator.py::test_divide_normal PASSED [ 75%] test_calculator.py::test_divide_zero_exception PASSED [100%] ============================== 4 passed in 0.02s ===============================

从输出中可以清晰看到每个用例的执行结果均为 PASSED,用时仅 0.02 秒。

3. 断言失败时的排查视角

为了体验 pytest 的报错解析能力,可以在测试中引入一个错误断言,例如修改期望值:

def test_add_wrong():
    # 2 + 3 实际为 5,故意断言等于 6
    assert add(2, 3) == 6

再次运行 pytest 时,控制台不仅指出哪一行断言失败,还会将求值过程完全展开:

示例运行失败输出
_______________________________ test_add_wrong ________________________________ def test_add_wrong(): > assert add(2, 3) == 6 E assert 5 == 6 E + where 5 = add(2, 3) test_calculator.py:22: AssertionError =========================== short test summary info ============================ FAILED test_calculator.py::test_add_wrong - assert 5 == 6 ========================= 1 failed, 4 passed in 0.03s ==========================

信息中明确标出了 where 5 = add(2, 3) 以及 assert 5 == 6。这种由断言重写机制提供的精确信息,让开发者无需插入额外的 print() 语句即可快速定位计算偏差。

五、常见问题排查与注意事项

问题一:提示 “command not found: pytest”

原因:当前终端会话未激活虚拟环境,或者 pytest 的安装路径未包含在系统 PATH 环境变量中。
解决方法:确认执行 source .venv/bin/activate 后再次尝试;或者直接通过当前环境的 Python 解释器启动:python -m pytest,该方式能保证调用的正是当前 Python 绑定的 pytest。

问题二:提示 “collected 0 items”

原因:测试目录中没有找到匹配规则的文件或函数。
解决方法:核对文件名是否为 test_*.py 或 *_test.py;核对测试函数是否以 test_ 开头;若使用了测试类,检查类名是否为 Test* 并且确认没有显式声明 def __init__(self)。

问题三:模块导入错误 “ModuleNotFoundError: No module named 'calculator'”

原因:运行 pytest 时的当前工作目录不在项目根路径,导致 Python 的搜索路径未包含被测模块。
解决方法:在包含 calculator.py 的根目录下直接执行 pytest,或者使用 python -m pytest 命令,后者会自动将当前目录添加到 sys.path 中。

六、要点总结

掌握 pytest 的使用可以归纳为四项基础实践原则:通过环境隔离保证依赖纯净、遵循命名约定实现零配置发现、借助原生断言编写清晰用例、利用丰富参数掌控测试执行。

pytest安装与第一个测试用例编写指南
图 4:pytest 核心使用规范与实践要点思维导图
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。