複雑な条件チェックをテストするとき、テストケースを外部ファイル(CSVやJSON)にまとめて管理すると便利です。これにより、テストコードとテストデータを分離でき、追加や変更が簡単になります。
方法1:CSVファイルを使う
例:test_cases.csv
age,is_member,has_invite_code,expected
20,True,False,True
20,False,False,False
17,True,False,False
17,False,True,True
30,False,True,True
pytestコード
import csv
import pytest
from myapp import can_access
def load_csv_cases(filename):
with open(filename, newline="") as f:
reader = csv.DictReader(f)
for row in reader:
yield int(row["age"]), row["is_member"] == "True", row["has_invite_code"] == "True", row["expected"] == "True"
@pytest.mark.parametrize("age,is_member,has_invite_code,expected", load_csv_cases("test_cases.csv"))
def test_can_access(age, is_member, has_invite_code, expected):
assert can_access(age, is_member, has_invite_code) == expected
Python- テストケースをCSVにまとめることで、非エンジニアでもExcel感覚で編集可能
- 新しい条件を追加するときはCSVに行を足すだけ
方法2:JSONファイルを使う
例:test_cases.json
[
{"age": 20, "is_member": true, "has_invite_code": false, "expected": true},
{"age": 20, "is_member": false, "has_invite_code": false, "expected": false},
{"age": 17, "is_member": true, "has_invite_code": false, "expected": false},
{"age": 17, "is_member": false, "has_invite_code": true, "expected": true},
{"age": 30, "is_member": false, "has_invite_code": true, "expected": true}
]
JSONpytestコード
import json
import pytest
from myapp import can_access
def load_json_cases(filename):
with open(filename) as f:
return json.load(f)
@pytest.mark.parametrize("case", load_json_cases("test_cases.json"))
def test_can_access(case):
assert can_access(case["age"], case["is_member"], case["has_invite_code"]) == case["expected"]
Python- JSONは構造化データなので、複雑な条件や多段階の入力に向いている
- APIレスポンスや設定ファイルと同じ形式なので、実務で馴染みやすい
まとめ
- CSV → シンプルな表形式、Excelで編集しやすい
- JSON → ネスト構造や複雑なデータに強い
- 外部ファイル化すると、テストコードはシンプルになり、テストデータの追加・変更が容易になる

