7k Star 的 Python 测试框架入门指南

Pytest 是一款 Python 测试框架及测试运行器。在本指南中,我们将会介绍 pytest 最有用和常见的配置和用法,以及几个 pytest 插件和外部库。尽管 Python 的标准库中已经自带了 unittest 模块,并且也还有其他 Python 测试框架(例如 nose2 或 Ward),但 pytest 仍然是我的最爱。使用简单函数而不是类层次结构,一个简单断言(assert)而不是许多不同的 assert 函数,内置的参数化测试,完善的 fixture 系统以及一定量的可用插件,这些特性让 Pytest 用起来很顺手。

Pytest 源码主页

https://github.com/pytest-dev/pytest

图片

本文的示例代码

https://github.com/stribny/python-pytest

pytest基础

在安装 pytest 后,例如用poetry执行poetry add pytest --dev,我们可以通过执行 pytest 或执行python -m pytest来运行我们的测试套件,这还会将当前目录添加到 sys.path 中。

Pytest将自动在我们的代码库中扫描测试模块,会查找符合文件名称格式test_*.py*_test.py的文件,扫描它们并查找名为test_*()的函数。如果要运行类内部方法的测试函数,则需要在类名前面加上 Test。Pytest 还将自动识别使用 unittest 模块编写的所有测试。

通常,我们都想要将应用程序测试代码放在像tests/文件夹这样定义好的路径上。这样的话,最优办法是使用pytest.ini配置文件通知pytest去哪里寻找测试代码:

[pytest] 
testpaths = tests

这可以大大加快我们的测试运行速度,尤其是在大型代码库上。如果想要进一步了解修改pytest定位测试代码的方式,请参阅官方指南 Changing standard test discovery。

最后要考虑的是如何让 pytest 加载测试模块。Pytest提供了不同的导入模式,具体取决于我们是否将测试放在了模块(带有__init__.py文件的文件夹)中,是否给测试文件定义了唯一名称以及是否需要使用不同版本的Python来测试应用程序或库。默认的prepend模式对于只使用一个特定Python版本测试应用程序并且所有测试都放在tests/文件夹中的常见场景来说已经足够了。为了避免名称冲突,我们只需要通过添加一个__init__.py文件将内部测试文件夹升级为模块即可。

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:810735403

标准测试功能和测试运行

让我们看一下一个简单的函数测试,该函数add应该能够将两个数字相加:

from python_pytest.basics import add

def test_add_can_add_numbers():
    # given
    num = 3
    num2 = 45

    # when
    result = add(num, num2)

    # then
    assert result == 48

想要编写一个像这样的简单测试,我们只需要做两件事:定义一个带有test_前缀的函数,并使用Python的assert来检查函数的结果是否符合我们的预期。assert是Python标准库的一部分,其行为与我们所知的一致。唯一的区别是pytest在运行之前会在后台完全重写测试,以便在测试失败时可以提供有用的报告。这就是pytest真正的魔力:测试不同的断言时,我们不必记住任何特殊功能。任何结果为 True 或 False 的Python代码都可以测试断言。

你会注意到我使用了given,when和then的注释将测试用例划分为测试需求,测试过程和期望结果。我这样做是为了提高可读性,并在编写链接中的文章时详细解释了这一点。

===================================== test session starts =====================================
platform linux -- Python 3.7.9, pytest-5.4.3, py-1.10.0, pluggy-0.13.1
rootdir: /home/pstribny/projects/python-pytest, inifile: pytest.ini
collected 1 item                                                                              

tests/test_basics.py .                                                                  [100%]

====================================== 1 passed in 0.04s ======================================

可以运行pytest以获取有关该add函数是否运行正确的报告:

===================================== test session starts =====================================
platform linux -- Python 3.7.9, pytest-5.4.3, py-1.10.0, pluggy-0.13.1
rootdir: /home/pstribny/projects/python-pytest, inifile: pytest.ini
collected 1 item                                                                              

tests/test_basics.py .                                                                  [100%]

====================================== 1 passed in 0.04s ======================================

如果我们把add的代码中的计算结果改成错误的,pytest将告诉我们:

=======
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值