LoginSignup
0
0

【Python-unittest】テストコード書いてみた!!

Posted at

テストコードを書こう

今回の記事は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)
0
0
0

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
0
0