この記事では、Pythonでテストダブル(ダミーオブジェクト、モック、スタブ、スパイなど)の作成と利用について深掘りします。具体的なコード例、その詳細解説、および応用例を紹介します。
目次
テストダブルとは?
テストダブルとは、実際のオブジェクトをテスト環境で置き換えるための各種テクニックです。これには、ダミーオブジェクト、モック、スタブ、スパイなどが含まれます。
主な種類
- ダミーオブジェクト:単なるプレースホルダーです。
- モック:期待する動作と結果を模倣します。
- スタブ:特定の返り値を持つように構成されています。
- スパイ:メソッドの呼び出し情報を記録します。
Pythonでのテストダブルの作成方法
unittest.mock モジュールの利用
Python標準ライブラリの `unittest.mock` モジュールを使うと、テストダブルを容易に作成できます。
from unittest.mock import Mock
# Mockオブジェクトの作成
mock = Mock()
mock.method.return_value = "Hello, mock"
result = mock.method()
print(result) # "Hello, mock"が出力される
コード解説
このコードでは、`Mock` クラスを使ってモックオブジェクトを作成しています。`method.return_value` に期待する返り値を設定することで、`mock.method()` を呼び出すと指定した値が返されます。
応用例
応用例1:APIのスタブ化
外部APIのテスト時にリクエスト数に制限がある場合、スタブを使用して制限を回避します。
from unittest.mock import patch
with patch('requests.get') as mock_get:
mock_get.return_value.status_code = 200
mock_get.return_value.json.return_value = {'key': 'value'}
# API呼び出しの代わりにスタブを使用
response = requests.get('http://example.com/api/')
print(response.status_code) # 200
print(response.json()) # {'key': 'value'}
コード解説
ここでは `patch` を使用して `requests.get` をスタブ化しています。スタブが期待する動作を正しく模倣しているため、API制限に引っかかることなくテストを行うことができます。
応用例2:データベースのモック化
データベースとのやり取りをモックオブジェクトで代替して、テストを高速化します。
from unittest.mock import MagicMock
db = MagicMock()
db.fetch_row.return_value = {"id": 1, "name": "John"}
# データベースからデータを取得する代わりにモックを使用
user_data = db.fetch_row("SELECT * FROM users WHERE id=1")
print(user_data) # {'id': 1, 'name': 'John'}
コード解説
`MagicMock` クラスを使用して、データベースとのインタラクションを模倣しています。この方法により、データベースが不要な環境でもテストを効率的に行えます。
まとめ
Pythonでのテストダブルの作成と利用方法について、基本的な概念から具体的な応用例までを解説しました。この知識を使って、より効率的なテストコードを書きましょう。
コメント