Python | 複雑な条件をテストデータ駆動(パラメータ化テスト)でまとめる方法

Python
スポンサーリンク

複雑な条件をテストするときは「テストデータ駆動(パラメータ化テスト)」を使うと、同じテスト関数で複数のケースを一気に確認できます。Pythonでは pytest@pytest.mark.parametrize がよく使われます。


基本の考え方

  • 複雑な条件を関数化しておく(例:can_access
  • テストケースを表にする(入力と期待値を並べる)
  • パラメータ化テストで一括実行する

例:アクセス権チェック関数

def can_access(age, is_member, has_invite_code):
    return (age >= 18 and is_member) or has_invite_code
Python

パラメータ化テスト(pytest)

import pytest

@pytest.mark.parametrize(
    "age, is_member, has_invite_code, expected",
    [
        (20, True, False, True),   # 成人かつ会員 → OK
        (20, False, False, False), # 成人だが非会員 → NG
        (17, True, False, False),  # 未成年 → NG
        (17, False, True, True),   # 招待コードあり → OK
        (30, False, True, True),   # 成人で招待コードあり → OK
    ]
)
def test_can_access(age, is_member, has_invite_code, expected):
    assert can_access(age, is_member, has_invite_code) == expected
Python

✅ メリット

  • テストケースを「表形式」で管理できる
  • 新しい条件を追加するときはリストに行を足すだけ
  • テスト関数は1つで済むのでコードがすっきり

応用:複雑な入力チェック

例えば「メールとパスワードが両方ある または ゲストログインがTrue」ならログイン可能:

def can_login(email, password, guest_login):
    return (email and password) or guest_login
Python

テストをパラメータ化すると:

@pytest.mark.parametrize(
    "email, password, guest_login, expected",
    [
        ("user@example.com", "secret", False, True),  # 正常ログイン
        ("", "secret", False, False),                 # メールなし → NG
        ("user@example.com", "", False, False),       # パスワードなし → NG
        ("", "", True, True),                         # ゲストログイン → OK
    ]
)
def test_can_login(email, password, guest_login, expected):
    assert can_login(email, password, guest_login) == expected
Python

まとめ

  • 複雑な条件は関数化してテスト対象を明確にする
  • パラメータ化テストで入力と期待値を表形式にまとめる
  • 新しい条件を追加するときは「行を足すだけ」で管理が楽になる

Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました