Skip to content
Latchkey

ユニットテストとは?

ユニットテストは、1つの関数やクラスのような単一の小さなコード片を、システムの他の部分から隔離してチェックします。

ユニットテストは、ほとんどのスイートで最も小さく最も数の多いテストです。それぞれがデータベースもネットワークも他の可動部もなしに単一の振る舞いのユニットを動かすため、ミリ秒単位で実行され、1つの明確な理由で失敗します。これらはテストピラミッドの土台を形成します。

ユニットとみなされるもの

ユニットとは、それ自体でテストする価値のある最小のコード片であり、多くの場合は単一の関数やメソッドです。決定的な特徴は隔離です。ユニットテストは外部システムに触れないため、その結果はあなたが与える入力にのみ依存します。

ユニットテストが高速で焦点が定まる理由

I/Oを避けるため、ユニットテストは数秒で何千も実行されます。1つが失敗したとき、原因はローカルで明白であり、書くのも実行するのもデバッグするのも安価になります。その速さこそが、開発者が絶えずそれらを実行できる理由です。

シンプルな例

価格をフォーマットする関数は入力と出力が明確なので、ひと握りのassertでその振る舞いを完全に記述できます。

A focused unit test
test("formats price", () => {
  expect(formatPrice(1999)).toBe("$19.99");
  expect(formatPrice(0)).toBe("$0.00");
});

よくある落とし穴

  • データベースやネットワークに手を伸ばし、それがintegration testになってしまうこと。
  • 振る舞いではなく内部の実装詳細に対してアサーションすること。
  • テストが実際の使い方をもはや反映しなくなるまで過剰にmockすること。
  • 小さく焦点の定まった複数のテストの代わりに1つの巨大なテストを書くこと。

CIスイートにおけるユニットテスト

ユニットテストは高速で決定論的なため、CIで最初のゲートになります。1つを壊すpull requestは数秒以内に失敗するはずです。ユニット層を大きく、より遅い層を小さく保つことが、CIスイートを高速にします。高速なrunnerでは、その層は大規模なコードベースでも1分を大きく下回って終えられます。

重要なポイント

  • ユニットテストは1つの小さなコード片を隔離して動かします。
  • 隔離により、ユニットテストは高速で、焦点が定まり、デバッグしやすくなります。
  • これらはテストピラミッドの広い土台を形成し、CIで最初に実行されます。

関連ガイド