Pythonでモックとスタブを使ってAPIテストを行う方法

この記事では、PythonでのAPIテストにおいて、モックとスタブを用いる方法を詳しく解説します。具体的なコード例、その解説、そして応用例を含めています。この手法を使えば、外部APIへの依存を減らしながら確実なテストが行えます。

目次

モックとスタブの基本

モックとスタブは、テスト環境でよく使用されるテクニックです。これらを用いることで、外部の依存関係を排除して単体テストを行えます。

モック(Mock)とは

モックは、実際のオブジェクトを模倣(もはん)したオブジェクトで、テストで実際の挙動を再現します。

スタブ(Stub)とは

スタブは、実際のオブジェクトの一部の挙動だけを模倣するオブジェクトです。通常は、必要なメソッドだけを実装します。

unittestライブラリを使用した例

Python標準ライブラリの`unittest`を用いた簡単な例を見てみましょう。

import unittest
from unittest.mock import Mock

# APIを模倣するためのモックを作成
api_mock = Mock()
api_mock.get_user.return_value = {"id": 1, "name": "John"}

class APITest(unittest.TestCase):

    def test_get_user(self):
        # APIのモックを使ってテスト
        user = api_mock.get_user(1)
        self.assertEqual(user["id"], 1)
        self.assertEqual(user["name"], "John")

コード解説

1. `unittest`と`unittest.mock`モジュールをインポートします。
2. `Mock`クラスを使用して`api_mock`オブジェクトを作成し、`get_user`メソッドの戻り値を設定します。
3. `APITest`クラス内で、実際のテストを行います。

応用例1:外部APIとの連携

次に、`requests`ライブラリを使用して外部APIにアクセスするケースを考えます。

import unittest
from unittest.mock import patch
import requests

class ExternalAPITest(unittest.TestCase):

    @patch('requests.get')
    def test_get_weather(self, mock_get):
        # スタブを設定
        mock_get.return_value.status_code = 200
        mock_get.return_value.json.return_value = {"weather": "sunny"}

        # API呼び出し
        response = requests.get("http://api.weather.com/")
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json()["weather"], "sunny")

コード解説

1. `unittest`と`unittest.mock`、`requests`をインポートします。
2. `patch`デコレータで`requests.get`をモック化します。
3. スタブを設定してAPIの挙動を模倣します。

応用例2:複数のAPIエンドポイントのテスト

複数のAPIエンドポイントをテストする場合の例です。

import unittest
from unittest.mock import patch

class MultipleAPITest(unittest.TestCase):

    @patch('api_service.get_user')
    @patch('api_service.get_order')
    def test_multiple_endpoints(self, mock_get_order, mock_get_user):
        # モックの設定
        mock_get_user.return_value = {"id": 1, "name": "John"}
        mock_get_order.return_value = {"id": 1001, "total": 200}

        # API呼び出し
        user = api_service.get_user(1)
        order = api_service.get_order(1001)

        # アサーション
        self.assertEqual(user["id"], 1)
        self.assertEqual(order["id"], 1001)

コード解説

1. `unittest`と`unittest.mock`をインポートします。
2. `patch`デコレータで複数のAPIエンドポイントをモック化します。
3. モックの設定とAPI呼び出しを行い、アサーションを使ってテストします。

まとめ

モックとスタブを使えば、外部APIへの依存を減らしながら、APIのテストが行えます。Pythonの`unittest`ライブラリを使った基本的な使い方から、複数のAPIエンドポイントのテストまで、幅広くカバーしました。

コメント

コメントする

目次