Python のモックとパッチの違い

Marion Paul Kenneth Mendoza 2023年6月21日
  1. Python での Mock オブジェクト ライブラリと Patch オブジェクト ライブラリの使用と相違点
  2. まとめ
Python のモックとパッチの違い

テスト並列開発 (TPD) では、コード開発が最初に行われます。 それでも、コードを直接実行したり、コンソールを使用したりする代わりに、開発したテストを作成して実行し、コードの正確性を検証します。

Python には、単体テストと呼ばれるプロセスがあり、その中には mock 関数と patch 関数があります。 この記事では、2つの役割の用途と違いについて説明します。

Python での Mock オブジェクト ライブラリと Patch オブジェクト ライブラリの使用と相違点

この記事では、単体テスト全体には取り組みませんが、mock および patch 関数に焦点を当てます。

mock Python パッケージを使用して、テスト中のシステムの特定のコンポーネントを mock オブジェクトに置き換え、その使用法についてアサーションを行います。 これは Python 標準ライブラリのコンポーネントであり、Python 3.3 以降では unittest.mock としてアクセスできます。

unittest.mock クラスにより、テスト スイート全体で複数のスタブが不要になります。 特定のアクションを実行した後、メソッド/属性を使用したアサーションと、それらを呼び出した引数を設定できます。

戻り値を指定し、必要な機能を選択できます。

MagicDock は、Mock のサブクラスである Magic オブジェクトを処理できます。 Mock オブジェクトと MagicMock オブジェクトは、それらを使用して使用情報をログに記録すると、自然に特性とメソッドを生成します。

モックは、多くのモッキングで使用される record -> replay パターンの代わりに action -> assertion パターンに基づいています (つまり、最初に mock を使用してから、受け取った呼び出しについてアサーションを作成します)。 フレームワーク。 さらに、mock モジュールは patch() と呼ばれるデコレータを提供します。これは、テストのコンテキスト内でクラスおよびモジュール レベルの特性にパッチを適用し、一意のインスタンスを生成するためのセンチネルを処理します。

コード例:

from unittest.mock import patch


@patch("sample_module.sample_object")
def test_function(mock_object):
    print(mock_object)

出力:

<MagicMock name='sample_object' id='1870192341512'>

上記のコード スニペットは、以下のスニペットと同等です。

def test_function():
    with patch("sample_module.sample_module") as mock_object:
        print(mock_object)

この関数を使用すると、任意のオブジェクトを mock オブジェクトに置き換えて、製品コードの呼び出しを回避し、元のオブジェクトがどのように呼び出されるかを確認できます (オブジェクトが関数の場合)。 patch (または同様の方法) を使用することをお勧めします。これにより、パッチがテスト後 (または 2 番目のケースではコンテキスト マネージャー スコープの後) に元に戻され、他のテストやプログラムが影響を受けないことが保証されるためです。

まとめ

意思決定に役立てるために、次の点に注意してください。

  1. オブジェクトをmockオブジェクト(または他のオブジェクト)で便利に置き換え、完了後に以前の状態を復元するか、例外の場合はpatchデコレータ/コンテキストマネージャ機能を使用します。
  2. mock.patch は、手動で作成できる mock または派生オブジェクトを作成します。 手動でビルドされたものは、リセットを必要としないローカル関数またはその他のモックを修復するためにのみ使用されます。
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

関連記事 - Python Unittest