APIテストとは何か?REST APIテストの正攻法
REST APIのテスト手法についてご紹介する記事です。 最終更新日:2023年12月15日 / 投稿日:2023年04月24日
DXの実現などでREST APIの開発・利用が加速する中で、そもそもREST APIとは何か?REST APIの最適なテスト戦略は何なのか?ここでは、REST APIを利用してアプリケーションを開発するメリットと、REST APIの品質検証の重要性やテスト手法に関する記事をお届けします。
次のような方におすすめです。
- これからREST APIの開発案件に関わる方
- すでにREST APIの開発案件のテスト計画や実施に携わっている方
1.REST APIとは何か?
REST APIのテストアプローチについてお話しする前に、まずは"API"の役割について簡単にご紹介します。一般的に、システム開発におけるAPI(アプリケーションプログラムインターフェイス)は、共通の仕様に基づいてさまざまなアプリケーションとデータ連携するために利用されます。この共通の仕様はコントラクトによって定義される場合が多く、REST APIのSwaggerやSOAPサービスのWSDL等が該当します。データベースの場合もインターフェース言語としてSQLがあります。
UIが人間とアプリケーションとのやりとりを可能にするのと同様に、APIはシステムやデバイス間のデータ連携を可能にします。データを利活用して新しい価値を創造するDXでは、特にREST APIの活用が主流であるため、ここではREST APIテストにフォーカスした情報をご紹介します。
1-1.なぜAPIを使用するのか
まず、REST APIは部品であるため、システム間でのデータ連携が必要となるたびに、部品化したAPIを利用してあらゆる種類のデータ連携を簡単に実現できます。さらに、REST APIはコントラクトに基づいて設計されるため、データ連携部分は共通のREST APIのコントラクトに従って設計しつつ、それ以外の部分については好きなように開発できます。これにより、世界中のさまざまな組織の開発者が、同じREST APIを利用しながら独自の分散型アプリケーションを開発することができます。昨今のシステムアーキテクチャでは、ユーザーがアプリケーションのフロントエンド(モバイルアプリやPCブラウザーで操作するアプリなど)を操作するとき、そのフロントエンドはバックエンドシステムとのデータ連携のためにREST APIの呼び出し(利用)を行います。このようなアーキテクチャは主に次の 2 つの点で開発プロセスを簡略化します。
- 開発者は、モバイルデバイスやブラウザーごとにカスタマイズされたアプリケーションを作成する必要がない
- アプリケーション全体を毎回再デプロイせずに、個々のREST API(バックエンド)を改修するだけでアプリケーションを素早くバージョンアップできる
その結果、開発者は、アプリケーション全体のロジックを作り込むことに時間を費やすのではなく、バックエンドをREST API化して部品化することで、個々のREST APIが提供する機能の改修に集中できるため、開発を効率化できます。
2.REST APIの使用例
たとえば、ショッピングを行うスマートフォンのアプリやPCブラウザーで操作するフロントエンドを開発する際に、開発者はREST APIを利用してバックエンドのショッピングサービスとデータ連携するシステムを構築することができます。開発者は、ユーザー操作の適切なタイミングでバックエンドのショッピングサービスのREST APIを利用して、ユーザーにシームレスな動線(データ)を提供できます。たとえば、次のようなケースです。
ユーザー操作 | ユーザー操作時に利用するREST API |
|
|
|
|
|
4. cardAdd |
ユーザーがスマートフォンのアプリやPCブラウザーを用いてフロントエンドを操作するとき、フロントエンドは開発者が設定した定義に従ってバックエンドのショッピングサービスのREST APIを利用します。利用するREST APIが期待通りに動作している限り、すべてがうまく機能します。
しかし、REST APIが期待通りに動作すると仮定するのは非常に危険です。
そこで、REST APIをテストすることが重要となります。
しかし、REST APIが期待通りに動作すると仮定するのは非常に危険です。
そこで、REST APIをテストすることが重要となります。
3.なぜREST APIのテストを行うのか?
システム全体の品質を確保するためには、WebアプリケーションなどのUI操作の対象となるフロントエンドだけでなく、バックエンドのREST APIの品質も保証する必要があります。幸いなことに、REST APIテストはUIと切り離して実施できます。REST APIと直接データ連携するテストケースを設計し、REST APIの応答を電文レベルでテストすることには、主に次の2つの利点があります。
- UI操作では、入力データの制限やを用意するのが難しいケースでも、 REST APIなら直接テスト電文を設定して検証できる
- UIと比べてREST APIは作りが単純であるため、テスト資産のメンテナンスの容易さも含めて自動化に向いている
4.REST APIテストへのアプローチ
REST APIテストにアプローチする最善の方法は、ボトムアップ的に堅固なテストプラクティスを構築することです。その際、テスト戦略の設計方法として非常に優れているのは、Martin Fowlerが提唱するテストピラミッドに従うことです。このピラミッド型のアプローチでは、堅固なユニットテストの基盤の上に、幅広いREST APIのテスト(コントラクトテスト、シナリオテスト、パフォーマンステストなど)を構築することが推奨されます。REST APIテストでは、ユニットテストでは不可能なレベルでアプリケーションロジックをテストできます。ユニットテストとREST APIテストは互いを補完する関係にあります。SDLC(ソフトウェア開発ライフサイクル)の後半ではなく、早期に実装に近いレベルでアプリケーションをテストすることは、「fail fast and fail early」つまり早期に欠陥を検出するのに役立ちます。ユニットテストは重要ですが、今回の記事ではREST APIに焦点を当てて、APIレベルでのテストについて取り上げます。
4-1.REST APIのコントラクトテスト
REST APIは、2つ以上のシステムやデバイス間で、コントラクト(APIの仕様を記述した設計書のようなもの)に基づいてデータ連携を行っています。コントラクトテストには、インターフェイスとの連携方法、利用可能なサービス、呼び出し方法などが記述されており、データ連携の基礎となります。このコントラクトに誤りがあると、その後のテストすべてに影響を及ぼします。そのため、最初にコントラクト自体をテストします。ポイント
コントラクトテストでは、Swagger、RAML、WSDL、XMLスキーマなど、APIの仕様が定義されたファイルを検証します。REST APIはコントラクトに基づいて作成されますので、コントラクトテストは最初に実施すべきテスト手法と言えます。コントラクトテストでは、以下を検証します。- コントラクトが仕様に従って記述されている
- リクエストとレスポンスのセマンティクスが正しい(スキーマ検証)
- エンドポイントが有効である(HTTP、MQ/JMSのトピック/キューなど)
4-2.REST APIのコンポーネントテスト(単機能テスト)
コンポーネントテストは、REST APIに対する単機能テスト(ユニットテスト)のようなものであり、REST APIとして提供する個々のサービスを個別にテストする手法です。テスト対象のREST APIに対して、正常系や異常系などの様々なデータパターンでテスト電文を送信し、期待通りのレスポンスを受信できるか検証します。ポイント
コンポーネントテストは後続のテストにも影響を与えるため、十分なデータパターンでしっかりとテストを行う必要があります。 APIテストではREST APIが返すレスポンス電文の検証が必須となりますが、データパターンの数だけ検証も行います。この時、レスポンス電文を目視で検証するケースが多く見られます。しかし、APIの数やテストデータのパターン、レスポンス電文の項目の数だけ検証を行う場合、検証すべき項目が増えるにつれ、目視で確認すべき項目も増えることになります。検証項目が多いと人的ミスが発生しやすくなることから、目視の検証では限界があるため自動化する必要性が出てきますが、テストを自動化する場合、設定やメンテナンスに工数が掛からない手法を採用することがテストの効率化に繋がります。また、コンポーネントテストのポイントとして、コントラクトを読み込んでテストを自動生成できるとすぐにテストに取り掛かることができます。
4-3.REST APIのシナリオテスト
シナリオテストは、複数のAPIを順番に呼び出した場合に期待通りの結果が得られるかを確認するテスト手法です。コンポーネントテストとして、個々のREST APIのテスト結果が適切であっても、シーケンスとしてREST APIを順番に呼び出した場合に期待通りの結果とならないこともよくあります。
そのため、様々なパターンで呼び出した場合の結果を確認することが重要です。
ポイント
複数のREST APIを順番に呼び出すテストシナリオを実施する際には、一連の流れとしてAPIが呼び出されるように適切なデータを後続のテストに受け渡してテストを行います。例えば、「ビデオゲームの検索→ビデオゲームの購入」の順番でREST APIをテストする場合、「ビデオゲームの検索」で受信したレスポンスの情報(ゲームのタイトルやID)を、「ビデオゲームの購入」を行う際のリクエストの情報として値を受け渡す設定が必要です。こういったテストを、ツールを利用して実施する場合、受信したレスポンスから値を受け渡す設定はスクリプトで記述する場合も多く、設定に技術力や工数が掛かることもあります。そのため、テストクライアント間で簡単に値の受け渡し設定できる手法を採用することがテストの効率化に繋がります。
関連記事はこちら
4-4.REST APIのパフォーマンステスト
パフォーマンステストは、REST APIに負荷をかけて性能や応答を確認するテスト手法です。REST APIには、事前にSLA(サービス品質保証)が既定されている場合が多く、想定される負荷が掛かった場合に求められる性能を満たすことができるか、テストを行う必要があります。また、開発プロセスのより早い段階でREST APIのパフォーマンステストを行うことで、早期にパフォーマンス関連の問題を発見できます。
ポイント
パフォーマンステストは専用のツールやテスト環境を用意したり、特殊なスキルセットを必要とすることから、開発プロセスの終盤にシステム全体に対して行われるケースがよくあります。一方で、問題を早期発見するためには、より早い段階で REST APIに直接負荷を掛けてパフォーマンステストすることが必要になります。より早い段階からテストを実施するためには、パフォーマンステスト専用ツールを利用するのではなく、REST APIの機能テストとパフォーマンステストの両方が実施できるツールを採用し、機能テスト用のシナリオをパフォーマンステストで活用することも有効です。関連記事はこちら
4-5.REST APIのセキュリティテスト
セキュリティテストは、REST APIにセキュリティ上の脆弱性を検証するテスト手法です。ユーザーの誤った操作や、悪意のある操作によって意図しないリクエストが送信された場合でも、REST APIが適切に処理できるか確認します。ポイント
この種の動作を防ぐためには、悪質な攻撃をシミュレートするREST APIのテストケースを作成する必要があります。REST APIのシナリオテストはアプリケーションへ故意に攻撃するシナリオとしても流用できるため、既存のテストケースをセキュリティテストに活用することが可能です。たとえば、さまざまなタイプのパラメーターファジングまたはSQLインジェクション攻撃をシナリオテストに組み込んでAPIテストを実施します。関連記事はこちら
5.まとめ
適切なREST APIのテスト戦略で開発に臨む事は、データ連携が欠かせないアプリケーションが「今日も昨日と同じように動く」ことを保証する上で非常に価値のある事です。REST APIに限らず、SOAP,MQ,MQTT,Kafka,protobuf,WebSocketなどを含むAPIのテストは、アプリケーションのレイヤー毎の品質を確保(欠陥を検出)するために欠かせません。また、APIテストはUIテストよりもはるかに変更が生じにくく、一貫性があるため、既に作成したAPIのテスト資産を今後も長期間にわたって利用(運用)しやすいのも特徴です。JenkinsなどのCI/CDパイプラインで、これらのAPIテストの実行をすべて自動化し、アプリケーションの品質を継続して確保する仕組みを構築する事もよくあるテストプラクティスです。
PICK UP
イベント・セミナー
APIのテスト自動化とサービス仮想化を1ツールで SOAtest/Virtualizeに
関するお問い合わせ
テクマトリックス株式会社
東京本社ソフトウェアエンジニアリング事業部
03-4405-7853
- メールでのお問い合わせ
- parasoft-info@techmatrix.co.jp