首页
学习
活动
专区
圈层
工具
发布

pytest:为你的Python代码做“体检”

在我们刚开始学编程时,通常写完代码,能够按预期效果运行,实现功能就算完事了。

但实际上,这样的程序很可能还存在隐藏的错误。例如,一个计算函数在常规输入下正常,但在边界条件下(如空输入或负数)可能失败。手动检查耗时且容易遗漏。

因此,除了开发之外,我们还需要对代码进行测试。

pytest 是一个 Python 测试框架,用于自动化验证代码的正确性。它通过简单的语法和清晰的错误提示,帮助开发者快速发现问题,确保代码在多种场景下可靠运行。

pytest 接口简洁,易于上手,适合单元测试和小型项目。相比 Python 内置的 unittest,pytest 无需复杂的类结构,测试更直观。

1. 安装与运行

pytest 可在控制台通过 pip 命令进行安装:

pip install pytest

编写一个简单测试,保存为 test_example.py:

def test_add():   assert 1 + 1 == 2

在终端运行 pytest,pytest 会自动发现并执行以 test_ 开头的文件和函数。

选项:使用 pytest -v 查看详细输出,显示每个测试的通过/失败状态。

2. 编写测试用例

测试用例是普通的 Python 函数,需以 test_ 开头,使用 assert 验证结果。

示例 1:测试字符串方法

def test_string():   assert "hello".upper() == "HELLO"

示例 2:测试自定义函数

def add(a, b):   return a + b

def test_add():   assert add(2, 3) == 5   assert add(0, 0) == 0

测试函数应清晰描述测试目标,并保持独立性。

3. 参数化测试

使用 @pytest.mark.parametrize 测试函数在不同输入下的行为,可减少重复代码。

示例:测试一个乘二函数

import pytest

@pytest.mark.parametrize("input,expected", [(1, 2), (3, 6), (5, 10)])def test_double(input, expected):   assert input * 2 == expected

这样在提高测试覆盖率的同时,可保持代码简洁。

4. 错误提示

如有断言失败,pytest 会提供具体的错误位置,便于定位问题。

示例:

def test_wrong():   assert 1 + 1 == 3

运行 pytest,输出会显示 assert 1 + 1 == 3 这行出错。

5. 常见问题

测试未运行:确保文件名和函数名以 test_ 开头。

运行缓慢:使用 pytest test_file.py 只运行特定文件。

结果不清晰:使用 pytest -v 查看详细测试结果。

6. 进阶学习

掌握基础后,可进一步探索以下 pytest 高级功能:

夹具(Fixtures):使用 @pytest.fixture 创建可重用的测试数据或环境设置,简化测试准备和清理。

异常测试:通过 pytest.raises 验证代码是否按预期抛出异常

标记(Markers):使用 @pytest.mark 为测试添加标签,如跳过测试(skip)或标记特定测试组。

插件系统:集成插件如 pytest-cov(测试覆盖率)、pytest-mock(模拟对象)以扩展功能。

配置与定制:通过 pytest.ini 文件配置默认行为,如设置默认参数或自定义测试发现规则。

并行测试:使用 pytest-xdist 插件加速测试执行,适合大型项目。

测试报告:生成 JUnit XML 或 HTML 报告,集成到持续集成(CI)流程中。

如果本文对你有帮助,欢迎点赞、评论、转发。你们的支持是我更新的动力~

购买后可加入读者交流群,Crossin为你开启陪读模式,解答你在阅读本书时的一切疑问。

Crossin的其他书籍:

感谢转发点赞的各位~

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O5eWMPGkzQv-oYlOmFN85UpQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。
领券