4.9 KiB
sources, brief
| sources | brief | ||
|---|---|---|---|
|
pytest 是一个简洁、自动发现测试的 Python 第三方测试框架。 |
pytest
pytest 是 Python 生态中流行的第三方测试工具,用于编写、发现和运行测试。相较于标准库中的 unittest,pytest 通常语法更简洁,入门成本较低,同时也具备强大的扩展能力。
本文概念来自 summaries/01_Testing。
核心定义
pytest 是一个测试框架,主要用于:
- 编写单元测试和功能测试;
- 自动发现测试文件和测试函数;
- 执行测试并报告成功、失败和异常信息;
- 使用普通的 Python
assert表达测试预期。
在 summaries/01_Testing 中,pytest 被作为 Python 标准库 unittest 的替代方案介绍。文档指出,unittest 的优势是内置于 Python、随处可用,但不少程序员认为它写法较冗长;而 pytest 能让测试文件更简洁。
相关概念:软件测试、concepts/单元测试、Python unittest
与 unittest 的对比
在 unittest 中,测试通常需要:
- 导入
unittest; - 定义继承自
unittest.TestCase的测试类; - 编写以
test开头的方法; - 使用
self.assertEqual()、self.assertTrue()等断言方法; - 通过
unittest.main()或测试运行器执行。
而在 pytest 中,简单测试可以直接写成普通函数,并使用 Python 内置的 assert:
# test_simple.py
import simple
def test_simple():
assert simple.add(2, 2) == 4
def test_str():
assert simple.add('hello', 'world') == 'helloworld'
这种写法省去了测试类和大量 self.assert... 方法调用,使测试代码更接近普通 Python 代码。
相关概念:测试断言、concepts/断言、测试用例
测试发现机制
pytest 会自动发现测试。通常只要测试文件和测试函数遵循命名约定,例如:
- 文件名类似
test_*.py; - 函数名以
test_开头;
pytest 就能找到这些测试并运行。
在 summaries/01_Testing 中,运行方式示例为:
python -m pytest
执行该命令后,pytest 会自动收集测试并运行它们。
相关概念:测试发现、测试运行器
使用 assert 编写测试
pytest 的一个重要特点是直接使用 Python 的 assert 语句表达测试条件:
assert simple.add(2, 2) == 4
这与 unittest 中的写法形成对比:
self.assertEqual(simple.add(2, 2), 4)
这种风格有几个优点:
- 更短;
- 更直观;
- 更接近普通 Python 表达式;
- 降低初学者编写测试的门槛。
不过,assert 在测试中的用途不同于生产代码中的内部不变量检查。生产代码中的 assert 更适合表达“理论上永远应该成立”的内部条件;测试代码中的 assert 则用于表达被测代码的预期行为。
相关概念:concepts/断言、冒烟测试、程序不变量
适用场景
pytest 适用于多种 Python 测试场景,包括:
- 测试单个函数的返回值;
- 测试类和对象的行为;
- 测试属性计算是否正确;
- 测试方法调用后的状态变化;
- 测试异常是否按预期抛出;
- 为大型项目组织自动化测试套件。
在 summaries/01_Testing 的上下文中,如果使用 pytest 测试一个简单的 add() 函数,可以不创建测试类,只需定义测试函数。
相关概念:面向对象测试、属性测试、异常测试
与 Python 测试理念的关系
summaries/01_Testing 强调:由于 Python 是动态语言,没有编译器帮助提前捕获大量错误,因此测试非常重要。pytest 正是服务于这一需求的工具之一。
它帮助开发者更容易地:
- 编写测试;
- 频繁运行测试;
- 快速发现行为错误;
- 用测试保护已有功能;
- 在修改代码时降低回归风险。
因此,pytest 不只是一个命令行工具,而是 Python 项目中实践 软件测试 和 concepts/单元测试 的常用基础设施。
核心要点
pytest是 Python 第三方测试框架。- 它通常比标准库
unittest更简洁。 - 测试可以写成普通函数。
- 测试预期可以直接用 Python
assert表达。 - 可通过
python -m pytest运行测试。 pytest会自动发现符合命名约定的测试。- 它适合从简单脚本到大型应用的测试实践。
相关页面
- summaries/01_Testing:介绍 Python 测试、断言、
unittest和pytest。 - 软件测试:测试在软件开发中的总体作用。
- concepts/单元测试:对函数、类、模块等小单元进行验证。
- Python unittest:Python 标准库测试框架。
- concepts/断言:用表达式检查程序假设或测试预期。
- 测试发现:测试框架自动查找测试文件和测试函数的机制。