在我们刚开始学编程时,通常写完代码,能够按预期效果运行,实现功能就算完事了。
但实际上,这样的程序很可能还存在隐藏的错误。例如,一个计算函数在常规输入下正常,但在边界条件下(如空输入或负数)可能失败。手动检查耗时且容易遗漏。
因此,除了开发之外,我们还需要对代码进行测试。
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的新书《码上行动:用ChatGPT学会Python编程》已经上市了。本书以ChatGPT为辅助,系统全面地讲解了如何掌握Python编程,适合Python零基础入门的读者学习。【点此查看详细介绍】
购买后可加入读者交流群,Crossin为你开启陪读模式,解答你在阅读本书时的一切疑问。
Crossin的其他书籍:
添加微信 crossin123 ,加入编程教室共同学习~
感谢转发和点赞的各位~