本番環境でのテスト:デプロイ前QAだけでは不十分なとき

Rui Li
本番環境でのテスト:デプロイ前QAだけでは不十分なとき カバー

ソフトウェア品質の標準的なモデルは「デプロイ前にテストし、テストが通過したらデプロイする」というものです。このモデルには広く知られた限界があります。ステージング環境は本番環境ではなく、一部の障害は本番環境の条件下でしか発生しないということです。

本番環境でのテストとは、本番環境そのものをテスト環境として扱う一連のプラクティスです。すべてのテストを対象とするのではなく、デプロイ前テストでは確実に捕捉できない特定カテゴリーの障害を対象とします。

これは無謀な行為ではありません。ステージングと本番の間のギャップは現実に存在し、解消されることなく残り続けるという認識のもと、問題が起きないことを祈るのではなく、体系的なプラクティスでそのギャップを埋めようとする姿勢です。

本番環境の何が違うのか

データ。本番データベースには長年にわたって蓄積されたレコードが存在し、開発用シードデータやステージングのインポートでは再現できないエッジケース、不整合、データ形状が含まれています。クリーンなテストデータに対して正しく動作するクエリでも、大規模な本番データに対してはタイムアウトしたり誤った結果を返したりする可能性があります。

トラフィックパターン。本番環境では、実際のセッション状態、本物の同時編集、負荷テストでは近似しかできないリアルな競合状態を持つ実ユーザーから、同時リクエストを受け付けます。一部の並行性の障害は、本番トラフィックレベルでのみ顕在化します。

サードパーティ連携。ステージング環境では多くの場合、決済プロセッサー、メールプロバイダー、外部APIのサンドボックス版を使用します。これらのサンドボックスは、レート制限、Webhookの配信タイミング、データフォーマットのエッジケース、エラーレスポンスの形式など、実際に影響のある点で本番APIとは異なる動作をします。

インフラストラクチャ。本番インフラには、ステージングが共有しない設定のドリフト、パッチ適用済みOSバージョン、カスタムネットワークルール、運用履歴が存在します。一部の障害は環境固有であり、本番環境で発生するまで見えないことがあります。

本番環境でのテストのプラクティス

オブザーバビリティ駆動テストは、本番エンドポイントに対して合成テストトランザクションを実行し、実際のユーザー行動を監視するツールと同じ方法でその動作を観察します。これは実際のインフラに実際のリクエストを送るもので、スケジュールに従って自動エージェントが実行し、失敗時にはアラートを発します。TestSpriteはこのモデルをサポートしており、本番環境に対して定義されたテストフローをカナリアとして実行し、クリティカルパスが機能していることを継続的に検証します。

シャドウテストは、新バージョンのレスポンスをユーザーに返すことなく、本番トラフィックのコピーをアプリケーションの新バージョンにルーティングします。これにより、新バージョンが実際のトラフィックを受け取る前に、実際の本番負荷下での動作を検証できます。

フィーチャーフラグによるロールアウトは、新機能を広く有効化する前に一部のユーザーに限定して公開します。これは影響範囲を制御した本番テストです。実際の環境で実際のユーザーが利用し、何か問題が発生した場合は即座に機能を無効化できます。

A/Bテストは主にプロダクト意思決定に使われますが、品質向上のプラクティスでもあります。2つのバージョンを同時に稼働させ、エラー率とユーザーの完了率を比較することで、デプロイ前テストで表面化しなかった機能的リグレッションを検出できます。

これが置き換えるものではないもの

本番環境でのテストは、デプロイ前テストの代替ではなく補完です。本番環境での障害コストは常にステージングでの障害コストより高く、迅速なロールバックがあっても実際のユーザーへの影響は避けられません。TestSpriteによるデプロイ前テストは、制御された環境で検出可能なリグレッションを捕捉します。本番環境でのテストは、真に環境固有の残余障害を捕捉します。高頻度かつ高い信頼性でリリースするチームには、両方のレイヤーが必要です。