🧪
pytestのfixtureとmonkeypatchでモック関数を作成する
はじめに
本記事ではpytestのfixture
とmonkeypatch
を使用し、モックを使った単一の関数のテストを実装していきます。
環境構築
pip install pytest
fixture
fixtureは内部で定義した関数をretrunする事で、モック関数として使用できます。
@pytest.fixture
def mock_get_message():
def _mock(): # ステップ1: 内部で関数を定義
return "モックのメッセージ"
return _mock # ステップ2: 関数自体を返す
サンプル
簡単な関数をテストするサンプルコードを作ってみます。
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() == "メッセージ: モックのメッセージ"
実行
下記のコマンドを実行してみます。
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 ==============================
このようにfixture
とmonkeypatch
を使用することで、対象の関数がモック関数に置き換わっている事を確認できました。
Discussion