Python

pythonによるTDD実践(3):素数列挙機能をTDDで作ってみようその1

素数列挙機能の仕様

  • ある数字1 < n < 1000が与えられる
  • n未満の素数を列挙する

上記仕様を持つ機能をTDDで実装してみましょう。

テストの実装

では、TDDの原則に則りまずはどのようなケースをテストすべきか考えてみます。例えば、10未満の素数は、2, 3, 5, 7の4つです。従って、10が入力された場合には、この4つの数字が列挙される必要があります。そこで、次のテストコードを書きます:
test_prime_enumeration.py



def test_prime_enumeration():
  assert enumerate_prime_number_under(10) == [2, 3, 5, 7]

ここで、pytest test_prime_enumeration.pyを実行すると、テストが失敗します:


    assert enumerate_prime_numer_under(n) == [2, 3, 5, 7]
E     NameError: name 'enumerate_prime_numer_under' is not defined

test_prime_enumeration.py:4: NameError
========================================== short test summary info ==========================================
FAILED test_prime_enumeration.py::test_prime_enumeration - NameError: name 'enumerate_prime_numer_under' i...
============================================= 1 failed in 0.06s =============================================

enumerate_prime_number_under関数が未実装であることが失敗の原因となっています。次に、この失敗を解消するために、この関数を実装しましょう:
prime_enumerator.py


def enumerate_prime_number_under(n):
  pass

test_prime_enumeration.py


from tdd_prime.prime_enumerator import enumerate_prime_number_under

def test_prime_enumeration():
  assert enumerate_prime_number_under(10) == [2, 3, 5, 7]

再度テストを実行すると、


E     assert None == [2, 3, 5, 7]
E      +  where None = enumerate_prime_number_under(10)

test_prime_enumeration.py:4: AssertionError
========================================== short test summary info ==========================================
FAILED test_prime_enumeration.py::test_prime_enumeration - assert None == [2, 3, 5, 7]
============================================= 1 failed in 0.06s =============================================

と表示され、エラーは無くなったが、テストは依然失敗していることがわかります。ここで実装した関数は単にpassを実行するだけの何もしない関数なので当然そうなります。

まとめと次回以降について

  • 今回は、素数列挙のテストケースを作成した
  • 次回以降は、いよいよこのテストケースに通るような実装を行う
D.S S.O
データサイエンティストのS.Oです。