前置き
同期通信おとぎ話サーガなら、インフラ層までスコープにしたファンインパイプラインのインフラ層における適応度関数で、複数マイクロサービスまたぐE2Eテストできます。
しかしながら、インフラも高度に分離された非同期連携マイクロサービスの場合、
パイプラインアーキテクチャは下図のようなエンドツーエンドの独立したパイプラインモデルのため、複数マイクロサービスをまたぐE2Eテストは、もはやファンインの頃のようにはできなくなってしまいます。
先に結論
インフラ層まで高度に分離した、パラレルサーガやアンソロジーサーガのようなアーキテクチャでは、「従来の、複数サービスにまたがるE2Eテスト」は、もはや実現不可能です。
何より 「実行すべきではない」 です。
このアーキテクチャ(インフラも非同期で分離された、独立E2Eパイプライン)は、テスト戦略の根本的なパラダイムシフトを要求します。
従来のE2Eテストが担っていた「複数のサービスが正しく連携できるか?」という責務は、
以下の2つの異なる戦略に分割されます。
①. 「契約」の検証(パイプライン内部、デプロイ前)
②. 「本番環境」での検証(パイプラインの最終ステップ、デプロイ後)
1. 従来のE2Eテストが「破綻」する理由
独立したE2Eパイプラインの世界で従来のE2Eテスト(例:Staging環境でService A→B→Cの連携を試す)を実行しようとすると、以下の理由で必ず破綻します。
① パイプラインの「独立性」の崩壊
Pipe-AがE2Eテストを実行するために、Pipe-BとPipe-Cが「特定のバージョンで、正常に起動していること」を期待してしまいます。
これは、デプロイの集約(ファンイン) を行っているのと本質的に同じであり、独立したパイプラインのメリット(=自律的な高速デプロイ)を完全に殺してしまいます。
② 非同期処理の「時間」の問題
Service Aがイベントを発行した後、Service BとCが処理を終えるまで、テストは「何秒待てばいい」のでしょうか?
5秒でしょうか? でも、ネットワークの遅延で10秒かかるかもしれません。
この「待ち時間」に依存するテストは、本質的に不安定(Flaky)
であり、信頼できません。
③ 環境構築の「複雑性」
100個のマイクロサービスのうち、A, B, Cの連携だけをテストしたい場合でも、そのE2Eテスト環境には100個すべてのサービスをデプロイする必要があります。
これはとてもじゃないですが現実的ではありません。
2. 新しい解決策:E2Eテストの「分割」
独立E2Eパイプラインは、この問題を解決するために、テストの責務を分割します。
ステップA:【デプロイ前】Consumer-Driven Contract Testing (CDCT)
これは、従来のE2Eテストの 「結合部の検証」 だけを抜き出したものです。
目的
「Service Aが送信するイベント(JSON)の**“形”は、Service Bが期待する“形”**と一致しているか?」を、サービスを起動せずに検証します。
仕組み (パイプライン内)
①. 消費者 (Consumer / Service B) が「契約」を書く
Service Bは、
「私はService Aから、{ "order_id": (String), "amount": (Number) }という形のJSONが来ることを期待する」 という 契約ファイル(Contract) を作成し、Pact Brokerなどの共有リポジトリに置きます。
②. 生産者 (Producer / Service A) が契約を検証する
Service AのCIパイプラインは、その契約ファイルをダウンロードし、
「自分が生成するJSONは、Service Bが期待する契約を満たしているか?」 というユニットテストを実行します。
パイプラインアーキテクチャへの影響
Pipe-Aは、Pipe-Bが起動している必要は一切ありません。
Pipe-Bが発行した 「契約ファイル」 さえあれば、CIの段階で安全に結合性を検証できます。
ステップB:【デプロイ後】本番環境でのスモークテスト (適応度関数)
これは、従来のE2Eテストの 「ビジネスロジックの検証」 だけを抜き出したものです。
目的
「Service AがOrderCreatedイベントを発行したら、(非同期の連鎖を経て)最終的にCustomerの残高が正しく減算されるか?」というビジネス上の結果を検証します。
仕組み (パイプライン内)
サービスごとに「独立したE2Eパイプライン」は、デプロイしたら終わりではありません。
デプロイ後の「本番検証」までがパイプラインの責務です。
①. CI/CDパイプラインが、Service A (v1.1)を本番環境にカナリアデプロイします(例: 1%のトラフィックだけを流す)。
②. パイプラインの次のステップとして、「本番スモークテスト」 を実行します。
このテストは、Service A (v1.1)に対して「テスト注文」のAPIを(本番環境で)実行します。
③. その後、非同期処理の完了を数秒間ポーリングし、最終的な結果(例: CustomerサービスのDBやAPI)を確認しに行きます。
パイプラインアーキテクチャへの影響
適応度関数
この「本番スモークテスト」の結果と、プロダクションのメトリクス(エラーレートなど)を適応度関数とします。
自動ロールバック
もしこの適応度関数が失敗したら(スモークテストが失敗した、またはエラーレートが急増した)、パイプラインは自動的にService Aをv1.0にロールバックします。
結論
従来のE2Eテストは、高度に分離したマイクロサービスアーキテクチャにおける、独立E2Eパイプラインと両立しません。
その代わり、アーキテクチャは、「E2Eテスト」という1つのプロセスを2つに分割します。
①. 「結合部のテスト」は、Consumer-Driven Contract Testing としてパイプラインの“前”(デプロイ前)に移動します。
②. 「ビジネスロジックのテスト」は、本番スモークテストとしてパイプラインの“後”(デプロイ後)に移動します。
これが、高度に分離された非同期マイクロサービスにおける、E2Eテストの唯一の現実解です。
