スモークテスト

デプロイ後にシステムの基本機能が動作することを確認する簡易テスト

テストCI/CD

スモークテストとは

スモークテスト (Smoke Test) は、デプロイ直後にシステムの基本機能が動作することを確認する簡易テストである。名前の由来は電子回路の検査で、電源を入れて煙が出なければ最低限の品質を満たしているとする慣習から来ている。

全機能を網羅的にテストするのではなく、「サイトが表示されるか」「API が応答するか」「DB に接続できるか」といった最低限の動作確認に焦点を当てる。

スモークテストの位置づけ

デプロイ → スモークテスト → (成功) → 本番トラフィック投入
                         → (失敗) → 即座にロールバック
テスト種類 タイミング 範囲 速度
単体テスト ビルド時 関数・クラス ミリ秒
結合テスト ビルド時 モジュール間
E2E テスト ビルド時 ユーザーフロー
スモークテスト デプロイ後 基本機能の動作確認 秒〜分

Lambda + API Gateway でのスモークテスト

// デプロイ後に実行するスモークテスト
async function smokeTest(baseUrl: string): Promise<void> {
  // 1. ヘルスチェックエンドポイント
  const health = await fetch(`${baseUrl}/health`);
  assert(health.status === 200, 'Health check failed');

  // 2. 主要 API エンドポイント
  const users = await fetch(`${baseUrl}/api/users?limit=1`);
  assert(users.status === 200, 'Users API failed');

  // 3. 静的アセットの配信
  const index = await fetch(baseUrl);
  assert(index.status === 200, 'Index page failed');
  assert((await index.text()).includes('<!DOCTYPE html>'), 'Invalid HTML');

  console.log('✅ All smoke tests passed');
}

CloudFront + S3 でのスモークテスト

# deploy.sh の最後にスモークテストを実行
SITE_URL=$(aws cloudformation describe-stacks --stack-name myapp-dev \
  --query "Stacks[0].Outputs[?OutputKey=='SiteUrl'].OutputValue" --output text)

# HTML が返るか確認
STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$SITE_URL")
if [ "$STATUS" != "200" ]; then
  echo "❌ Smoke test failed: HTTP $STATUS"
  exit 1
fi

# sitemap.xml が正しいドメインを含むか確認
curl -s "$SITE_URL/sitemap.xml" | grep -q "example.com" || {
  echo "❌ Sitemap contains wrong domain"
  exit 1
}

echo "✅ Smoke tests passed"

スモークテストの設計原則

  • 高速に実行できること (30 秒以内が目安)
  • 失敗時に即座にロールバックできること
  • 外部依存 (DB、API) への接続を確認すること
  • 本番環境のデータを変更しないこと (読み取りのみ)

カナリアリリースとの組み合わせ

スモークテストをカナリアリリースと組み合わせると、新バージョンに少量のトラフィックを流し、スモークテストが通ったら段階的にトラフィックを増やす。失敗したら自動ロールバックする。

より深く学ぶには関連書籍が役立つ。

関連用語