Pythonテストの書き方:pytestとunittestを使いこなす

Pythonでテストを書く方法を初心者向けに解説。pytestとunittestの基本的な使い方、TDDの流れ、自動テストの実践例を紹介。

PythonテストpytestunittestTDD自動テスト2026/5/25

はじめに

Pythonでプログラムを書く際、テストは品質を保証するために欠かせません。本記事では、Pythonの標準ライブラリunittestと、よりシンプルで強力なpytestを使ったテストの書き方を解説します。また、テスト駆動開発(TDD)の基本的な流れも紹介します。

テストの基本構造

テストは、特定の関数やメソッドが期待通り動作するかを確認するコードです。テストフレームワークを使うことで、自動化・効率化できます。

unittestの基本

unittestはPython標準ライブラリです。テストはunittest.TestCaseを継承したクラスにメソッドとして記述します。

import unittest

def add(a, b): return a + b

class TestAdd(unittest.TestCase): def test_add_positive(self): self.assertEqual(add(1, 2), 3)

def test_add_negative(self): self.assertEqual(add(-1, -2), -3)

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

assertEqualの他に、assertTrueassertFalseassertRaisesなどがあります。

pytestの基本

pytestはサードパーティのフレームワークで、より簡潔に書けます。

<h1>test_sample.py</h1>
def add(a, b):
    return a + b

def test_add_positive(): assert add(1, 2) == 3

def test_add_negative(): assert add(-1, -2) == -3

pytesttest_で始まる関数や、Testで始まるクラスを自動で見つけて実行します。アサーションはPythonのassert文を使うだけです。

テストの実行方法

unittestの実行

コマンドラインから直接ファイルを実行するか、python -m unittestで実行します。

python -m unittest test_module.py

pytestの実行

pytestコマンドを使います。

pytest test_sample.py

pytestは詳細なレポートを出力し、失敗箇所をわかりやすく表示します。

TDD(テスト駆動開発)の流れ

TDDは「Red-Green-Refactor」のサイクルで進めます。

  • Red: 失敗するテストを書く。
  • Green: テストが通る最小限のコードを書く。
  • Refactor: コードを改善する。
  • 例:FizzBuzz関数

    <h1>1. Red: テストを書く</h1>
    def test_fizzbuzz_returns_fizz_for_multiple_of_3():
        assert fizzbuzz(3) == "Fizz"
    

    def test_fizzbuzz_returns_buzz_for_multiple_of_5(): assert fizzbuzz(5) == "Buzz"

    def test_fizzbuzz_returns_fizzbuzz_for_multiple_of_15(): assert fizzbuzz(15) == "FizzBuzz"

    def test_fizzbuzz_returns_number_otherwise(): assert fizzbuzz(1) == "1"

    <h1>2. Green: 最小限の実装</h1>
    def fizzbuzz(n):
        if n % 15 == 0:
            return "FizzBuzz"
        if n % 3 == 0:
            return "Fizz"
        if n % 5 == 0:
            return "Buzz"
        return str(n)
    
  • Refactor: 必要に応じてコードを整理します。
  • テストのベストプラクティス

  • テストは独立させる: テスト同士が影響し合わないようにする。
  • 1テストに1アサーション: テストの目的を明確にする。
  • テスト名は説明的に: 何をテストしているか分かる名前をつける。
  • fixtureを活用する: 共通の準備コードをまとめる。
  • pytestのfixture

    import pytest
    

    @pytest.fixture def sample_data(): return {"name": "Alice", "age": 30}

    def test_sample_data(sample_data): assert sample_data["name"] == "Alice"

    unittestのsetUp/tearDown

    import unittest
    

    class TestSample(unittest.TestCase): def setUp(self): self.data = {"name": "Alice", "age": 30}

    def test_sample(self): self.assertEqual(self.data["name"], "Alice")

    自動テストの実践例

    実際のプロジェクトでは、テストを自動化して継続的に実行します。GitHub ActionsやJenkinsなどのCIツールと組み合わせます。

    GitHub Actionsの例

    name: Python Tests
    

    on: [push]

    jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.10' - name: Install dependencies run: | pip install pytest - name: Run tests run: pytest

    まとめ

    Pythonでのテストは、unittestpytestの2つの選択肢があります。初心者にはシンプルなpytestがおすすめです。TDDのサイクルを取り入れることで、バグの少ないコードを効率的に書けるようになります。ぜひ、テストを書く習慣をつけてください。