--- sources: [summaries/08_Testing_debugging__00_Overview.md, summaries/01_Testing.md] 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` 中,测试通常需要: 1. 导入 `unittest`; 2. 定义继承自 `unittest.TestCase` 的测试类; 3. 编写以 `test` 开头的方法; 4. 使用 `self.assertEqual()`、`self.assertTrue()` 等断言方法; 5. 通过 `unittest.main()` 或测试运行器执行。 而在 `pytest` 中,简单测试可以直接写成普通函数,并使用 Python 内置的 `assert`: ```python # 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]] 中,运行方式示例为: ```bash python -m pytest ``` 执行该命令后,`pytest` 会自动收集测试并运行它们。 相关概念:测试发现、测试运行器 ## 使用 assert 编写测试 `pytest` 的一个重要特点是直接使用 Python 的 `assert` 语句表达测试条件: ```python assert simple.add(2, 2) == 4 ``` 这与 `unittest` 中的写法形成对比: ```python 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/断言]]:用表达式检查程序假设或测试预期。 - 测试发现:测试框架自动查找测试文件和测试函数的机制。 See also: [[summaries/08_Testing_debugging__00_Overview]]