😶‍🌫️

IT初心者でもわかる!モックの基本と活用方法

に公開

初めに

こんにちは!新卒2年目の矢野です!
この記事では、IT初心者でも理解しやすいように、「モック(Mock)」という便利なツールについて解説します。モックは、プログラミングの学習やチーム開発でとても役立つ考え方です。具体的な使い方や実例を交えながら紹介していきます。

1. モック(Mock)とは?

モックとは、プログラムの中で**「本物の代わりに使う偽物の機能」**のことです。
例えば、外部サービスやデータベースがまだ完成していないとき、その部分を「モック」として作ることで、他の部分の開発やテストを進められます。

イメージ: モックは映画のセットのようなものです。実際に背景や装置(=APIやデータベース)が本物ではなくても、俳優(=機能)が演技を出来るようにする模擬的な環境です。

2. なぜモックを使うの?

2.1 開発効率を上げるため

  • 外部システムが完成するのを待たずに作業を進めることが出来、開発の速度が上がるため。

2.2 テストを簡単にするため

  • 本物のサービスやAPIを呼び出すと、テストが遅くなったり、不安定になったりすることがあります。
    しかし、モックを使えば本番環境に影響を与えずに確実なテストができます。

3. モックを使う場面

では、モックを使う場面は具体的にどんな場面なのでしょうか?
主に以下の3つの場面に分けることが出来ます。

  • APIのテスト: 本番APIの代わりにモックAPIを作成。
  • データベースの依存を避ける: モックデータを使って動作確認。
  • 他のチームの進捗を待たない: 他チームの機能が完成する前に、自分の機能をテスト。

4. 実際のモックの例

では、実際にモックを使ったコードを見てみましょう。


from unittest.mock import MagicMock

# 実際にテストしたい関数
def fetch_user_data(api_client, user_id):
    response = api_client.get(f"https://api.example.com/users/{user_id}")
    return response.json()

# テストで使用するモック
def test_fetch_user_data():
    mock_api_client = MagicMock()
    mock_api_client.get.return_value.json.return_value = {"id": 1, "name": "Alice"}
    
    result = fetch_user_data(mock_api_client, 1)
    
    assert result == {"id": 1, "name": "Alice"}
    mock_api_client.get.assert_called_once_with("https://api.example.com/users/1")

if __name__ == "__main__":
    # 手動実行時にのみテストを実行し、成功メッセージを出力
    test_fetch_user_data()
    print("テストが成功しました!")

コードの解説を以下でしたいと思います。

1. fetch_user_data関数

def fetch_user_data(api_client, user_id):
    response = api_client.get(f"https://api.example.com/users/{user_id}")
    return response.json()
  • 役割
    外部APIクライアント(api_client)を使用して、特定のuser_idに対応するユーザー情報を取得し、APIのエンドポイントにアクセスしてレスポンスを受け取り、そのJSONデータを返します。

  • 引数
    api_client: 外部APIを呼び出すクライアントオブジェクト(requestsライブラリなどを想定)。
    user_id: ユーザー情報を取得するための一意の識別子。

  • 処理の流れ

  1. api_client.getを呼び出して、https://api.example.com/users/{user_id} のURLにリクエストを送信。
  2. 取得したレスポンスのJSONデータを返します。

2. テスト用関数test_fetch_user_data

def test_fetch_user_data():
    mock_api_client = MagicMock()
    mock_api_client.get.return_value.json.return_value = {"id": 1, "name": "Alice"}
    
    result = fetch_user_data(mock_api_client, 1)
    
    assert result == {"id": 1, "name": "Alice"}
    mock_api_client.get.assert_called_once_with("https://api.example.com/users/1")
  • 役割
    fetch_user_data関数が正しく動作することをテストし、実際のAPIを呼び出さずに、MagicMockでモック化したAPIクライアントを利用します。

  • 主要な処理

  1. モッククライアントの作成
mock_api_client = MagicMock()

MagicMockを使ってモックオブジェクトを作成します。このオブジェクトは外部APIクライアントの代わりをします。

  1. モックの設定
mock_api_client.get.return_value.json.return_value = {"id": 1, "name": "Alice"}

mock_api_client.getが呼び出された場合に返すレスポンスを設定し、加えて、そのレスポンスのjsonメソッドが返す値を指定(辞書型のデータ:{"id": 1, "name": "Alice"})。

  1. fetch_user_dataの実行
result = fetch_user_data(mock_api_client, 1)

fetch_user_dataを実行し、モックされたAPIクライアントを渡してテスト。

  1. 結果の検証
assert result == {"id": 1, "name": "Alice"}

実行結果が期待するデータと一致しているかを確認。

  1. モックの動作検証
mock_api_client.get.assert_called_once_with("https://api.example.com/users/1")

mock_api_client.getが指定されたURLで1回だけ呼び出されたことを確認し、呼び出し回数や引数が期待通りかどうかを検証することで、関数の正しい動作を保証。

3.テスト結果の表示

if __name__ == "__main__":
    # 手動実行時にのみテストを実行し、成功メッセージを出力
    test_fetch_user_data()
    print("テストが成功しました!")

テスト関数を実行し、エラーが出なければ「テストが成功しました!」と表示します。

5. モックを使う際の注意点

6. まとめ

モックは、初心者からプロまで使える強力なツールです。
開発のスピードを上げたり、テストを簡単にしたりするために、ぜひ活用してみてください!

ヘッドウォータース

Discussion