Pythonのテストコードのベストプラクティス
生徒
「テストコードのベストプラクティスを学びたいのですが、サンプルコードをどう読めばいいですか?」
先生
「まずは 変更しても壊れにくいPythonコードを確認するテスト という目的で考えると分かりやすいです。何を入力して、Pythonでどう処理し、何を結果として確認するかを分けて見ましょう。」
生徒
「SEO記事っぽい説明だけでなく、実際に動かすコードも見たいです。」
先生
「では、pytestを中心に、実務でつまずきやすいエラー処理やログ出力も含めて確認していきましょう。」
1. 正常系・異常系・境界値を先に決める
テストコードのベストプラクティスは、ただライブラリ名を覚えるだけでは実務で使いにくいテーマです。まずは 変更しても壊れにくいPythonコードを確認するテスト という具体例に置き換えて、入力、処理、出力、エラー時の動きを確認します。
def normalize_name(name: str) -> str:
return name.strip()
def test_normalize_name():
assert normalize_name(" Python ") == "Python"
assert normalize_name("") == ""
2. pytestを使った最小テストコード
pytestを使う前に、インストール方法、実行環境、扱うデータの範囲を整理しておきます。特にネットワーク、メール、IoT、セキュリティ系は、自分が管理する環境で試すことが大切です。
def divide(a: int, b: int) -> float:
if b == 0:
raise ValueError("b must not be zero")
return a / b
def test_divide():
assert divide(10, 2) == 5
3. テストデータを小さく分けて読みやすくする
Pythonコードでは、正常に動くケースだけでなく、タイムアウト、ファイルなし、認証失敗、入力ミスなども想定します。例外処理を入れておくと、学習用コードでも原因を追いやすくなります。
import pytest
def parse_int(value: str) -> int:
return int(value)
def test_parse_int_error():
with pytest.raises(ValueError):
parse_int("abc")
4. 外部API・メール・DBをモックで置き換える
処理結果は、画面に表示するだけでなく、ログやファイルに残すと確認しやすくなります。あとから失敗原因を追えるように、日時、対象、結果を記録する習慣をつけましょう。
import logging
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
logger = logging.getLogger(__name__)
logger.info("処理を開始しました")
5. 失敗したテストから原因を追うデバッグ方法
同じ処理を何度も書く場合は、関数や小さなクラスへ分けます。関数名に目的を入れると、あとで見返したときに「何をするコードか」がすぐ分かります。
from pathlib import Path
output = Path("result.txt")
output.write_text("処理結果を保存しました\n", encoding="utf-8")
print(output.read_text(encoding="utf-8"))
6. カバレッジとCIで確認漏れを減らす
最後に、変更しても壊れにくいPythonコードを確認するテスト として動く形へまとめます。コードを写すだけでなく、対象データや引数を変えて試すと、検索されるだけでなく読者の学習にも役立つ記事になります。
def validate_required(value: str, label: str) -> list[str]:
errors = []
if not value.strip():
errors.append(f"{label}は必須です")
return errors
print(validate_required("Python", "キーワード"))
7. テスト一式として動かす完成コード
変更しても壊れにくいPythonコードを確認するテストとして使うなら、サンプルコードを1回動かして終わりにせず、対象データ、ファイル名、URL、認証情報、実行環境を変えて確認しましょう。pytestの役割が見えると、応用もしやすくなります。
実務では、正常系よりも失敗時の扱いで差が出ます。ログ、例外、タイムアウト、入力チェックを入れておくことで、読者がそのまま練習しやすいコードになります。
8. 保守しやすいテスト名とフォルダ構成
テストコードのベストプラクティスを身につけるには、まず小さなコードで動きを確認し、次にログ出力、設定ファイル、テスト、自動実行へ広げるのがおすすめです。記事を読んだ人が自分の環境で試せるように、値を変えやすい形で残しておきましょう。
次の練習では、この記事のコードに設定ファイル読み込み、CSV保存、pytestでの確認、GitHub Actionsでの自動実行のどれか1つを追加してみてください。