テスト戦略
プロジェクトのテスト種類、範囲、自動化レベルを体系的に定義する計画
テスト品質
テスト戦略とは
テスト戦略は、プロジェクトで実施するテストの種類、範囲、自動化レベル、実行タイミングを体系的に定義する計画である。「何をどのレベルでテストするか」を明確にし、品質とスピードのバランスを取る。
テストピラミッド
/ 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 のインタラクションが重要 | - | ✅ |
| 外部サービスとの連携が多い | 結合テスト | ✅ |
| デプロイ頻度が高い | ✅ (高速なフィードバック) | - |
現場での応用を知るには関連書籍も役立つ。