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 会类似地输出这样的内容:
最后的小贴士 🙌
- 从小处开始:学习时写简单的测试。
- 尽早写测试:一边编码一边写测试,而不是之后。
- 注重代码覆盖率:尽量提高代码覆盖率,但要确保测试有意义。
用 pytest 进行单元测试不仅简单,还很强大,而且超级有趣!🚀从今天开始动手写测试吧,看着你的代码库一天天变得更健壮,更可靠。祝你测试玩得开心!🎮