見出し画像

[Python]フィボナッチ数列の単体テストをしてみる

1.単体テスト


今まで書いたプログラムは実際に実行して期待通りの結果が表示されることで確認してきました。そこで、今回は書いたプログラムを別途テストするプログラムを作成します。
 やることは関数を最小の単位として、「引数に渡した値で返ってくる値」と「渡した値で返ってくるであろうなという自身が考える期待値」が一致するかどうかで判断するテストプログラムを書きます。フィボナッチ数列を例にしたいと思います。

2.フィボナッチ数列

フィボナッチ数列のリストを生成する関数を作成します。渡す引数は生成する数列の上限値とします。例えば、5を上限値として返ってくるリストは[0, 1, 1, 2, 3]になります。以下が今回テストする関数です。
 また、今回このコードを書いたファイル名はfibo.pyとします。

def return_fibo_list(max_num):
    fibo_list = []
    a = 0
    b = 1
    while a < max_num:
        fibo_list.append(a)
        a, b = b, a + b
    return fibo_list

3.unittestモジュールを使ったテストプログラム

上記2で作成したプログラムをテストするプログラムを作成します。unittestモジュールを使います。以下がテストコードになります。

from fibo import return_fibo_list
import unittest

class FiboTest(unittest.TestCase):
    expected_value_5 = [0, 1, 1, 2, 3]
    expected_value_10 = [0, 1, 1, 2, 3, 5, 8]
    expected_value_20 = [0, 1, 1, 2, 3, 5, 8, 13]
    
    def test_fibo_list(self):
        self.assertEqual(self.expected_value_5, return_fibo_list(5))
        self.assertEqual(self.expected_value_10, return_fibo_list(10))
        self.assertEqual(self.expected_value_20, return_fibo_list(20))

if __name__ == "__main__":
    unittest.main()

4.実行結果(正常)

テストケースが全て正しい想定の場合の表示結果

0, 1, 1, 2, 3]
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

5.実行結果(異常)

テストケースの期待値をわざと書き換えてみます。
expected_value_20 = [0, 1, 1, 2, 3, 5, 8, 13]の末尾13を15に変更します。

[0, 1, 1, 2, 3]
F
======================================================================
FAIL: test_fibo_list (__main__.FiboTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "fibo_unittest.py", line 12, in test_fibo_list
    self.assertEqual(self.expected_value_20, return_fibo_list(20))
AssertionError: Lists differ: [0, 1, 1, 2, 3, 5, 8, 15] != [0, 1, 1, 2, 3, 5, 8, 13]

First differing element 7:
15
13

- [0, 1, 1, 2, 3, 5, 8, 15]
?                        ^

+ [0, 1, 1, 2, 3, 5, 8, 13]
?                        ^

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (failures=1)



この記事が気に入ったらサポートをしてみませんか?