APIテストとは何か?REST API テストの正攻法

REST APIのテスト手法についてご紹介する記事です。

はじめに

DXの実現などでREST APIの開発・利用が加速する中で、そもそもREST APIとは何か?REST APIの最適なテスト戦略は何なのか?ここでは、REST APIを利用してアプリケーションを開発するメリットと、REST APIの品質検証の重要性やテスト手法に関する記事をお届けします。
 

 次のような方におすすめです。
  • これからREST APIの開発案件に関わる方
  • すでにREST APIの開発案件のテスト計画や実施に携わっている方

本ページの目次

REST API とは何か?なぜ API を使用するのか

REST API のテストアプローチについてお話しする前に、まずは"API" の役割について簡単にご紹介します。
 
一般的に、システム開発における API(アプリケーションプログラムインターフェイス)は、共通の仕様に基づいてさまざまなアプリケーションとデータ連携するために利用されます。この共通の仕様はコントラクトによって定義される場合が多く、REST API の Swagger や SOAP サービスの WSDL 等が該当します。データベースの場合もインターフェース言語として SQL があります。 

UI が人間とアプリケーションとのやりとりを可能にするのと同様に、API はシステムやデバイス間のデータ連携を可能にします。データを利活用して新しい価値を創造する DX では、特に REST API の活用が主流であるため、ここでは REST API テストにフォーカスした情報をご紹介します。

まず、REST API は部品であるため、システム間でのデータ連携が必要となるたびに、部品化した API を利用してあらゆる種類のデータ連携を簡単に実現できます。さらに、REST API はコントラクトに基づいて設計されるため、データ連携部分は共通の REST API のコントラクトに従って設計しつつ、それ以外の部分については好きなように開発できます。これにより、世界中のさまざまな組織の開発者が、同じ REST API を利用しながら独自の分散型アプリケーションを開発することができます。
 
昨今のシステムアーキテクチャでは、ユーザーがアプリケーションのフロントエンド(モバイルアプリや PC ブラウザーで操作するアプリなど)を操作するとき、そのフロントエンドはバックエンドシステムとのデータ連携のために REST API の呼び出し(利用)を行います。このようなアーキテクチャは主に次の 2 つの点で開発プロセスを簡略化します。
 
  • 開発者は、モバイルデバイスやブラウザーごとにカスタマイズされたアプリケーションを作成する必要がない
  • アプリケーション全体を毎回再デプロイせずに、個々の REST API (バックエンド) を改修するだけでアプリケーションを素早くバージョンアップできる
その結果、開発者は、アプリケーション全体のロジックを作り込むことに時間を費やすのではなく、バックエンドを REST API 化して部品化することで、個々の REST API が提供する機能の改修に集中できるため、開発を効率化できます。

REST API の使用例

たとえば、ショッピングを行うスマートフォンのアプリや PC ブラウザーで操作するフロントエンドを開発する際に、開発者は REST API を利用してバックエンドのショッピングサービスとデータ連携するシステムを構築することができます。開発者は、ユーザー操作の適切なタイミングでバックエンドのショッピングサービスの REST API を利用して、ユーザーにシームレスな動線(データ)を提供できます。
たとえば、次のようなケースです。

ユーザー操作 ユーザー操作時に利用する REST API
    1. 面白そうなビデオゲームを探す
    1. itemSearch
    2. ショッピングサービスが Minecraft を提案する
    2. itemLookup
    3. Minecraft をカートに入れる
    3. cartCreate
    4. cardAdd

ユーザーがスマートフォンのアプリや PC ブラウザーを用いてフロントエンドを操作するとき、フロントエンドは開発者が設定した定義に従ってバックエンドのショッピングサービスの REST API を利用します。利用する REST API が期待通りに動作している限り、すべてがうまく機能します。

しかし、REST API が期待通りに動作すると仮定するのは非常に危険です。
そこで、REST API をテストすることが重要となります。

