2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-07-25

概要

  • 自作クラスに対して、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をよく読む。

参考

2
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?