最近、初めてユニットテストを書いたので、python のテストフレームワークに登場するmocker.Mock()とMagicMock()の違いについて調べてみました。
ざっくりとした違い
mocker.Mock()とMagicMock()は、それぞれ異なるテストフレームワークに由来します。mocker.Mock()はpytestの一部であり、MagicMock()はunittestの一部です。
そもそもmockとは?
モック(mock)とは、テストに必要な部品を擬似的に再現するために用いられます。これにより、テスト対象コードで呼び出しているメソッドや外部ライブラリの機能をモック化し、テスト対象コードの外部依存を排除して適切なテストを行うことができます。
また、モック化に使用するテストフレームワークのクラス自体をモックと呼ぶこともあるため、文脈に応じて注意が必要です。
pytestとunittest
では、mocker.Mock()とMagicMock()について見ていきます。それぞれのオブジェクトが所属するテストフレームワークにも触れていきます。
pytest- mocker.Mock()
pytestは、サードパーティ製のpythonのテストフレームワークです。後に紹介する、標準ライブラリのunittestよりも使い勝手が良い(らしい)ので、pytestを使ってテストを書くことが多いようです。
mockerとは、pytest-mockライブラリの一部であり、pytestと共に使用されることが多いようです。pytest-mockは、pytestのためのモッキングツールを提供し、その中のmockerで、Mock()が利用されます。
mocker.Mock()は、pytest-mockによって提供されるモックオブジェクトです。
unittest -MagicMock()
unittestはPythonの標準ライブラリであり、Pythonに組み込まれているテストフレームワークです。使いやすさや機能の点でpytestに劣ることがあるため、主に
MagicMock()はunittest.mockモジュールから提供されるモックオブジェクトです。Mock()クラスの拡張で、特定のマジックメソッド(例えば__getitem__
, __setitem__
, __iter__
など)を標準でモック化する機能を持っています。
結論:
mocker.Mock()とMagicMock()は、それぞれ異なるテストフレームワークに由来しており、MagicMock()はmocker.Mock()の機能に加えて、マジックメソッドをモック化する機能が標準で備わっていることがわかりました。