なぜ REST API のテストを行うのか?

システム全体の品質を確保するためには、WebアプリケーションなどのUI 操作の対象となるフロントエンドだけでなく、バックエンドの REST API の品質も保証する必要があります。
 
幸いなことに、REST API テストはUI と切り離して実施できます。REST API と直接データ連携するテストケースを設計し、REST API の応答を電文レベルでテストすることには、主に次の2つの利点があります。
  • UI 操作では、入力データの制限やを用意するのが難しいケースでも、 REST API なら直接テスト電文を設定して検証できる
  • UIと比べてREST API は 作りが単純であるため、テスト資産のメンテナンスの容易さも含めて自動化に向いている

REST API テストへのアプローチ

REST API テストにアプローチする最善の方法は、ボトムアップ的に堅固なテストプラクティスを構築することです。その際、テスト戦略の設計方法として非常に優れているのは、Martin Fowler が提唱するテストピラミッドに従うことです。このピラミッド型のアプローチでは、堅固なユニットテストの基盤の上に、幅広い REST API のテスト(コントラクトテスト、シナリオテスト、パフォーマンステストなど)を構築することが推奨されます。REST API テストでは、ユニットテストでは不可能なレベルでアプリケーションロジックをテストできます。

ユニットテストと REST API テストは互いを補完する関係にあります。SDLC(ソフトウェア開発ライフサイクル)の後半ではなく、早期に実装に近いレベルでアプリケーションをテストすることは、「fail fast and fail early」つまり早期に欠陥を検出するのに役立ちます。 ユニットテストは重要ですが、今回の記事では REST API に焦点を当てて、API レベルでのテストについて取り上げます。

REST API のコントラクトテスト

REST API は、2つ以上のシステムやデバイス間で、コントラクト(APIの仕様を記述した設計書のようなもの)に基づいてデータ連携を行っています。コントラクトテストには、インターフェイスとの連携方法、利用可能なサービス、呼び出し方法などが記述されており、データ連携の基礎となります。このコントラクトに誤りがあると、その後のテストすべてに影響を及ぼします。そのため、最初にコントラクト自体をテストします。

ポイント

コントラクトテストでは、Swagger、RAML、WSDL、XMLスキーマなど、APIの仕様が定義されたファイルを検証します。REST APIはコントラクトに基づいて作成されますので、コントラクトテストは最初に実施すべきテスト手法と言えます。 コントラクトテストでは、以下を検証します。
  • コントラクトが仕様に従って記述されている
  • リクエストとレスポンスのセマンティクスが正しい(スキーマ検証)
  • エンドポイントが有効である(HTTP、MQ/JMSのトピック/キューなど)

REST API のコンポーネントテスト(単機能テスト)

コンポーネントテストは、REST API に対する単機能テスト(ユニットテスト)のようなものであり、REST API として提供する個々のサービスを個別にテストする手法です。テスト対象のREST APIに対して、正常系や異常系などの様々なデータパターンでテスト電文を送信し、期待通りのレスポンスを受信できるか検証します。

ポイント

コンポーネントテストは後続のテストにも影響を与えるため、十分なデータパターンでしっかりとテストを行う必要があります。APIテストではREST APIが返すレスポンス電文の検証が必須となりますが、データパターンの数だけ検証も行います。この時、レスポンス電文を目視で検証するケースが多く見られます。しかし、APIの数やテストデータのパターン、レスポンス電文の項目の数だけ検証を行う場合、検証すべき項目が増えるにつれ、目視で確認すべき項目も増えることになります。 検証項目が多いと人的ミスが発生しやすくなることから、目視の検証では限界があるため自動化する必要性が出てきますが、テストを自動化する場合、設定やメンテナンスに工数が掛からない手法を採用することがテストの効率化に繋がります。
また、コンポーネントテストのポイントとして、コントラクトを読み込んでテストを自動生成できるとすぐにテストに取り掛かることができます。

