テストコードを書こう
今回の記事はPythonでテストコードを書いてみたのでそれを共有します。
Python言語標準のユニットテストフレームワークであるunittest
を使用します。
テスト対象コード
今回のテスト対象コードは以下です。
def add(a, b):
if a == 1 and b == 3:
return 3
elif a == 3 and b == 3:
return 7
return a + b
テストコード(正常)
import unittest
from exsample import add
class AddTest(unittest.TestCase):
def test_get_sum_integers(self):
"""add関数のテストコード"""
actual = add(1, 2)
expected = 3
self.assertEqual(actual, expected)
def test_get_sum_integers_1(self):
"""add関数で例外発生"""
actual = add(3, 3)
excepted = 6
self.assertEqual(actual, excepted)
if __name__ == '__main__':
unittest.main()
実際のログ(OKの場合)
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
テストコード(エラー発生)
import unittest
from exsample import add
class AddTest(unittest.TestCase):
def test_get_sum_integers(self):
"""add関数のテストコード"""
actual = add(1, 2)
expected = 3
self.assertEqual(actual, expected)
def test_get_sum_integers(self):
"""add関数で例外発生"""
actual = add(3, 3)
excepted = 6
self.assertEqual(actual, excepted)
if __name__ == '__main__':
unittest.main()
実際の実行ログ(エラーの場合)
以下が実際のログになります。
二番目のメソッドで意図的の例外を発生させ、AssertionErrorになっています。
.F
======================================================================
FAIL: test_get_sum_integers_1 (__main__.AddTest)
add関数で例外発生
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\study\python実践認定\test_example.py", line 17, in test_get_sum_integers_1
self.assertEqual(actual, excepted)
AssertionError: 7 != 6
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (failures=1)
subTest()メソッド
1つのテストメソッドの中で複数のアサーションメソッドを呼び出すに使用するのが、subTest()メソッドになります。テスト対象コードは上に書いているものです。
import unittest
from exsample import add
class AddTest(unittest.TestCase):
def test_get_sum_of_two_integer(self):
"""2つの整数の合計を取得する"""
examples = [
[1, 2, 3],
[1, 3, 4],
[3, 3, 6],
]
for idx, example in enumerate(examples):
a, b, expected = example
with self.subTest(f'{a} + {b} = {expected}', idx = idx): # test失敗時にエラー内容を出力
self.assertEqual(add(a, b), expected) # アサーションメソッドはwithの中で呼び出す。
if __name__ == '__main__':
unittest.main()
実行ログ
idxの変数でどのメソッドがエラーになっているのか分かります。
======================================================================
FAIL: test_get_sum_of_two_integer (__main__.AddTest) [1 + 3 = 4] (idx=1)
2つの整数の合計を取得する
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\study\python実践認定\subtest.py", line 15, in test_get_sum_of_two_integer
self.assertEqual(add(a, b), expected) # アサーションメソッドはwithの中で呼び出す。
AssertionError: 3 != 4
======================================================================
FAIL: test_get_sum_of_two_integer (__main__.AddTest) [3 + 3 = 6] (idx=2)
2つの整数の合計を取得する
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\study\python実践認定\subtest.py", line 15, in test_get_sum_of_two_integer
self.assertEqual(add(a, b), expected) # アサーションメソッドはwithの中で呼び出す。
AssertionError: 7 != 6
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (failures=2)