当前位置:   article > 正文

Pytest:单元测试的宠儿,让 Bug 无处藏身!

Pytest:单元测试的宠儿,让 Bug 无处藏身!

软件开发中,确保代码的质量和稳定性是至关重要的。单元测试作为保障代码质量的重要手段之一,为开发者提供了在开发过程中验证代码逻辑的有效方式。而在众多的单元测试框架中,Pytest 凭借其简洁灵活的语法和强大的功能逐渐成为了开发者们的宠儿。本文将深入探讨 Pytest 的各个方面,带你领略这个在单元测试领域的佼佼者,一起让 Bug 无处藏身!

图片

Pytest 简介

Pytest 是一个用于 Python 的单元测试框架,它旨在简化并且加速测试编写和执行过程。相较于 Python 内建的 unittest 框架,Pytest 提供了更简洁、直观的语法,并且支持丰富的插件,使得测试变得更加灵活和高效。无论是小型项目还是大型项目,Pytest 都能够提供强大的测试支持,帮助开发者确保代码质量

图片

安装与基本使用

要使用 Pytest,首先需要安装它。可以使用以下命令通过 pip 安装:

pip install pytest

创建一个简单的测试文件,比如 test_example.py

  1. test_example.py
  2. def add(a, b):
  3.     return a + b
  4. def test_add():
  5.     assert add(12== 3

然后在命令行中运行 Pytest:

pytest test_example.py

如果一切顺利,你将看到类似如下的输出:

  1. ============================= test session starts ==============================
  2. ...
  3. ============================== 1 passed in 0.10 seconds ==============================

这表示测试通过了!这只是一个简单的入门示例,接下来我们将深入了解 Pytest 的各种功能。

  1. 现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
  2. 如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
  3. 可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
  4. 分享他们的经验,还会分享很多直播讲座和技术沙龙
  5. 可以免费学习!划重点!开源的!!!
  6. qq群号:691998057【暗号:csdn999

 

图片

测试用例书写规范

在 Pytest 中,测试用例的命名规范是非常灵活的,但有一些推荐的命名规范,比如以 test_ 开头:

  1. # 推荐的命名规范
  2. def test_addition():
  3.     assert add(12== 3

Pytest 会自动识别以 test_ 开头的函数并执行它们。

图片

断言

Pytest 使用断言(assertions)来验证测试条件是否满足。当断言失败时,Pytest 会输出详细的错误信息,帮助开发者迅速定位问题。

  1. def test_addition():
  2.     result = add(12)
  3.     assert result == 3, f"Expected 3, but got {result}"

在这个例子中,如果 add(1, 2) 的结果不等于 3,测试将失败并输出相应的错误信息。

图片

参数化测试

Pytest 支持参数化测试,通过 @pytest.mark.parametrize 装饰器可以轻松实现对同一测试用例的多组输入进行测试。

  1. import pytest
  2. # 参数化测试
  3. @pytest.mark.parametrize("input_a, input_b, expected", [(123), (459), (000)])
  4. def test_addition(input_a, input_b, expected):
  5.     result = add(input_a, input_b)
  6.     assert result == expected, f"Expected {expected}, but got {result}"

图片

Fixture

Fixture 是 Pytest 中用于提供测试数据或者初始化测试环境的一种机制。通过使用 @pytest.fixture 装饰器,我们可以在测试用例中使用 Fixture 提供的数据或者服务。

  1. import pytest
  2. # Fixture
  3. @pytest.fixture
  4. def sample_data():
  5.     return [12345]
  6. # 使用 Fixture
  7. def test_list_length(sample_data):
  8.     assert len(sample_data== 5

Fixture 的强大之处在于它可以在整个测试会话的生命周期内提供数据,并且可以被多个测试用例共享。

图片

插件系统

Pytest 提供了强大的插件系统,允许开发者通过插件扩展 Pytest 的功能。有丰富的第三方插件可用,也支持自定义插件以满足特定项目的需求。

  1. # 安装一个 Pytest 插件
  2. pip install pytest-html

然后在运行测试时,使用插件:

pytest --html=report.html

这将生成一个 HTML 格式的测试报告。

图片

Mocking 和 Monkeypatching

在单元测试中,模拟(mocking)和猴子补丁(monkeypatching)是常用的技术,用于模拟测试中的外部依赖或者修改运行时的环境。Pytest 提供了 pytest-mock 插件,简化了模拟的过程。

  1. # 使用 pytest-mock 插件
  2. def test_example(mocker):
  3.     mocker.patch("module.function"return_value=42)
  4.     assert module.function() == 42

图片

测试覆盖率

测试覆盖率是评估测试质量的重要指标。Pytest 可以与第三方工具如 pytest-cov 集成,以便测量测试覆盖率。

  1. # 安装 pytest-cov 插件
  2. pip install pytest-cov

然后在运行测试时,使用插件:

pytest --cov=my_module

这将生成一个测试覆盖率的报告,显示代码中哪些部分被测试覆盖。下面是一个输出结果示例:

输出结果如下:

  1. ============================= test session starts ==============================
  2. ...
  3. Name                           Stmts   Miss  Cover
  4. --------------------------------------------------
  5. my_module.py                      10      2    80%
  6. tests/test_my_module.py            5      0   100%
  7. --------------------------------------------------
  8. TOTAL                             15      2    87%
  9. ============================== X passed in Y.YY seconds ==============================

在这个例子中:

  • Stmts 表示代码文件的总语句数。

  • Miss 表示未被测试覆盖到的语句数。

  • Cover 表示测试覆盖率的百分比。

这个报告告诉你哪些代码被测试覆盖,哪些没有被测试到。在实际应用中,你可以根据这些信息来进一步完善测试用例,提高测试覆盖率,从而增加代码的稳定性和可维护性。

图片

参数化测试

Pytest 提供了强大的参数化测试功能,使得可以使用一组参数运行相同的测试用例,从而减少冗余的代码。

  1. # 参数化测试
  2. @pytest.mark.parametrize("input_a, input_b, expected", [(123), (459), (000)])
  3. def test_addition(input_a, input_b, expected):
  4.     result = add(input_a, input_b)
  5.     assert result == expected, f"Expected {expected}, but got {result}"

在这个例子中,test_addition 函数将以不同的参数运行三次,分别验证相应的结果。

图片

总 结

通过本文的介绍,我们深入了解了 Pytest 的基本使用和一些高级特性。Pytest 以其简洁而灵活的语法、强大的功能和丰富的插件生态系统,在单元测试领域脱颖而出。无论是初学者还是有经验的开发者,都能够轻松上手,并且通过合理的使用 Fixture、参数化测试等功能,使得测试代码更加简洁高效。同时,Pytest 还支持与持续集成工具的集成,使得测试过程更加自动化,确保代码的质量和稳定性。

在实际项目中,良好的单元测试是保障软件质量的关键一环。通过 Pytest,我们可以编写清晰、简洁、高效的测试代码,让我们的代码在开发过程中更加健壮,让 Bug 在无处可逃。Pytest 不仅是单元测试的宠儿,更是我们提高代码质量、保障项目稳定性的得力助手。希望通过本文的介绍,你能更好地利用 Pytest 进行单元测试,让你的项目质量更上一层楼。

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:程序员小濠 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/132006
推荐阅读
相关标签
  

闽ICP备14008679号