🧪

pytestのfixtureとmonkeypatchでモック関数を作成する

2024/11/26に公開

はじめに

本記事ではpytestのfixturemonkeypatchを使用し、モックを使った単一の関数のテストを実装していきます。

環境構築

pip install pytest

https://pypi.org/project/pytest/

fixture

fixtureは内部で定義した関数をretrunする事で、モック関数として使用できます。

@pytest.fixture
def mock_get_message():
    def _mock():        # ステップ1: 内部で関数を定義
        return "モックのメッセージ"
    return _mock        # ステップ2: 関数自体を返す

https://docs.pytest.org/en/stable/explanation/fixtures.html

サンプル

簡単な関数をテストするサンプルコードを作ってみます。

target.py
def get_message():
    return "こんにちは"

def display_message():
    msg = get_message()
    return f"メッセージ: {msg}"
test_target.py
import pytest
from target import display_message


# モック関数
@pytest.fixture
def mock_get_message():
    def _mock():
        return "モックのメッセージ"
    # _mock関数を返す
    return _mock

def test_display_message(monkeypatch, mock_get_message):
    # 元の関数(get_message)をモック関数(mock_get_message)に置き換え
    monkeypatch.setattr('target.get_message', mock_get_message)
    # 実行時:メッセージ: モックのメッセージ == メッセージ: モックのメッセージ
    assert display_message() == "メッセージ: モックのメッセージ"

https://docs.pytest.org/en/stable/how-to/monkeypatch.html

実行

下記のコマンドを実行してみます。

pytest test_target.py -v

実行したところ下記のようにテストがPASSしたことを確認できました。

============================= test session starts ==============================
~~~~~
collected 1 item

test_target.py::test_display_message PASSED                              [100%]

============================== 1 passed in 0.01s ==============================

このようにfixturemonkeypatchを使用することで、対象の関数がモック関数に置き換わっている事を確認できました。

Discussion