参数化与测试覆盖率
使用 @pytest.mark.parametrize 通过多个输入运行测试。
参数化与测试覆盖率 是 CoddyKit 上的免费 Python Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
@pytest.mark.parametrize
使用 @pytest.mark.parametrize,即可使用多个输入运行同一个测试。每个元组都是一个独立的测试用例。
import pytest
@pytest.mark.parametrize("a,b,expected", [
(1, 2, 3),
(0, 0, 0),
(-1, 1, 0),
(10, -5, 5),
])
def test_add(a, b, expected):
assert a + b == expected单个参数
对于单个参数,直接传入一个值列表即可。
import pytest
@pytest.mark.parametrize("n", [1, 2, 3, 4, 5])
def test_positive(n):
assert n > 0命名测试 ID
提供一个 ids 列表,为每组参数设置标签,从而让输出更清晰。
import pytest
@pytest.mark.parametrize("value,result", [
(2, True),
(3, False),
], ids=["even", "odd"])
def test_is_even(value, result):
assert (value % 2 == 0) == result叠加 parametrize 装饰器
叠加两个 parametrize 装饰器,即可得到输入的笛卡尔积。
import pytest
@pytest.mark.parametrize("x", [1, 2])
@pytest.mark.parametrize("y", [10, 20])
def test_product(x, y):
assert x * y > 0 # 4 test cases: (1,10),(1,20),(2,10),(2,20)pytest-cov:安装
安装 pytest-cov,以衡量代码中哪些行被测试执行到了。
# pip install pytest-cov
# Basic usage:
# pytest --cov=mypackage
# HTML report:
# pytest --cov=mypackage --cov-report=html读取覆盖率输出
覆盖率报告会显示测试期间未执行到的行、分支或语句。
# Name Stmts Miss Cover
# ------- ----- ---- -----
# mypackage/utils.py 20 3 85%
#
# Missing: lines 45, 67, 88分支覆盖率
使用 --cov-branch 跟踪条件语句的两个分支是否都经过测试。
# pytest --cov=mypackage --cov-branch
def is_positive(n):
if n > 0: # branch 1: True
return True
return False # branch 2: False覆盖率过低时使构建失败
使用 --cov-fail-under=N,在覆盖率低于 N% 时让构建失败。
# pytest --cov=mypackage --cov-fail-under=80
# FAIL Required test coverage of 80% not reached. Total: 72%.coveragerc 配置
在 .coveragerc 中配置覆盖率排除项,以跳过样板代码。
# .coveragerc
[run]
omit =
*/migrations/*
*/tests/*
setup.py
[report]
exclude_lines =
pragma: no cover
if TYPE_CHECKING:什么样的覆盖率才算好
高覆盖率并不能保证测试正确。应追求有意义的断言,而不只是让代码行被执行。对于大多数项目,80%–90% 是一个切实可行的目标。
# A covered but useless test:
def test_nothing():
is_positive(5) # no assert — 100% coverage, zero confidence
# A meaningful test:
def test_positive():
assert is_positive(5) is True
assert is_positive(-1) is False结合 parametrize 和覆盖率
参数化测试只需定义一次测试,就能执行多条代码路径,因此可以自然地提高覆盖率。
import pytest
@pytest.mark.parametrize("n,expected", [
(5, True), (-1, False), (0, False)
])
def test_is_positive(n, expected):
assert is_positive(n) == expected快速检查
在 pytest 运行中,--cov-fail-under=90 有什么作用?
回顾
使用 @pytest.mark.parametrize 简洁地测试多个输入。使用 pytest-cov 衡量代码覆盖率,使用 --cov-branch 跟踪分支,并使用 --cov-fail-under 强制执行最低覆盖率要求。
常见问题解答
「参数化与测试覆盖率」课时是免费的吗?
是的 — 「参数化与测试覆盖率」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「参数化与测试覆盖率」这节课中我会学到什么?
使用 @pytest.mark.parametrize 通过多个输入运行测试。 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「参数化与测试覆盖率」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。