写代码不写测试,迟早要还的。Python世界里测试框架多得数不清,但要说最好用的,那必须是Pytest!它就像是给代码把脉的神医,轻轻松松就能发现问题所在。
装它贼简单,一行命令搞定:
pip install pytest
写测试用例也超简单,创建一个test_开头的Python文件,里面写test_开头的函数就行:
def add(a, b):
return a + b
def test_add():
assert add(1, 2) == 3
assert add(-1, 1) == 0
assert add(0, 0) == 0
运行测试只需要在终端输入pytest
,它就会自动找到所有测试文件并执行。
💡 温馨提示 :函数名一定要以test_开头,不然Pytest找不到这个测试用例哦!
跟其他测试框架比,Pytest的断言机制简直不要太爽!直接用Python内置的assert就完事了:
def test_string_operations():
name = “python”
assert name.startswith(“py”)
assert len(name) == 6
assert name.upper() == “PYTHON”
出错时它还给你详细的错误信息,比如值是多少,预期是多少,代码哪行出问题了,一目了然!
测试经常需要准备测试数据,清理测试环境。用fixture能优雅地解决这些问题:
import pytest
@pytest.fixture
def db_connection():
# 连接数据库
print(“连接数据库”)
yield “database”
# 测试结束后自动断开连接
print(“断开连接”)
def test_database(db_connection):
assert db_connection == “database”
fixture还能设置作用域,比如scope=“module”
就是在整个模块开始前执行一次,结束后清理一次,超级方便。
测试不同的输入输出,总不能复制粘贴一堆代码吧?用参数化测试就对了:
import pytest
@pytest.mark.parametrize(“input,expected”, [
(“hello”, 5),
(“python”, 6),
(“”, 0),
(“测试”, 2)
])
def test_string_length(input, expected):
assert len(input) == expected
一个测试函数搞定多组测试用例,代码更清爽了!
有时候某些测试用例可能暂时跑不了,或者就是期望它失败:
@pytest.mark.skip(reason=“功能还没实现”)
def test_future_feature():
pass
@pytest.mark.xfail
def test_known_bug():
assert 1 == 2 # 这个bug还没修,先标记为预期失败
💡 温馨提示 :经常用skip的测试用例要记得及时处理,不然容易忘记!
测试用例多了跑起来特别慢?装个pytest-xdist插件就能并行执行:
pip install pytest-xdist
pytest -n auto # auto表示自动识别CPU核心数
测试速度直接起飞!不过要注意测试用例之间别有依赖关系,不然可能会出问题。
测试代码说白了就是给自己的代码兜底,用Pytest写测试不仅简单,还能提高代码质量。
学会了这些基础用法,基本够用了。想要更高级的玩法,可以去看看官方文档,里面还有不少好东西等着你发掘呢!