Pythonのunittestモジュールでは、テスト対象の関数やメソッドが返す値を制御するためにpatch
とreturn_value
を使用します。これにより、テスト対象のコードが依存する部分を制御し、テストをより柔軟に、かつ確実に行うことができます。
patchとreturn_valueの基本的な使い方
まずは、patch
とreturn_value
を使った基本的な例から見ていきましょう。以下のコードは、random.choice
関数をパッチして常に2を返すようにしています。
import random
from unittest.mock import patch
with patch("random.choice") as mock_choice:
mock_choice.return_value = 2 # withブロックの中では2しか返らなくなります
for i in range(5):
print(random.choice([1, 2, 3, 4, 5])) # すべて2が出力されます
このコードを実行すると、random.choice
関数は常に2を返すようになります。つまり、return_value
を使うことで、パッチした関数の返り値を自由に制御できるのです。
patchとreturn_valueを使ったテストコードの例
次に、patch
とreturn_value
を使ったテストコードの例を見てみましょう。以下のコードは、Sample
クラスのmain
メソッドをテストしています。
import unittest
from sample import Sample
class TestSample(unittest.TestCase):
def setUp(self):
""" Set object """
self.obj = Sample()
def tearDown(self):
""" Initiallize the object """
self.obj = None
self.number = None
def test00_no_mock(self):
""" test without mock """
self.number = self.obj.main()
self.assertEqual(self.number, 2)
このテストコードでは、Sample
クラスのmain
メソッドが2を返すことを確認しています。しかし、main
メソッドが内部で依存している他のメソッドや関数の挙動を制御したい場合はどうすればよいでしょうか。そのような場合には、patch
とreturn_value
を使います。
以上、Pythonのunittestモジュールでpatch
とreturn_value
を使う方法について説明しました。これらの機能を使うことで、テスト対象のコードが依存する部分を制御し、テストをより柔軟に、かつ確実に行うことができます。ぜひ活用してみてください。