HOWTO · Python

Python での入力に基づく戻り値のモック

この記事では、Python での入力に基づくモックの戻り値について説明します。

このページの内容

この記事では、Python で入力に基づいてさまざまな値を返すモック関数を作成する方法を示します。 また、モック関数をテストする方法も示します。

最後に、関数をモックするためのより高度な手法をいくつか紹介します。 理解を深めるために、プログラミングやテストについて知る必要はありません。

Python での入力に基づく戻り値のモック

Python は、テスト ツールの豊富なエコシステムを備えた非常に強力な言語です。 単体テストに最適な多くの機能を備えています。

人気のあるツールの 1つは mock モジュールです。これにより、システムの一部をモック オブジェクトに置き換え、それらがどのように使用されたかをアサートできます。

関数のモッキングを使用すると、関数の機能をコードで置き換えることができます。 これは、関数が利用できない場合のコードの動作をテストしたい場合や、コードがさまざまな入力にどのように反応するかをテストしたい場合に役立ちます。

Python でのモッキングの使用

モッキングは、テストの信頼性と効率を向上させるために使用できる強力な手法です。 この記事では、Python テストでモック オブジェクトを使用する方法を説明します。

  1. モッキングにより、実際のオブジェクトをシミュレートされたバージョンに置き換えることができます。 これは、まだ利用できない別のコンポーネントに依存するコンポーネントをテストしたい場合に役立ちます。

    たとえば、実際にデータベースに接続せずにデータベース接続をテストしたい場合があります。

  2. モッキングは、外部依存関係をスタブ化するためにも使用できます。 これは、テスト中にネットワーク呼び出しやデータベースとのやり取りを避けたい場合に役立ちます。

  3. モッキングは、テストの効率を改善するために使用できます。 オブジェクトをモックすると、実際のオブジェクトをインスタンス化するオーバーヘッドを回避できます。

    これは、多数のオブジェクトをインスタンス化するコードをテストする場合に特に役立ちます。

  4. モッキングは、テストの信頼性を高めるためにも使用できます。 外部依存関係をスタブ化することで、ネットワークまたはデータベースの可用性に依存する不安定なテストを回避できます。

Python でモック オブジェクトを使用する

テストでモック オブジェクトを使用するには、まずモック クラスを作成する必要があります。 このクラスを使用して、本物のように見えて動作するモック オブジェクトを作成できます。

Mock クラスを作成したら、モック オブジェクトをインスタンス化し、テストで使用できます。 モック オブジェクトには、置き換えようとしている実際のオブジェクトと同じメソッドがすべて含まれているため、実際のものと同じように使用できます。

モック オブジェクトの使用が終了したら、それが正しく使用されたと断言できます。 たとえば、クエリの実行にモック データベース接続が使用されたと断言できます。

したがって、モッキングは、Python テストの信頼性と効率を向上させるために使用できる強力なツールです。

実際のオブジェクトをモック オブジェクトに置き換えることで、実際のオブジェクトをインスタンス化するオーバーヘッドを回避できます。 テストの信頼性を高めるために、外部依存関係をスタブ化することもできます。

Python でのモックの意味

モッキングという言葉はいくつかの文脈で使われています。 ただし、このドキュメント全体で次の定義が使用されます。

1つ以上の実際の関数呼び出しまたはオブジェクトを偽の呼び出しまたはオブジェクトに置き換えるプロセス。

モック関数の呼び出しは、実際の作業なしで事前設定された瞬間的な値を提供します。 偽のオブジェクトの特性とメソッドは、最初に実際のオブジェクトを生成したり、他の作業を行ったりすることなく、完全にテスト内で同じ方法で定義されます。

テストに関して言えば、テストを書いた人が関数呼び出しの戻り値を定義できるという事実は、彼らに途方もない力を与えます。 ただし、テストを作成する人は、すべてを正確にセットアップするためにいくつかの基本的な作業を行う必要があることも意味します。

Python の unittest.mock モジュールは、プログラミング言語でのモックを担当するものです。 デコレータおよびコンテキスト マネージャとして機能する patch 関数と、MagicMock クラスは、このモジュールの 2つの重要なクラスと関数です。

他にも役立つクラスやメソッドがいくつか含まれています。 Python のモックに関連する作業のほとんどは、これら 2つの堅牢なコンポーネントを使用して行うことができます。

入力に基づいて異なる値を返すモックを書く

これで、モックとその機能について十分に理解できました。 コーディング例でモックをよりよく理解しましょう。

関数を作成するには、*args**kwargs を使用します。これは、これらのパラメーターが単純なキーワード引数を取るためです。 したがって、文字列、整数、浮動小数点数、ブール値など、任意のデータ型を渡すことができ、キーワード引数にも値を割り当てることができます。

  • 関数を作成します。
  • 引数 *args とキーワード引数 **kwargs を渡す
  • *args**kwargs を持つタプルを返します
  • 関数を呼び出す
  • 結果を印刷する

理解を深めるために、以下のコードを見てください。

def mock_function(*args, **kwargs):
    return (args, kwargs)


mock_function("x", "y")
(("x", "y"), {})
mock_function("x", y=2, z="mock test")

出力:

(('x',), {'y': 2, 'z': 'mock test'})

コード出力では、*args の値が最初に出力されていることがわかります。これは、x**kwargs の値 {'y': 2, 'z': 'mock test'}) です。 の後に印刷されます。

入力に基づいて返す Python モック

次に、前に説明した関数を返すモックを作成します。

  • モック関数を作成するには、まず unittest.mock モジュールから MagicMock をインポートします。
  • 変数を作成し、unittest.mockMagicMock を使用します。
  • 結果を印刷します。

コード例:

from unittest.mock import MagicMock

my_mock_1 = MagicMock(name="abid", return_value=mock_function)
my_mock_1

出力:

<MagicMock name='abid' id='139916486559696'>

コード出力は、MagicMock コマンドが使用されていることを示しています。 そして、コードで使用した abid という名前と、コードによって生成された ID 番号を確認できます。

ここで、別の変数を作成して、変数 my_mock_1 がどこにあるかを確認します。

コード例:

func_from_mock2 = my_mock_1()
func_from_mock2

出力:

<function __main__.mock_function(*args, **kwargs)>

コード出力は、関数が引数 *args とキーワード引数 **kwargs を持っていることを示しています。

ここで、変数 func_from_mock2 にいくつかの値を与えます。 そこで、10, 10 を渡して出力します。

コード例:

func_from_mock2(10, 10)

出力:

((10, 10), {})

出力 ((10, 10)) は引数 *args を使用したことを意味し、 {} はキーワード引数 **kwargs を使用できることを意味します。

ここで、キーワード引数 **kwargs を使用します。

コード例:

func_from_mock2(15, 18, パラメータ=50)

出力:

((15, 18), {'param': 50})

引数 *args とキーワード引数 **kwargs の両方を使用しました。 ((15, 18), はモック入力の引数部分を示し、{'param': 50}) はモック入力のキーワード引数部分を示します。

つまり、これが Mock が入力に基づいて異なる値を返す方法です。

この Python 記事が、Python で Mock を使用する方法を理解するのに役立つことを願っています。