Pythonにおける単体テストの基礎

テストの基本概念

関数やクラスを実装する際には、確実に動作を検証するテストコードの作成が重要です。テストによって、多様な入力条件下で期待通りの出力が得られることを確認できます。特にプログラムに修正を加える際に既存の動作が維持されているかを検証する手段として不可欠です。

関数テストの実践

テスト対象の関数例として、ユーザー名を整形する処理を考えます:

def format_user_name(given_name, family_name):
    """姓名を整形して返す"""
    combined = f"{given_name} {family_name}"
    return combined.title()

この関数を検証するためのテストケースを以下のように作成します:

import unittest
from user_profile import format_user_name

class UserProfileTest(unittest.TestCase):
    """ユーザー名整形機能の検証"""
    
    def test_basic_name_formatting(self):
        """基本姓名の整形検証"""
        result = format_user_name('taro', 'yamada')
        self.assertEqual(result, 'Taro Yamada')
        
    def test_name_with_middle(self):
        """中間名を含む姓名の整形検証"""
        result = format_user_name('marie', 'curie', 'sklodowska')
        self.assertEqual(result, 'Marie Sklodowska Curie')

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

テスト実行結果の解釈

テスト成功時には以下のような出力が得られます:

..
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

テスト失敗時にはエラー詳細が表示されます:

E
======================================================================
ERROR: test_basic_name_formatting (__main__.UserProfileTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_user.py", line 9, in test_basic_name_formatting
    result = format_user_name('taro', 'yamada')
TypeError: format_user_name() missing 1 required positional argument: 'middle_name'
----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (errors=1)

テスト失敗時の対応

テストが失敗した場合、関数実装の修正が優先されます:

def format_user_name(given_name, family_name, middle_name=None):
    """オプション中間名対応の姓名整形"""
    if middle_name:
        return f"{given_name} {middle_name} {family_name}".title()
    else:
        return f"{given_name} {family_name}".title()

タグ: Python unittest ユニットテスト テストケース

8月18日 08:28 投稿