Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ モックとテストの分離 | Testing with unittest and pytest
Python構造化プログラミング

モックとテストの分離

メニューを表示するにはスワイプしてください

モッキングは、ユニットテストにおいて非常に強力な手法であり、テスト対象のシステムの一部をモックオブジェクトや関数で置き換えることができます。目的は、データベースやAPI、その他の複雑なシステムなどの依存関係からテスト対象のコード単位を分離することです。モックを使用することで、依存関係の挙動を制御し、管理された環境でコードのロジックのみをテストすることが可能になります。

テストの分離は、テスト同士が互いに干渉せず、スコープ外の要因に影響されないことを保証するために重要です。分離されたテストは、信頼性が高く、デバッグも容易です。なぜなら、テスト結果はテスト対象のコードと設定した特定の条件のみに依存し、外部システムの状態や挙動には依存しないからです。

Pythonでは、unittest.mockモジュールがオブジェクトや関数のモッキング用ツールを提供しています。モッキングを利用すると、実際の関数やオブジェクトを、制御された値を返したり、どのように使用されたかを記録したりするモックに置き換えることができます。これは、テスト中に遅かったり予測できなかったり利用できなかったりするリソースとコードがやり取りする場合に特に有用です。

12345678910111213141516171819202122232425
import unittest from unittest.mock import patch def check_the_sky(): # Simulate a slow or unreliable API raise ConnectionError("API not available") def get_advice(): if check_the_sky(): return "Take an umbrella." else: return "Enjoy the sunshine!" class TestWeather(unittest.TestCase): @patch('__main__.check_the_sky') def test_advice_when_rainy(self, mock_check): mock_check.return_value = True self.assertEqual(get_advice(), "Take an umbrella.") @patch('__main__.check_the_sky') def test_advice_when_clear(self, mock_check): mock_check.return_value = False self.assertEqual(get_advice(), "Enjoy the sunshine!") unittest.main(argv=[''], exit=False)

このコード例では、check_the_sky関数が外部依存(たとえば常に利用できるとは限らない天気APIなど)をシミュレートしています。get_advice関数はテストしたいロジックを含み、check_the_skyを呼び出してその結果に基づいてアドバイスを返します。

unittestのテストクラスでは、実際のcheck_the_sky関数をモックで置き換え、制御された値を返すようにしています。これにより、実際の外部システムに依存せず、空が晴れている場合や雨の場合など、さまざまなシナリオでget_adviceの挙動をテストできます。

@patchデコレーターは、各テストメソッドの実行中だけ実際のcheck_the_sky関数をモックオブジェクトに一時的に置き換えます。モックオブジェクトはmock_checkパラメータとしてテストメソッドに渡されます。mock_checkを使って、そのテストで返したい値を設定し、各シナリオでコードの挙動や返り値を制御できます。

Note
注意

このレッスンで使用されている関数 unittest.main() には、この学習環境専用の追加パラメータがいくつか含まれています。これらはプラットフォーム上でコードを正しく実行するために必要であり、今学ぶべきPythonの基本概念には含まれていません。

モックを使用することで、外部システムからテストを分離できます。外部システムは遅かったり信頼性が低かったりする場合があるため、モックを使うことでテストが高速で再現性があり、決定論的になります。各テストケースで依存関係が返す値を正確に制御できるためです。

question mark

ユニットテストでモックを使用すべきタイミングはいつですか?

すべての正しい答えを選択

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 5.  4

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 5.  4
some-alt