複雑な条件は「動けばいい」だけではなく、テストしやすい形に分解することが大事です。実務ではユニットテストを組みやすくするために、条件式を整理する工夫がよく使われます。
工夫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)
Pythonis_valid_ageとhas_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
Pythonhas_valid_orderとeligibleをそれぞれテストできる- 条件の意味が変数名で伝わるので、テストコードも読みやすい
工夫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 → ネストを減らし、テストケースを明確にする
- 説明的変数 → 条件の意味を名前で表し、テスト対象を分かりやすくする
- ユニットテスト → 正常系・異常系を網羅して条件ごとに確認する

