マイクロサービスのテスト戦略 Vol.1

マイクロサービス・アーキテクチャの採用が進むいま、最適なテストソリューションについてご紹介する記事です。

はじめに

開発高速化の一環でマイクロサービス・アーキテクチャを採用した開発が増加しています。ここでは、マイクロサービス・アーキテクチャの特性と開発・テストにおける課題や解決策に関する記事をお届けします。

次のような方におすすめです。
  • これからマイクロサービス・アーキテクチャの採用を検討している方
  • すでにマイクロサービス・アーキテクチャを採用した開発案件に携わっている方

マイクロサービスの特性と課題

DXの実現にはデータ連携のためのAPI化が必須となり、ビジネスの拡大 = API の活用と言っても過言ではない時代に突入しました。このようなAPI連携が必須なシステム開発が重要になる状況において、エンドユーザー様からのビジネス要件に素早く対応する開発アプローチとして、マイクロサービス・アーキテクチャを採用した開発が注目を浴びています。

マイクロサービスは、システムをサービス単位に分割して、API連携することで、スピードが求められるエンドユーザー様からのビジネス要件に対応する機能追加や改修に強いアーキテクチャとして、採用が増加しています。その一方で、マイクロサービスをどうテストするかという点で、試行錯誤もなされています。
 
多くの点では、マイクロサービスアプリケーションをテストすることは、他のアーキテクチャを採用して開発したアプリケーションをテストするのと変わりありません。マイクロサービスでは、REST や キュー などの既知のテクノロジーが使用されていますし、これらのテクノロジーには、すでに十分に確立されたテストツールとベストプラクティスがあるからです。テストについて、マイクロサービス独自の課題を挙げるなら、アプリケーションを構成する(API連携する)サービスの数が膨大であることと、サービス間の依存関係です。さらに、依存先の他のマイクロサービスが利用できない、または、適切に応答していない場合でも、各マイクロサービスが適切に機能する必要があるという点も課題として挙げられます。

  マイクロサービス独自の課題
・ テスト対象のマイクロサービスがAPI連携するサービス間の依存関係
課題① 依存するサービスが利用できないとテストできない
課題② 依存するサービスに不具合があった場合には適切なエラー処理が必要
マイクロサービスには、通常、オーケストレーションとリアクティブ(コレオグラフィー)という2つのパターンがあり、多くのマイクロサービスは、この2つを組み合わせた「ハイブリッド」アプローチを採用しています。そこで、今回は、2種類のマイクロサービスについて説明し、これらのAPIテストを自動化するときに発生する課題と、それに対処するための戦略を提案します。ここでは、アプリケーション全体をテストするエンドツーエンドテストではなく、個々のマイクロサービスのテストに着目しています。

オーケストレーション型マイクロサービスのテスト

オーケストレーション型のマイクロサービスは、外部サービスまたは依存先のサービスに対し、1つまたは複数の明示的な呼び出しを行います。多くの場合、呼び出しは 同期リクエスト-レスポンスフロー を使用し、REST ベースのサービスにアクセスします。サービスが特定の順序で呼び出される必要がある場合、前のサービスへの呼び出しに対する応答を受信するまで、後続のサービスへの呼び出しを行いません。1つのサービスが明示的に別のサービスを呼び出すため、サービスは密接に結合されています。

上記の例では、PORTFOLIO マイクロサービスは ACCOUNTS および QUOTES マイクロサービスに依存しています。また、QUOTES サービスは、リアルタイムの株価を取得するサードパーティの外部サービスに依存しており、この外部サービスから返されるデータは常に変化します。つまり、PORTFOLIO マイクロサービスのAPIテストを実行する際には、依存するサービスもテスト環境にデプロイする必要があるため、PORTFOLIO マイクロサービスのための適したテストの作成と実行が困難になります。
 
