カテゴリ: Python 更新日: 2026/09/18

Pythonのテスト入門!unittestを使った基本のテストの書き方

Pythonのテスト入門!unittestを使った基本のテストの書き方
Pythonのテスト入門!unittestを使った基本のテストの書き方

先生と生徒の会話形式で理解しよう

生徒

「テスト入門を学びたいのですが、サンプルコードをどう読めばいいですか?」

先生

「まずは 標準ライブラリだけで関数を検証するテスト という目的で考えると分かりやすいです。何を入力して、Pythonでどう処理し、何を結果として確認するかを分けて見ましょう。」

生徒

「SEO記事っぽい説明だけでなく、実際に動かすコードも見たいです。」

先生

「では、unittestを中心に、実務でつまずきやすいエラー処理やログ出力も含めて確認していきましょう。」

1. 正常系・異常系・境界値を先に決める

1. 正常系・異常系・境界値を先に決める
1. 正常系・異常系・境界値を先に決める

テスト入門は、ただライブラリ名を覚えるだけでは実務で使いにくいテーマです。まずは 標準ライブラリだけで関数を検証するテスト という具体例に置き換えて、入力、処理、出力、エラー時の動きを確認します。


import unittest

def add(a: int, b: int) -> int:
    return a + b

class TestAdd(unittest.TestCase):
    def test_add_positive_numbers(self):
        self.assertEqual(add(2, 3), 5)

if __name__ == "__main__":
    unittest.main()

2. unittestを使った最小テストコード

2. unittestを使った最小テストコード
2. unittestを使った最小テストコード

unittestを使う前に、インストール方法、実行環境、扱うデータの範囲を整理しておきます。特にネットワーク、メール、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. テストデータを小さく分けて読みやすくする

3. テストデータを小さく分けて読みやすくする
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をモックで置き換える

4. 外部API・メール・DBをモックで置き換える
4. 外部API・メール・DBをモックで置き換える

処理結果は、画面に表示するだけでなく、ログやファイルに残すと確認しやすくなります。あとから失敗原因を追えるように、日時、対象、結果を記録する習慣をつけましょう。


import logging

logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
logger = logging.getLogger(__name__)

logger.info("処理を開始しました")

5. 失敗したテストから原因を追うデバッグ方法

5. 失敗したテストから原因を追うデバッグ方法
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で確認漏れを減らす

6. カバレッジとCIで確認漏れを減らす
6. カバレッジとCIで確認漏れを減らす

最後に、標準ライブラリだけで関数を検証するテスト として動く形へまとめます。コードを写すだけでなく、対象データや引数を変えて試すと、検索されるだけでなく読者の学習にも役立つ記事になります。


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. テスト一式として動かす完成コード

7. テスト一式として動かす完成コード
7. テスト一式として動かす完成コード

標準ライブラリだけで関数を検証するテストとして使うなら、サンプルコードを1回動かして終わりにせず、対象データ、ファイル名、URL、認証情報、実行環境を変えて確認しましょう。unittestの役割が見えると、応用もしやすくなります。

実務では、正常系よりも失敗時の扱いで差が出ます。ログ、例外、タイムアウト、入力チェックを入れておくことで、読者がそのまま練習しやすいコードになります。

8. 保守しやすいテスト名とフォルダ構成

8. 保守しやすいテスト名とフォルダ構成
8. 保守しやすいテスト名とフォルダ構成

テスト入門を身につけるには、まず小さなコードで動きを確認し、次にログ出力、設定ファイル、テスト、自動実行へ広げるのがおすすめです。記事を読んだ人が自分の環境で試せるように、値を変えやすい形で残しておきましょう。

次の練習では、この記事のコードに設定ファイル読み込み、CSV保存、pytestでの確認、GitHub Actionsでの自動実行のどれか1つを追加してみてください。

コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

Python のテストとデバッグの記事一覧へ
新着記事
New1
Copilot
CopilotでPHPコード補完を始める方法!VS Codeで最初の補完を使う手順
New2
PHP
PHPでお問い合わせメールを送信する方法!フォーム連携と本文テンプレート
New3
PHP
PHPでPHPUnitの最初のテストを書く方法!関数テストの基本
New4
Claude
ClaudeでPHPリファクタリングの失敗を減らす方法!実務で使うコードに近づけるための設計相談
人気記事
No.1
Java&Spring記事人気No1
Python
PythonでSQLiteを使う方法を完全ガイド!初心者でもわかるデータベース基本操作
No.2
Java&Spring記事人気No2
PHP
PHP の MySQL 接続の基本(mysqli, PDO)を完全解説!初心者向けガイド
No.3
Java&Spring記事人気No3
Python
Pythonでヒートマップを作成する方法を完全解説!初心者でもわかるデータ分析入門
No.4
Java&Spring記事人気No4
Gemini
GeminiでPHPデバッグを進める方法!原因調査の流れを初心者向けに解説
No.5
Java&Spring記事人気No5
Python
Pythonのエラーハンドリング設計を完全ガイド!初心者でもわかる適切な例外をキャッチする方法
No.6
Java&Spring記事人気No6
Claude
ClaudeでPythonデバッグを本番目線で確認する方法!本番環境のエラーを慌てず切り分ける考え方
No.7
Java&Spring記事人気No7
Claude
ClaudeでPHPリファクタリングの設計メモを作る方法!修正前に影響範囲を洗い出すプロンプト例
No.8
Java&Spring記事人気No8
Python
Pythonの数値型を完全ガイド!整数と浮動小数点数の違いを初心者向けに解説