ウェブエンジニア問題集

単体テストとは

単体テストは本番コードとは性質が異なり、目的なく書けば無駄になる。

この章では、まず「単体テストの定義」を整理します。

学習者学習者

テストは書いた方がいいって言われるけど、何を確認すれば「テストした」ことになるの?

そもそも単体テストとは

単体テストとは、関数やクラスなどの小さな単位が、期待通りに動作するかを自動的に検証する仕組みだ。

  • 単体(ユニット 少量)のコードのテスト
  • 実行環境が隔離されている
PCで作業をしている女性のイラスト

単体テストの目的は、アプリケーションの継続的な開発において、コードの成長速度を落とさないこと

理由は、テストがなければリファクタリングや機能追加のたびに既存機能の動作保証が手作業になり、変更コストが時間とともに増大するからだ。

テストがあれば、変更の影響を即座に検知でき、安心してコードを変え続けられる。

もう一つ重要なのは仕様の明文化です。

テストコードは「この関数はこの入力に対してこの結果を返すべき」という仕様そのものになります。

コメントやドキュメントと違って実行可能なので、コードと乖離しません

各テストメソッドが「この実装コードは何を保証しているのか」を語るべきだ、というのはテスト設計の基本的な考え方です。

良いテストとは

テストコードはプロダクションコードと同様に、増えるほど保守コストが増大する。 テストは資産ではなく負債であり、価値のないテストは負債だけを積み上げる。

良いテストとは、コードで重要な部分が対象とされていて、最小限の保守コストで最大の価値を生み出すものだ。

テストの質とカバレッジは別物だ。

カバレッジが測るのは「その行が実行されたかどうか」だけであり、「正しい結果を検証しているか」は一切見ていない。

たとえば関数を呼ぶだけで戻り値が正しいかを確認しなくても、カバレッジは上がる。つまりカバレッジを上げること自体を目的にすると、通過するだけで何も守らないテストが量産される。

カバレッジは目標ではなく、テストされていない箇所を見つけるための参考指標として使うべきだ。