Python の mock.patch の使い方

Python の mock.patch の使い方Python
ゆうすけ
ゆうすけ

Python でテストを書くときにモックを使いたいです。

資格マフィア
資格マフィア

標準ライブラリの unittest でモックを使うことができるぞ。
対象関数をモックすることで戻り値を疑似的に設定することもできる。

 

✔️ 本記事のテーマ

Python でテストを書くときに mock を使う

 

✔️ 読者さんへの前置きメッセージ

本記事は
「Python でテストにおける mock の使い方」
について書いています。

 

この記事を読むことで
「unittest ライブラリの mock.patch の使い方」
について理解できます。

 

再現の難しい関数や未完成の関数を含めて、
テストを書くときに mock を使いたいときがあるでしょう。

 

Python ではテスト用ライブラリの unittest を使って対象関数を mock することで、
プログラムの挙動を疑似的に設定することができます。

 

この記事では

  • mock とは?
  • Python における mock とは?

を解説します。

 

では、解説していきましょう。

 

mock とは?

mock とは?

mock とは(主に)テストに必要な値を擬似的に設定するものです。

 

「A 関数の中で B 関数を呼び出している」みたいな処理があるとします。

さらに
「A 関数の処理をテストしたいけど B 関数がまだ完成していない…」
みたいな状況だとします

 

このようなときに
B 関数の処理内容をテストケース内で疑似的に設定するのが mock です。

こうすることで
B 関数の処理内容に依存することなく、A 関数のテストをできます。

 

Python で mock を使うには

Python で mock を使うには

Python で mock を使うには unittest ライブラリを使用します。

unittest は Python 標準のテストライブラリです。

 

以下のように import することで unittest の mock を使うことができます。

import unittest.mock

 

 

unittest.mock.patch の使い方

unittest.mock.patch の使い方

それでは具体的に mock の使い方を見ていきましょう。

 

結論から述べると以下のコードのようにして、mock を適用させます。

@unittest.mock.patch('<mockの対象のPATH>')
def test_a(<適当な引数名>):
    適当な引数名.return_value = <テスト内で期待される値>
    
    ...テストコード...

 

ポイントとしては

  • @unittest.mock.patch(‘<mockの対象のPATH>’)
  • 適当な引数名.return_value = <テスト内で期待される値>

という感じで対象の処理を mock に置き換えて、その mock の処理内容を定義します。

 

ただ、これだけだと mock の「使い方」も「ありがたさ」が分かりにくいので、
次の章で、実際のユースケースを踏まえて説明していきましょう。

 

mock を使用する具体例

mock を使用する具体例

以下のようなコードがあるとします。

def b(num1 ,num2):
    return num1 + num2

def a(num1, num2):
    sum_num = b(num1, num2)
    return sum_num ** 2

 

このようなときに a() のテストを作成します。

def test_a():
    expected = a(2, 3)
    assert expected == 25

これで a() のテストを行うことができます。

 

ただし、 このままでは b() の処理を変えたときにこのテストコードも変更しないといけません。

本来、このテストコードは a() の処理内容を検証したいテストなのに、
b() の処理にも影響を受けているので、あまりよくないです。

 

そこで、b() の処理をテストコードの中で mock に置き換えます。

import unittest.mock


@unittest.mock.patch('sample.b')
def test_a(mock_b):
    mock_b.return_value = 5
    expected = a(2, 3)
    assert expected == 25

 

これで、a() の処理内容だけを検証するテストコードになりました。

このように mock を使うことで保守性の高いテストコードになります。

これが mock の一番のありがたさと言えるでしょう。

 

試しに、b() の処理内容を pass に置き換えてもこのテストコードは動きます。

import unittest.mock


def b():
    pass

def a(num1, num2):
    sum_num = b(num1, num2)
    return sum_num ** 2


@unittest.mock.patch('sample.b')
def test_a(mock_b):
    mock_b.return_value = 5
    expected = a(2, 3)
    assert expected == 25

もっとスキルをつけるなら

もっとスキルをつけるなら

Python で mock を使ってテストする方法について解説しました。

 

プログラミングにおいてテストの作成は重要でかつ必須のスキルです。

 

Pythonのテスト開発を学ぶためには以下の書籍がオススメです。

 

この書籍は

  • ソフトウェア開発におけるテストとは何か
  • python における test とは何か

というレベルから実践的なテスト方法まで非常に分かりやすく解説されています。

 

その人気からKindle本も出版されています。

Amazonからであれば、試し読みもできるので、一度見てみるのもオススメです。

エンジニアとしての自身の価値をチェックする(完全無料)

エンジニアとして、

自分の価値がどれくらいのものかご存知でしょうか?

 

エンジニアとしてIT業界に身を置いていると

今の会社でずっと働くのか、フリーランスとして独立するのか …

と様々な選択肢があります。

 

どの選択肢が正解なのかを見極めるためにも、選択肢を広げるためにも

自身の価値を知っておくことはとても重要です。

 

TechClips ME では、

職務経歴書をアップロードするだけで企業からのスカウトを受けることができます。

▼▼▼▼▼

▲▲▲▲▲

しかもTechClips MEでは想定年収を企業から提示してくれるので、

自身の価値を数字で分かりやすくたしかめることができます。

 

登録はもちろん完全無料なので、一度登録してみると良いかもしれません。

 

コメント

タイトルとURLをコピーしました