JS

ユニットテスト

中級

読み方:ユニットテスト|英語:Unit Test

関数やモジュール単位で正しく動作するか確認するテストで、バグの早期発見に役立つよ。

やさしい説明

ユニットテストは、関数やモジュールが正しく動くか1つずつ確認するテストです。コードを変更したときに既存の機能が壊れていないか自動で確認できます。

テストの答え合わせを自動化するイメージです。「add(1, 2) の結果は 3 になるはず」と書いておけば、コードを変更するたびに自動で確認してくれます。

Jest、Vitest などのテストフレームワークを使って書きます。

具体例・使い方

// add.js — テスト対象の関数
export function add(a, b) {
  return a + b;
}

export function divide(a, b) {
  if (b === 0) throw new Error("0で割れません");
  return a / b;
}
// add.test.js — テストファイル
import { add, divide } from "./add";

test("1 + 2 = 3になる", () => {
  expect(add(1, 2)).toBe(3);
});

test("負の数も正しく計算できる", () => {
  expect(add(-1, -2)).toBe(-3);
});

test("0で割るとエラーが投げられる", () => {
  expect(() => divide(10, 0)).toThrow("0で割れません");
});

テストの種類

  • ユニットテスト — 関数・クラスなど最小単位をテスト。速くて書きやすい
  • インテグレーションテスト — 複数のモジュールを組み合わせた動作をテスト
  • E2Eテスト — ブラウザを通じてユーザー操作全体をテスト(Playwright、Cypress)

実務では「ユニットテストを多く、E2Eテストは重要な操作のみ」というピラミッド構造が基本です。ユニットテストは高速で安定しているため、まずここから始めましょう。

よく使うアサーション(検証メソッド)

// toBe: 厳密な等値チェック(プリミティブ値に使う)
expect(add(1, 2)).toBe(3);

// toEqual: オブジェクト・配列の中身が等しいか
expect(getUser()).toEqual({ name: "太郎", age: 20 });

// toBeTruthy / toBeFalsy: trueっぽい/falseっぽい値
expect("hello").toBeTruthy();
expect("").toBeFalsy();

// toContain: 配列や文字列に含まれるか
expect([1, 2, 3]).toContain(2);

// toThrow: エラーが投げられるか
expect(() => divide(1, 0)).toThrow();

いつ使う?

  • 重要なロジック(計算・バリデーション・データ変換)を書いたとき
  • リファクタリング前に安全網として書くとき
  • バグを修正したあと、同じバグが再発しないようにするとき
  • チーム開発でコードの品質を保つとき

間違いやすいポイント

❌ テストが実装の詳細に依存しすぎる

「入力と出力(振る舞い)」をテストしましょう。内部の実装方法をテストすると、リファクタリングのたびにテストが壊れます。

❌ テストのためだけにコードを複雑にする

関数をシンプルに分割して単純な入出力にするのがベストです。テストしにくい関数はそもそも設計を見直すサインでもあります。

よくある疑問

Q: ユニットテストのツールは?

A: JavaScriptではVitest(高速)、Jest(定番)、Mochaなどが代表的です。新規プロジェクトにはVitestがおすすめです。

Q: テストの書き方は?

A: test('1+2は3', () => { expect(add(1,2)).toBe(3); }); のように「期待する結果」を書きます。

Q: テストを書くメリットは?

A: コード変更時に既存機能が壊れていないか自動確認できます。リファクタリングが安心してできるようになります。

関連用語

  • デバッグ — バグを見つけて修正する作業
  • バグ — プログラムの誤動作。テストで早期発見できる

関連ブログ記事

⚠️ 関連するエラー

❓ 関連するQ&A