0Pricing
Python Academy · レッスン

パラメーター化とテストカバレッジ

@pytest.mark.parametrize を使い、複数の入力でテストを実行します。

「パラメーター化とテストカバレッジ」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応の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

単一のパラメーター

引数が1つの場合は、値のリストを直接渡します。

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デコレーターを2つ重ねると、入力の直積を取得できます。

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とカバレッジの組み合わせ

パラメーター化されたテストでは、1つのテスト定義で複数のコードパスを実行するため、自然にカバレッジを向上できます。

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で最低値を適用します。

よくある質問

「パラメーター化とテストカバレッジ」レッスンは無料ですか?

はい。「パラメーター化とテストカバレッジ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「パラメーター化とテストカバレッジ」で何を学びますか?

@pytest.mark.parametrize を使い、複数の入力でテストを実行します。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応の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に戻る