こんにちは、ナイトレイインターン生の保科です。
Wantedlyをご覧の方に、ナイトレイのエンジニアがどのようなことをしているか知っていただきたく、Qiitaに公開している記事をストーリーに載せています。
今回はエンジニアの船津さんの記事です。
少しでも私たちに興味を持ってくれた方は下に表示される募集記事もご覧ください↓↓
最近、初めてユニットテストを書いたので、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()の機能に加えて、マジックメソッドをモック化する機能が標準で備わっていることがわかりました。