unittestやpytestを使用したテストの作成

Pythonのテストとデバッグにおいて、unittestpytest は代表的なテストフレームワークであり、コードの信頼性を高めるために広く使用されます。以下では、それぞれの特徴とテストの作成方法について詳しく説明します。


1. unittest モジュール

unittest はPythonに標準で搭載されているテストフレームワークです。JavaのJUnitに似た構文を持ち、クラスベースでテストを構成します。

特徴:

  • 標準ライブラリに含まれているため追加インストール不要

  • クラスを使った構造的なテスト記述

  • セットアップとクリーンアップの仕組みあり(setUp / tearDown

基本的な使い方:

python
import unittest def add(a, b): return a + b class TestAddFunction(unittest.TestCase): def test_add_positive_numbers(self): self.assertEqual(add(2, 3), 5) def test_add_negative_numbers(self): self.assertEqual(add(-1, -1), -2) def test_add_zero(self): self.assertEqual(add(0, 0), 0) if __name__ == '__main__': unittest.main()

よく使われるアサーションメソッド:

  • assertEqual(a, b):a == bであることを確認

  • assertTrue(x):xが真であることを確認

  • assertRaises(Exception, func, args):指定の例外が発生することを確認


2. pytest フレームワーク

pytest はより簡潔かつ柔軟な記述ができるサードパーティ製のフレームワークで、デフォルトで詳細な出力を提供します。

特徴:

  • インストールが必要(pip install pytest

  • 関数ベースで簡単にテストが書ける

  • テストの自動検出、詳細なエラーレポート、fixture機能が強力

  • unittestとの互換性あり(既存のテストコードも流用可)

基本的な使い方:

python
# test_sample.py def add(a, b): return a + b def test_add_positive_numbers(): assert add(2, 3) == 5 def test_add_negative_numbers(): assert add(-1, -1) == -2 def test_add_zero(): assert add(0, 0) == 0

コマンドラインで実行:

ruby
$ pytest test_sample.py

よく使われる機能:

  • fixture による共通処理の注入

  • パラメータ化によるテストケースの簡素化

  • マーク機能(@pytest.mark) によるグループ分けやスキップ

fixtureの例:

python
import pytest @pytest.fixture def sample_data(): return (2, 3) def test_add_with_fixture(sample_data): a, b = sample_data assert add(a, b) == 5

まとめ:unittestとpytestの比較

機能 unittest pytest
標準搭載 あり なし(pip install pytest
記述スタイル クラスベース 関数ベース中心(クラスも可)
アサーション 専用メソッドを使用 assert文をそのまま使用可能
拡張性 標準的な機能のみ fixtureやプラグインが豊富
実行方法 python test.py pytestコマンドで簡単に実行

テストのベストプラクティス

  • テストファイル名はtest_*.pyにする:pytestが自動で検出

  • 各関数ごとにユニットテストを書く

  • 失敗するテストを意図的に作って挙動確認(TDD)

  • CIツールと組み合わせて自動実行する

生成日:2025/05/03