テスト駆動開発を利用したfibonacciのコード作成 再帰呼出編
1.概要
開発手法としてKent BeckのTDD(Test-Driven Development)を活用しています。参考書籍ではJavaを利用してfibonacci関数をTDDで開発する手法が紹介されています。ここでは、Pythonを利用してJava版と同じことを実施します。
TDDはテストコードを作成し、そのテストコードがパスするコードを作成するという作業を続けて、目的とするコードを作成する手法です。アジャイル(XP手法)の1つであり、スクラムなどの開発でも幅広く利用されている方法です。テストコードはUnitテスト方式で作成します。UnitテストはKent Beckが開発したものです。
2.詳細
fibonacci数列は、0,1,1,2,3,5,8,13,.....と継続する数列で、先行する2つの数値を足した値が、次の数値になる無限に続く数列です。初期値と次の値は、0と1になっています。
(1) testcode(TestFibonacci.py)を作成
import unittest
from fibonacci import Fibonacci
class TestFibonacci(unittest.TestCase):
None
if __name__ == '__main__':
unittest.main()
(2) testcode(TestFibonacci.py)を実行
python3 TestFibonacci.py
fibonacciが存在しないとのエラー発生
Traceback (most recent call last):
File "TestFibonacci.py", line 4, in <module>
from fibonacci import Fibonacci
ModuleNotFoundError: No module named 'fibonacci'
(3) code(finonacci.py)を作成
class Fibonacci:
None
if __name__ == '__main__':
obj = Fibonacci()
(4) testcode(TestFibonacci.py)を実行
python3 TestFibonacci.py
実行エラーがなくなりました。これで、testcodeとcodeのベースができました
Ran 0 tests in 0.000s
OK
(5) testcode(TestFibonacci.py)を修正
初期値の0,1を記述します。
import unittest
from fibonacci import Fibonacci
class TestFibonacci(unittest.TestCase):
def setUp(self):
self.obj = Fibonacci()
def tearDown(self):
del self.obj
def testFibonacci01(self):
assert(self.obj.fibonacci(0) == 0)
assert(self.obj.fibonacci(1) == 1)
if __name__ == '__main__':
unittest.main()
(6) testcode(TestFibonacci.py)を実行
python3 TestFibonacci.py
testFibonacci01でエラー発生。fibonacci(0)が計算できていない
ERROR: testFibonacci01 (__main__.TestFibonacci)
----------------------------------------------------------------------
Traceback (most recent call last):
File "TestFibonacci.py", line 13, in testFibonacci01
assert(self.obj.fibonacci(0) == 0)
AttributeError: 'Fibonacci' object has no attribute 'fibonacci'
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (errors=1)
(7) code(finonacci.py)を修正
初期値処理を追加します
class Fibonacci:
def fibonacci(self, number):
if number == 0:
return 0
if number == 1:
return 1
if __name__ == '__main__':
obj = Fibonacci()
(8) testcode(TestFibonacci.py)を実行
python3 TestFibonacci.py
エラーがなくなります
Ran 1 test in 0.000s
OK
(9) testcode(TestFibonacci.py)を修正
3番目の項目の試験を記述します。
1番目と2番目の項目を加えると、3番目の項目になります。
import unittest
from fibonacci import Fibonacci
class TestFibonacci(unittest.TestCase):
def setUp(self):
self.obj = Fibonacci()
def tearDown(self):
del self.obj
def testFibonacci01(self):
assert(self.obj.fibonacci(0) == 0)
assert(self.obj.fibonacci(1) == 1)
assert(self.obj.fibonacci(2) == \
self.obj.fibonacci(0) + self.obj.fibonacci(1))
if __name__ == '__main__':
unittest.main()
(10) testcode(TestFibonacci.py)を実行
python3 TestFibonacci.py
testFibonacci01でエラー発生。fibonacci(2)が計算できていない
FAIL: testFibonacci01 (__main__.TestFibonacci)
----------------------------------------------------------------------
Traceback (most recent call last):
File "TestFibonacci.py", line 15, in testFibonacci01
assert(self.obj.fibonacci(2) == \
AssertionError
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (failures=1)
(11) code(finonacci.py)を修正
3番目以降の処理を追加します
class Fibonacci:
def fibonacci(self, number):
if number == 0:
return 0
if number == 1:
return 1
return (self.fibonacci(number-2) + self.fibonacci(number-1))
if __name__ == '__main__':
obj = Fibonacci()
(12) testcode(TestFibonacci.py)を実行
python3 TestFibonacci.py
エラーがなくなります
Ran 1 test in 0.000s
OK
(13) testcode(TestFibonacci.py)を修正
10番目の項目の試験を記述します。
8番目と9番目の項目を加えると、10番目の項目になります。
import unittest
from fibonacci import Fibonacci
class TestFibonacci(unittest.TestCase):
def setUp(self):
self.obj = Fibonacci()
def tearDown(self):
del self.obj
def testFibonacci01(self):
assert(self.obj.fibonacci(0) == 0)
assert(self.obj.fibonacci(1) == 1)
assert(self.obj.fibonacci(2) == \
self.obj.fibonacci(0) + self.obj.fibonacci(1))
assert(self.obj.fibonacci(10) == \
self.obj.fibonacci(8) + self.obj.fibonacci(9))
if __name__ == '__main__':
unittest.main()
(14) testcode(TestFibonacci.py)を実行
python3 TestFibonacci.py
Ran 1 test in 0.000s
OK
これで、fibonacci関数プログラムfibonacci.pyが完成しました。
参考
テスト駆動開発入門 ケント・ベック著
コメント
コメントを投稿