为了账号安全,请及时绑定邮箱和手机立即绑定

跟我用Python和pytest学单元测试吧!🚀

Python中的单元测试感觉就像魔法一样——一点点准备,你就可以在错误进入代码之前就捕获它们。今天,我们将深入了解pytest,这是一个强大而简单的框架,让测试变得有趣!😃让我们通过例子来学习,并尽量少讲理论。准备好了吗?让我们开始吧!出发!

……

什么是pytest?(pytest是一个用于Python的自动化测试框架)

pytest 是一个 Python 测试框架,如下:

  • 简单易用:写简洁的测试,减少冗余代码。
  • 功能丰富:处理测试用例、断言、参数化测试等。
  • 可扩展:添加插件以增强测试。

以下是安装方法:

    pip install pytest

点击全屏模式。退出全屏模式。

砰!就这样吧。你准备好了,准备好起飞了。🚀

等等

写你的第一个测试用例

这里是最简单的测试,你可以写。

    # 测试样例.py

    # 这是一个测试加法操作的函数
    def test_addition():
        assert 1 + 1 == 2

全屏模式 退出全屏

要运行此测试,请输入以下内容:

运行 pytest 测试 test_sample.py 文件。

    pytest test_sample.py

进入全屏 退出全屏

你会看到这样的结果,

示例输出

耶!🎉 你过了!

断言的威力

pytest的强大之处在于断言。您使用assert语句来测试代码是否符合预期。这里有一些示例:

    # 测试数学功能

    def test_operations():
        assert 2 * 2 == 4
        assert 10 / 2 == 5
        assert 5 - 2 == 3

进入全屏 退出全屏

你会看到如下输出:

图片

如果任何 assert (断言)失败,pytest 会显示出详细的错误信息。 🎉 不再用担心复杂的语法啦!

此处省略部分内容

搭建舞台:准备工作 🎡

Fixture是一种为你的测试设置可复用的环境的方式。假设你在测试一个数据库。你不必在每个测试中都连接数据库,而是可以创建一个Fixture。

比如说:

import pytest

    @pytest.fixture
    def sample_data():
        return {"name": "Alice", "age": 30}

    def test_sample_data(sample_data):
        assert sample_data["name"] == "Alice"
        assert sample_data["age"] == 30

    # 这是一个简单的测试用例,用于测试样本数据是否正确。
    # 样本数据包括一个名字和一个年龄,测试函数会检查这两个值是否与预期相符。

全屏 退出全屏

pytest 自动为测试函数提供 sample_data 固定值。🚀

此处内容省略

参数化测试:用更少,测更多 🔄

如果你想测试多个输入,可以直接使用 @pytest.mark.parametrize

import pytest

# 这是一个使用pytest库进行测试加法函数的示例。
@pytest.mark.parametrize("x, y, result", [
    (1, 2, 3),
    (5, 5, 10),
    (10, -2, 8),
])
def test_add(x, y, result):
    # 确保x和y的和等于结果
    assert x + y == result

全屏模式/退出全屏

pytest 会针对每种输入组合进行测试! 🔧

此处省略(……)

整理你的测试文件夹 🗂

把你的测试整理好:

  • 测试文件:命名格式为 test_*.py*_test.py
  • 测试函数:以 test_ 开头。

示例的结构:

    项目文件夹/
    |-- app.py
    |-- 测试文件夹/
        |-- test_app.py
        |-- test_utils.py

切换到全屏模式 退出全屏

pytest能自动找到你的测试,酷吧,😉


pytest 插件:让你的测试更上一层楼 🏆

pytest有很多插件能让你的工作更轻松。这里有一些我特别喜欢的插件:

  • pytest-cov :用于测量代码覆盖率。
pip install pytest-cov
pytest --cov=模块

进入全屏 退出全屏

  • pytest-mock :用于单元测试的模拟对象(pytest-mock是一个用于单元测试的模拟对象库)。

  • pytest-django :用于测试Django应用。

您可以访问此链接 pytest-dev/plugins 了解更多插件。


处理预料中的错误 ⚠️

要检查一个函数是否会抛出异常,可以使用 pytest.raises

    import pytest

    def divide(a, b):
        if b == 0:
            raise ValueError("不能除以零.")
        return a / b

    def test_divide_by_zero():
        with pytest.raises(ValueError, match="不能除以零."):
            divide(1, 0)

全屏模式 退出

pytest 会检查错误是否被抛出,以及错误信息是否正确。


互动测验 🕺

问题: 这个测试会输出什么呢?

def test_example():
    # 测试示例: 2*3==5
    assert 2 * 3 == 5

全屏模式 退出全屏

  • A: 测试通过啦 ✅
  • B: 测试失败,出错啦 ❌

提示:它失败了!😅 pytest 会类似地输出这样的内容:

出错了


最后的小贴士 🙌
  1. 从小处开始:学习时写简单的测试。
  2. 尽早写测试:一边编码一边写测试,而不是之后。
  3. 注重代码覆盖率:尽量提高代码覆盖率,但要确保测试有意义。

用 pytest 进行单元测试不仅简单,还很强大,而且超级有趣!🚀从今天开始动手写测试吧,看着你的代码库一天天变得更健壮,更可靠。祝你测试玩得开心!🎮

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消