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

# テストコードを書こう
今回の記事はPythonでテストコードを書いてみたのでそれを共有します。
Python言語標準のユニットテストフレームワークである`unittest`を使用します。

## テスト対象コード
今回のテスト対象コードは以下です。
```python
def add(a, b):
    if a == 1 and b == 3:
        return 3
    elif a == 3 and b == 3:
        return 7
    return a + b
```

## テストコード（正常）

```python
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
```
## テストコード(エラー発生)
```python
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()メソッドになります。テスト対象コードは上に書いているものです。

```python
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)
```