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からであれば、試し読みもできるので、一度見てみるのもオススメです。

 

また、Pythonについて基礎から学ぶのであれば、オンラインスクールがオススメです。


オンラインスクールで学習すると、講義も分かりやすく、
サポート体制もしっかりしているので、これからPythonを学ぶ人にもオススメです。


オンラインで無料レッスンを体験することもできるので、
自分にあっているかどうかを確かめることができます。


オススメは以下の3つです。
どのスクールも無料体験が用意されているので、
契約前に自分に最適なスクールを探すことができるでしょう。

✔️オススメのプログラミングスクール ベスト3

これらのプログラミングスクールは全て無料の体験コースがあります。

 

「雰囲気だけでも知りたい」
「プログラミング学習の全体像を知りたい」
「スクールに入るかどうか迷っている」
という方はとりあえず無料カウンセリングを受けてみることをオススメします。

 

無料カウンセリングだけなら費用はかかりませんし、
スクールに通うにしろ、独学で学ぶにしろ、
カウンセリングで得ることができる情報には価値があります

 

プログラミングスクールについては「プログラミングスクールで失敗しないためには【オススメベスト3も紹介】」の記事でも紹介しています。


気になった方はぜひチェックしてみて下さい〜!

コメント

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