REST API のシナリオテスト

シナリオテストは、複数のAPIを順番に呼び出した場合に期待通りの結果が得られるかを確認するテスト手法です。
コンポーネントテストとして、個々の REST API のテスト結果が適切であっても、シーケンスとしてREST APIを順番に呼び出した場合に期待通りの結果とならないこともよくあります。
そのため、様々なパターンで呼び出した場合の結果を確認することが重要です。

ポイント

複数のREST APIを順番に呼び出すテストシナリオを実施する際には、一連の流れとしてAPIが呼び出されるように適切なデータを後続のテストに受け渡してテストを行います。例えば、「ビデオゲームの検索→ビデオゲームの購入」の順番でREST APIをテストする場合、「ビデオゲームの検索」で受信したレスポンスの情報(ゲームのタイトルやID)を、「ビデオゲームの購入」を行う際のリクエストの情報として値を受け渡す設定が必要です。こういったテストを、ツールを利用して実施する場合、受信したレスポンスから値を受け渡す設定はスクリプトで記述する場合も多く、設定に技術力や工数が掛かることもあります。 そのため、テストクライアント間で簡単に値の受け渡し設定できる手法を採用することがテストの効率化に繋がります。

関連ページ

REST API のパフォーマンステスト

パフォーマンステストは、REST APIに負荷をかけて性能や応答を確認するテスト手法です。REST APIには、事前に SLA(サービス品質保証)が既定されている場合が多く、想定される負荷が掛かった場合に求められる性能を満たすことができるか、テストを行う必要があります。
また、開発プロセスのより早い段階で REST API のパフォーマンステストを行うことで、早期にパフォーマンス関連の問題を発見できます。

ポイント

パフォーマンステストは専用のツールやテスト環境を用意したり、特殊なスキルセットを必要とすることから、開発プロセスの終盤にシステム全体に対して行われるケースがよくあります。一方で、問題を早期発見するためには、より早い段階で REST API に直接負荷を掛けてパフォーマンステストすることが必要になります。より早い段階からテストを実施するためには、パフォーマンステスト専用ツールを利用するのではなく、REST APIの機能テストとパフォーマンステストの両方が実施できるツールを採用し、機能テスト用のシナリオをパフォーマンステストで活用することも有効です。

関連ページ

REST API のセキュリティテスト

セキュリティテストは、REST APIにセキュリティ上の脆弱性を検証するテスト手法です。ユーザーの誤った操作や、悪意のある操作によって意図しないリクエストが送信された場合でも、REST APIが適切に処理できるか確認します。

ポイント

この種の動作を防ぐためには、悪質な攻撃をシミュレートする REST API のテストケースを作成する必要があります。REST API のシナリオテストはアプリケーションへ故意に攻撃するシナリオとしても流用できるため、既存のテストケースをセキュリティテストに活用することが可能です。たとえば、さまざまなタイプのパラメーターファジングまたは SQL インジェクション攻撃をシナリオテストに組み込んでAPIテストを実施します。

関連ページ

まとめ

適切な REST API のテスト戦略で開発に臨む事は、データ連携が欠かせないアプリケーションが「今日も昨日と同じように動く」ことを保証する上で非常に価値のある事です。REST API に限らず、SOAP, MQ, MQTT, Kafka, protobuf, WebSocket などを含む API のテストは、アプリケーションのレイヤー毎の品質を確保(欠陥を検出)するために欠かせません。

また、API テストは UI テストよりもはるかに変更が生じにくく、一貫性があるため、既に作成した API のテスト資産を今後も長期間にわたって利用(運用)しやすいのも特徴です。Jenkins などの CI/CD パイプラインで、これらの API テストの実行をすべて自動化し、アプリケーションの品質を継続して確保する仕組みを構築する事もよくあるテストプラクティスです。

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

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

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

    03-4405-7853

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

お問い合わせ

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