19:テストにテスト対象と同等の実装を書かない

テストを書けと言われるが、どう書けば良いかピンとこない という方は多いのではないでしょうか。 次のような例はとてもありがちな失敗です。

具体的な失敗

以下のMD5を計算する関数 calc_md5 の単体テストを考えましょう。

リスト 1.6 main.py
import hashlib


def calc_md5(content):
    content = content.strip()
    m = hashlib.md5()
    m.update(content.encode('utf-8'))
    return m.hexdigest()

この実装の単体テスト内で、実装内でも使われている hashlib.md5 を使ってはいけません。

リスト 1.7 tests.py
import hashlib
from main import calc_md5


def test_calc_md5():
    actual = calc_md5(" This is Content ")
    m = hashlib.md5()
    m.update(b"This is Content")
    assert actual == m.hexdigest()

よく見ると、テストの中に calc_md5 の実装と全く同じ処理が含まれています。 これではテストが成功することは間違いないので、テストの意味がありません。 実装で根本的に処理が間違っていても、テストが同じ結果になるので間違いには気づけません。

ベストプラクティス

テスト内で入出力を確認するときは、文字列や数値などの値をテスト内に直接書きましょう。 テスト内に、 テスト対象 とほぼ同等の実装を書いてはいけません。

リスト 1.8 tests.py
from main import calc_md5


def test_calc_md5():
    actual = calc_md5(" This is Content ")
    assert actual == b"e61994e96b20e3965b61de16077e18c7"

cover

(中略)詳細は書籍 自走プログラマー をご参照ください