Python | 複雑な条件をテストしやすくする工夫(ユニットテストや条件分解)

Python
スポンサーリンク

複雑な条件は「動けばいい」だけではなく、テストしやすい形に分解することが大事です。実務ではユニットテストを組みやすくするために、条件式を整理する工夫がよく使われます。


工夫1:条件を関数に分解する

長い条件をそのまま書くとテストが難しいので、小さな関数に分けてテスト可能にするのが定石です。

def is_valid_age(age: int) -> bool:
    return 18 <= age <= 65

def has_permission(is_admin: bool, has_invite: bool) -> bool:
    return is_admin or has_invite

def can_access(age: int, is_admin: bool, has_invite: bool) -> bool:
    return is_valid_age(age) and has_permission(is_admin, has_invite)
Python
  • is_valid_agehas_permission を個別にテストできる
  • can_access はそれらを組み合わせた統合テストで確認できる

工夫2:早期returnで条件を分ける

複雑な条件を一行で書くより、早期returnで分岐を分けるとテストがしやすいです。

def can_register(age, email, password):
    if age < 18:
        return False
    if not email:
        return False
    if not password:
        return False
    return True
Python
  • 各条件を個別にテストできる(年齢だけ不正、メールだけ未入力など)
  • ネストが浅くなるので読みやすい

工夫3:説明的な変数に分ける

条件をそのまま書くと「何をチェックしているのか」が分かりにくいので、説明的な変数に代入してテスト対象を明確化します。

def can_buy(stock, payment_valid, free_campaign):
    has_valid_order = stock and payment_valid
    eligible = has_valid_order or free_campaign
    return eligible
Python
  • has_valid_ordereligible をそれぞれテストできる
  • 条件の意味が変数名で伝わるので、テストコードも読みやすい

工夫4:ユニットテストの書き方

Pythonのpytestを例にすると:

import pytest
from myapp import can_access

def test_can_access_valid_age_and_admin():
    assert can_access(30, True, False) is True

def test_can_access_invalid_age():
    assert can_access(70, True, False) is False

def test_can_access_with_invite():
    assert can_access(25, False, True) is True
Python
  • 正常系異常系を分けてテスト
  • 条件ごとにテストケースを作ることで「どの条件が壊れたか」がすぐ分かる

まとめ

  • 関数化 → 条件を小さく分けて個別にテスト可能にする
  • 早期return → ネストを減らし、テストケースを明確にする
  • 説明的変数 → 条件の意味を名前で表し、テスト対象を分かりやすくする
  • ユニットテスト → 正常系・異常系を網羅して条件ごとに確認する
Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました