0Pricing
Python Academy · 课时

参数化与测试覆盖率

使用 @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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 编写您的第一个 pytest 测试
  2. 固件与设置/拆卸
  3. 参数化与测试覆盖率
  4. 使用 unittest.mock 进行模拟
← 返回 Python Academy