上記のように、テスト対象の PORTFOLIO マイクロサービスがサードパーティ製の外部サービスや、別のチームによって開発されたサービスをAPI連携で利用していることで、テスト環境の構築が非常に複雑になります。また、異常系のテストとして、PORTFOLIO サービスに生じる予想外の処理(ACCOUNTS サービスや QUOTES サービスが利用できない、レスポンスが遅い、予期しないデータが返される等)もテストする必要があります。PORTFOLIO マイクロサービスがさまざまなエラー条件を適切に処理できるかを検証するには、ACCOUNTS サービスおよび QUOTES サービスに、さまざまな種類の予期しない応答をさせることが必要です。
 

サービス仮想化による課題解決

上記のような、密接に結合したサービスのテストには、サービス仮想化の活用が有効なテストアプローチとなります。サービス仮想化は、上記の ACCOUNTS および QUOTES マイクロサービスの応答をエミュレート(疑似的に応答データを送信)することができます。つまり、サービス仮想化した ACCOUNTS および QUOTES マイクロサービスを用いて PORTFOLIO マイクロサービスをテストすれば、テスト環境に関する課題を解消できるという訳です。たとえば、次のように PORTFOLIO マイクロサービスは、2つの依存先(ACCOUNTS および QUOTES マイクロサービス)から独立してテストできるようになります。 

関連ページ

  マイクロサービス独自の課題 対策(サービス仮想化
課題① 依存するサービスが利用できないとテストできない 依存するサービスを仮想化し、いつでも、なんどでもテストできる環境を提供

上記のようにサービス仮想化でサービス間の依存関係についての課題を解決できました。次に、テスト対象の PORTFOLIO サービスが適切にエラー処理をできることを確認するためのテスト環境として、サービス仮想化で ACCOUNTS および QUOTES サービスの予期しない動作をエミュレートします。具体的には、正常系に加えて、サービスがエラーを返す場合の異常系を含め、さまざまなデータのパターンで応答できるテスト環境を提供することです。また、サービス仮想化は、ACCOUNTS サービスまたは QUOTES サービスのいずれかのレスポンスが遅い状態をエミュレートすることも可能なため、そういった時に PORTFOLIO サービスがどのように動作をするかテストすることもできます。

  マイクロサービス独自の課題 対策(サービス仮想化
課題② 依存するサービスに不具合があった場合には適切なエラー処理が必要 依存するサービスを仮想化し、正常系・異常系を含め、さまざまなデータのパターンや遅延設定で応答できるテスト環境を提供
上記のようにサービス仮想化を活用し、テスト対象のマイクロサービスのAPIテストが可能になります。このテスト戦略は、マイクロサービス・アーキテクチャ固有のものではなく、一般的なサービス指向・アーキテクチャ(SOA)や、少数のサービスにしか依存しないモノリシック・アプリケーションでも同様の問題が発生するため、これらのアーキテクチャを採用したアプリケーションのテストにも適用できます。しかし、マイクロサービス・アーキテクチャには、依存するサービスの数が膨大であるといった特性があります。数十または数百の依存するサービスがあるマイクロサービス環境では、さまざまなテストシナリオに対応するさまざまなテスト環境の構築が必要となるため、サービス仮想化を活用することで時間と労力を大幅に削減することができます。

まとめ

この記事では、サービス仮想化を活用してオーケストレーション型マイクロサービスをテストする方法についてお届けしました。次の記事では、「リアクティブ型」または「イベント駆動型」マイクロサービスとも呼ばれるコレオグラフィー型マイクロサービス(要するにパブリッシュ・サブスクライブ モデル)のテスト戦略についてお届けします。
※ ただいま準備中です。準備ができましたら、この下に「次の記事へ」のボタンが追加されます。

APIのテスト自動化とサービス仮想化を1ツールで SOAtest/Virtualizeに
関するお問い合わせ

  • テクマトリックス株式会社
    東京本社

    ソフトウェアエンジニアリング事業部

    03-4405-7853

メールでのお問い合わせ
parasoft-info@techmatrix.co.jp

お問い合わせ

製品についてやテクマトリックスについてなど、
こちらよりお気軽にお問い合わせいただけます。