テスト戦略

プロジェクトのテスト種類、範囲、自動化レベルを体系的に定義する計画

テスト品質

テスト戦略とは

テスト戦略は、プロジェクトで実施するテストの種類、範囲、自動化レベル、実行タイミングを体系的に定義する計画である。「何をどのレベルでテストするか」を明確にし、品質とスピードのバランスを取る。

テストピラミッド

        /  E2E テスト  \        ← 少数、遅い、高コスト
       / 結合テスト      \      ← 中程度
      / 単体テスト          \   ← 多数、速い、低コスト
レベル 対象 速度 安定性 割合
単体テスト 関数、クラス ミリ秒 高い 70%
結合テスト モジュール間の連携 中程度 20%
E2E テスト ユーザーフロー全体 低い 10%

各テストレベルの役割

単体テスト

// ビジネスロジックの正確性を検証
describe('calculateDiscount', () => {
  it('10,000円以上で10%割引', () => {
    expect(calculateDiscount(15000)).toBe(1500);
  });
  it('10,000円未満は割引なし', () => {
    expect(calculateDiscount(5000)).toBe(0);
  });
});

結合テスト

// Lambda ハンドラー + DynamoDB の連携を検証
it('注文を作成して取得できる', async () => {
  const createResult = await handler({ body: JSON.stringify({ item: 'Book', qty: 1 }) });
  expect(createResult.statusCode).toBe(201);

  const orderId = JSON.parse(createResult.body).id;
  const getResult = await handler({ pathParameters: { id: orderId } });
  expect(getResult.statusCode).toBe(200);
});

E2E テスト

// Playwright でユーザーフロー全体を検証
test('商品を購入できる', async ({ page }) => {
  await page.goto('/products');
  await page.click('[data-testid="add-to-cart"]');
  await page.click('[data-testid="checkout"]');
  await expect(page.locator('.order-confirmation')).toBeVisible();
});

CI での実行戦略

# GitHub Actions
jobs:
  unit-test:        # PR ごとに実行 (数秒)
    run: vitest run
  integration-test: # PR ごとに実行 (数分)
    run: vitest run --config vitest.integration.config.ts
  e2e-test:         # main マージ時のみ (数分〜数十分)
    run: npx playwright test
  • 単体テスト: 全 PR で実行。失敗したらマージをブロック
  • 結合テスト: 全 PR で実行。外部依存はモックまたはローカル DB
  • E2E テスト: main マージ時またはデプロイ前に実行

テスト戦略の判断基準

判断基準 単体テストを増やす E2E テストを増やす
ビジネスロジックが複雑 -
UI のインタラクションが重要 -
外部サービスとの連携が多い 結合テスト
デプロイ頻度が高い ✅ (高速なフィードバック) -

現場での応用を知るには関連書籍も役立つ。

関連用語