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

发布时间:2024年01月11日

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

?

图片

Pytest 简介

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

图片

安装与基本使用

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

pip?install?pytest

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

#?test_example.py

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

def?test_add():
????assert?add(1,?2)?==?3

然后在命令行中运行 Pytest:

pytest?test_example.py

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

=============================?test?session?starts?==============================
...

==============================?1?passed?in?0.10?seconds?==============================

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

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

图片

测试用例书写规范

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

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

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

?

图片

断言

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

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

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

?

图片

参数化测试

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

import?pytest

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

?

图片

Fixture

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

import?pytest

#?Fixture
@pytest.fixture
def?sample_data():
????return?[1,?2,?3,?4,?5]

#?使用?Fixture
def?test_list_length(sample_data):
????assert?len(sample_data)?==?5

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

?

图片

插件系统

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

#?安装一个?Pytest?插件
pip?install?pytest-html

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

pytest?--html=report.html

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

?

图片

Mocking 和 Monkeypatching

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

#?使用?pytest-mock?插件
def?test_example(mocker):
????mocker.patch("module.function",?return_value=42)
????assert?module.function()?==?42

?

图片

测试覆盖率

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

#?安装?pytest-cov?插件
pip?install?pytest-cov

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

pytest?--cov=my_module

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

输出结果如下:

=============================?test?session?starts?==============================
...

Name???????????????????????????Stmts???Miss??Cover
--------------------------------------------------
my_module.py??????????????????????10??????2????80%
tests/test_my_module.py????????????5??????0???100%
--------------------------------------------------
TOTAL?????????????????????????????15??????2????87%

==============================?X?passed?in?Y.YY?seconds?==============================

在这个例子中:

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

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

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

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

?

图片

参数化测试

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

#?参数化测试
@pytest.mark.parametrize("input_a,?input_b,?expected",?[(1,?2,?3),?(4,?5,?9),?(0,?0,?0)])
def?test_addition(input_a,?input_b,?expected):
????result?=?add(input_a,?input_b)
????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自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

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

文章来源:https://blog.csdn.net/m0_58026506/article/details/135532013
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。