Pythonのunittest.Mockでスタブを作って単体テストする

概要

  • 自作クラスに対して、unittest.mock.MagicMockを使ってモックを作成してテストする。

サンプルコード(挨拶を返すプログラムとテストコード)

(テストしたいファイル。ランダムで挨拶の語を選んで、挨拶文を返す)

# greeting.py
import random

class Greeting():
    def greeting_phrase(self, name):
        grt = self.greeting_word()
        result = f'{grt}! {name}.'
        print(result)
        return result

    def greeting_word(self):
        grt = ['Hello', 'Bonjour', 'Konnichiwa']
        i = random.randint(0, len(grt) - 1)
        return grt[i]


if __name__ == '__main__':
    g = Greeting()
    g.greeting_phrase('tanaka')
    # 「Hello! tanaka.」 「Bonjour! tanaka.」 「Konnichiwa! tanaka.」 のどれかが返る

(テストコード。unittest.mock.MagicMockを使ってモックを作成してテストする)

# test_greeting.py

from unittest import TestCase
from unittest.mock import patch, MagicMock
from greeting import Greeting

class TestGreeting(TestCase):
    def test_greeting_phrase(self):
        grt_mock = MagicMock()
        grt_mock.return_value = 'Hi'    # 挨拶の語を「Hi」に置き換える

        with patch('greeting.Greeting.greeting_word', grt_mock):
            g = Greeting()
            actual = 'Hi! yamada.'
            self.assertEqual(g.greeting_phrase('yamada'), actual)

補足

  • 自作クラスのメソッドを置き換える場合、単にメソッド名だけでなく、長い名前でフルで指定する。
    • 別フォルダ内にある.pyファイルに書かれているクラスをテストする場合に注意が必要。
  • クラス名など命名規則はPEP8をよく読む。

参考

コメントを残す

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