レベル1: ユニット/ロジックテスト
vitest または jest を使った純粋なJavaScriptのロジック、データ変換、状態のテスト。
レベル1がテストするもの
レベル1のテストは純粋なロジックを検証します。DOM、ブラウザAPI、視覚的レンダリングに触れることなく、入力を受け取り出力を返す関数が対象です。
典型的な対象:
- ユーティリティ関数(文字列操作、日付フォーマット、計算)
- データ変換(APIレスポンスのマッピング、正規化)
- 状態リデューサーとセレクター
- バリデーションロジック
- ビジネスルール
ツール
| ツール | ユースケース |
|---|---|
| vitest | モダンなプロジェクト、Viteベース、高速HMR |
| jest | レガシープロジェクト、CRA、広くサポート |
例
// utils/format-price.ts
export function formatPrice(cents: number): string {
return `$${(cents / 100).toFixed(2)}`;
}
// utils/format-price.test.ts
import { describe, it, expect } from "vitest";
import { formatPrice } from "./format-price";
describe("formatPrice", () => {
it("formats cents to dollar string", () => {
expect(formatPrice(1299)).toBe("$12.99");
});
it("handles zero", () => {
expect(formatPrice(0)).toBe("$0.00");
});
it("handles single-digit cents", () => {
expect(formatPrice(5)).toBe("$0.05");
});
});
TDDサイクル
ロジックの変更には標準的なTDDサイクルに従います:
- 期待される動作を記述する失敗するテストを書く
- テストをパスさせる最小限のコードを実装する
- テストがグリーンであることを確認する
- 必要に応じてリファクタリングする
- 各動作について繰り返す
ブラインドスポット
⚠️ Warning
レベル1のテストは視覚的なすべてに対して盲目です。以下を検出できません:
- 要素が画面にレンダリングされるかどうか
- CSSの問題(overflow、z-index、opacity、display)
- レイアウトの問題(DOMに存在するが表示されない要素)
- ブラウザ固有のレンダリング動作
- ユーザーインタラクションフロー
レベル1は、バグがレンダリングではなくロジックにあると確信している場合に適切な選択です。表示や視覚的な正しさに疑問がある場合は、レベル4または5にエスカレーションしてください。
レベル1を使用するタイミング
| シナリオ | レベル1は適切か? |
|---|---|
| 関数が誤った値を返す | はい |
| データ変換が不正確 | はい |
| バリデーションが有効な入力を拒否する | はい |
| 要素が画面に表示されない | いいえ — レベル4/5を使用 |
| レイアウトが正しくない | いいえ — レベル5を使用 |
| クリックハンドラーが動作しない | いいえ — レベル2または4を使用 |