Pythonのunittestライブラリには、テスト対象のシステムの一部をモックオブジェクトに置き換えて使用することができます。これにより、テストスイート全体でスタブを作成する必要がなくなります。

以下に、Pythonのunittestでmockを使用する基本的な手順を示します。

Mockの基本的な使用方法

まずは、unittest.mockのMockクラスを使用して、基本的なモックの作成と使用方法を見てみましょう。

from unittest.mock import MagicMock
thing = ProductionClass()
thing.method = MagicMock(return_value=3)
thing.method(3, 4, 5, key='value')  # Returns: 3
thing.method.assert_called_with(3, 4, 5, key='value')

上記のコードでは、ProductionClassmethodをモック化し、その戻り値を3に設定しています。その後、methodを呼び出し、その呼び出しが期待通りであることを確認しています。

Mockと例外

Mockオブジェクトは、呼び出し時に例外を発生させることもできます。これは、side_effect属性を使用して設定できます。

from unittest.mock import Mock
mock = Mock(side_effect=KeyError('foo'))
mock()  # Raises: KeyError: 'foo'

上記のコードでは、mockオブジェクトが呼び出されるとKeyErrorが発生します。

モジュールやクラスのMock化

unittest.mockは、テスト中にモジュールやクラスのオブジェクトをモックに置き換えるためのpatchデコレータも提供しています。

from unittest.mock import patch
@patch('module.ClassName2')
@patch('module.ClassName1')
def test(MockClass1, MockClass2):
    module.ClassName1()
    module.ClassName2()
    assert MockClass1 is module.ClassName1
    assert MockClass2 is module.ClassName2
    assert MockClass1.called
    assert MockClass2.called
test()

上記のコードでは、module.ClassName1module.ClassName2がテストの間、それぞれMockClass1MockClass2に置き換えられます。テストが終了すると、元のオブジェクトに戻ります。

以上がPythonのunittestとmockの基本的な使用方法です。これらの機能を活用することで、より効率的なテストコードの作成が可能になります。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です