APIテストとは?
APIを介したサービス連携が当たり前になった今、その品質を保証する「APIテスト」の重要性が増しています。本項目では、APIそのものの定義に始まり、テストの目的などをわかりやすく解説します。
APIとは「Application Programming Interface」の略称で、直訳すると「アプリケーションをプログラミングするための接点」となります。
わかりやすくいうと「サービスの窓口」のようなものであり、あるソフトウェアが持つ機能やデータを、外部の別のソフトウェアが安全に利用するために提供される、決められた手順やデータ形式のルールを指します。
たとえば、WebサイトにGoogleマップを埋め込んだり、スマートフォンのアプリケーションでSNSアカウントを使ってログインしたりする機能は、すべてAPIを介して実現されています。
APIは異なるシステム同士を連携させ、より便利で高機能なサービスを生み出すために不可欠です。そして、APIテストは窓口が正しく機能し、安全に利用できるかを検証する作業といえます。
APIテストを行う重要な目的は、APIの品質を保証し、安定したサービスを提供する部分にあります。
ユーザーが直接触れる画面(UI)のテストだけでは、裏側で動いているビジネスロジックの不具合を見つけることは困難であるため、目に見えない部分の品質を担保するためにAPIテストが行われます。
APIの動作チェック、外部からの攻撃に対する安全性といった問題を早期に発見し修正することで、開発全体の効率化と迅速なリリースにつなげられます。
システム開発に携わるすべての担当者が、テストの重要性を認識しているはずです。しかし、納期の制約や人員・リソースの不足といった現実的な課題から、十分なテストが行えず、成果が不十分になるケースも少なくありません。
株式会社NEXERとポールトゥウィンが共同で行った「ソフトウェアテストに対する意識に関するアンケート」では、テスト不足による影響としてもっとも多かった回答が「不具合が多発し、ユーザーに不満を与える」という回答が49.2%で1位でした。
そのほかにも「思いどおりに動かないなら使われなくなる」「不具合によってストレスがたまる」「ユーザーがもっとも実害を被るから」といった声が寄せられています。
このように、テストを後回しにして開発を優先した結果、後工程で大きな手戻りが発生し、最終的にビジネスへ深刻な影響を及ぼすリスクがあることが明らかになっています。
アンケート結果からもわかるように、APIテストは単なるバグの洗い出しではありません。ユーザー体験とビジネスの信頼性を守るための、極めて重要な投資といえます。
※調査データ引用元: https://prtimes.jp/main/html/rd/p/000001581.000044800.html
APIテストの主な観点
APIテストを計画する際、やみくもにテスト項目を洗い出すのは非効率です。本項目では、APIテストで確認すべき観点を機能的・非機能的の2つに分けて解説します。
機能的な観点とは「APIが仕様書に定められたとおりに正しく動くか」を確認する視点です。APIに特定のリクエストを送った際に、期待されるレスポンスやデータの変更が正確に行われるかを検証するために、以下の項目をチェックします。
チェック項目:レスポンスの整合性
内容:リクエストに対し、期待どおりのデータ形式や構造でレスポンスが返ってくるか。
チェック項目:パラメータの境界値
内容:上限値や下限値、空文字など、仕様の境界となる値で意図通りに動作するか。
チェック項目:エラー処理
内容:不正なリクエストに対し、適切なステータスコードやエラーメッセージが返るか。
チェック項目:状態遷移
内容:データの登録・更新・削除といった一連の処理が、正しくシステムに反映されるか。
機能的な観点を持って行われるテストは、APIの基本的な品質を保証するうえでもっとも重要です。
非機能的な観点とは機能面に加え、システムの品質や信頼性を担保するための視点であり、主に次の2項目を検証します。
● パフォーマンス
・目的:APIの応答速度や多数の同時アクセスがあった際の処理能力検証。
・主な検証項目:応答時間、スループット、同時接続ユーザー数など。
● セキュリティ
・目的:SQLインジェクションや情報漏洩といった、外部からの攻撃に対する脆弱性チェック。
・主な検証項目:脆弱性診断、認証・認可の正当性、データの暗号化など。
サービスの安定稼働とユーザーの信頼獲得に直結する重要な観点であり、機能的な観点とともに無視できない要素です。
APIテストの主な種類
APIテストには、その目的や検証する範囲に応じてさまざまな種類が存在します。本項目では、APIテストを「テストレベルによる分類」と「テスト手法による分類」という2つの大きな切り口で整理し、それぞれの特徴を解説します。
それぞれの分類を理解し、自身のプロジェクトの状況に合わせて最適なテスト計画を検討しましょう。
システムによっては複数のAPIが組み込まれる場合も少なくありません。そのため、組み込まれたAPI同士が単独あるいは連携しても正確に動作するかの検証が不可欠です。
テストレベルによる分類では、APIの動作単位別に4種類のテストを使い分けるのが一般的です。ここからは、それぞれのテスト内容をわかりやすく解説します。
■コンポーネントテスト(単体テスト)
コンポーネントテストは、APIを構成する最小単位の機能が、単独で正しく動作するかを検証するテストで「単体テスト」とも呼ばれます。
建物で例えるなら、柱や窓といった個々の部品が、設計図通りに作られているかをひとつひとつ確認する作業と同じです。
開発の初期段階で行うことで、不具合を早期に発見でき、原因特定も容易になるため、のちの工程で手戻りを防ぐうえでも重要なテストです。
■コントラクトテスト
コントラクトテストは、APIの提供側と利用側が、あらかじめ取り決めた仕様(契約)を互いに守っているかを確認するテストです。
サービスの提供側と利用側が、それぞれ「この形式でリクエストを送ります」「この形式でレスポンスを返します」という契約書(コントラクト)を交わし、内容にズレがないかを検証します。連携先のシステムが未完成でも、契約書さえあればテストを進められる点がメリットです。
■統合テスト
コンポーネントテストで品質が確認された個々のAPIを複数組み合わせたうえで、連携して正しく動作するかを検証するのが統合テストです。
部品単体では問題がなくても、実際に組み立ててみると上手くはまらなかったり、予期せぬ干渉が起きたりする場合があります。統合テストの実施目的は、こうしたAPI間のインターフェース部分における問題を発見することです。
■エンドツーエンドテスト(E2Eテスト)
エンドツーエンドテスト(E2Eテスト)は、ユーザーと同じ視点でシステム全体の操作が正常に機能するかを確認するテストです。画面操作やデータ処理、外部APIとの連携など、実際の利用フローを通じて検証します。
とくに、フロントエンドとバックエンド、外部サービス間の連携による不具合を検出できる点が大きな強みで、単体テストや結合テストでは見逃されやすい問題にも対応できます。
システム全体の完成度とユーザー体験の品質を確認する重要な工程ですが、コストがかかるため、重要機能や主要シナリオに絞って実施するのが効果的です。
テスト手法による分類とは「何を」「どのように」検証するのか、というテストの目的に着目した分け方です。本項目では、APIテストで用いられる機能テストや負荷テストなど、代表的な5つの手法を紹介します。
■機能テスト
機能テストは、APIが仕様書などに記載された機能をすべて満たしているかを確認する、もっとも基本的なテスト手法です。
たとえば、ユーザー登録APIであれば、正常なメールアドレスとパスワードでの登録可否を確認するだけでなく、すでに登録済みのメールアドレスや、フォーマットに合わないパスワードを入力した際に、適切なエラーが返されるかも検証します。
正常・異常どちらの検証も実施することにより、APIがさまざまな状況下でも安定して動作するかを調査できます。
■負荷テスト
負荷テストは、APIに対して通常時を大幅に超える高い負荷をかけ、システムがどの段階まで正常に耐えられるかの限界点を見極めるテストです。主な実施目的は、システムの耐久性や安定性を確認するほか、サービス停止といった重大障害の防止です。
キャンペーン開始時やセールの時間など、アクセス量の増加が予想されるシナリオを想定し、意図的に大量のリクエストを発生させます。その際、システムがダウンしないか、レスポンスが極端に遅くならないか、データが破損しないかなどを監視するのが、主なテストの流れです。
■パフォーマンステスト
パフォーマンステストは通常の利用状況や、ある程度の負荷がかかった状況下での性能を測定・評価するテストです。
例として「APIの応答時間は平均1秒以内であること」といった性能要件が定められている場合に、要件を満たしているかを確認します。
システムの性能が低いとユーザー体験の悪化に直結するため、顧客満足度を維持するうえでもパフォーマンステストは重要視されるテストです。
■セキュリティテスト
APIに悪意のある攻撃に対する脆弱性がないかを検証するのが、セキュリティテストです。APIは外部に機能を公開しているため、常にサイバー攻撃の標的となるリスクを抱えています。情報漏洩やサービスの乗っ取りといったインシデントを防ぐためにも、セキュリティテストは不可欠です。
具体的なテスト内容としては、SQLインジェクションやクロスサイトスクリプティング(XSS)といった代表的な攻撃パターンを擬似的に実行する脆弱性診断(ペネトレーションテスト)や、意図的に大量の予期せぬデータを送り込むファズテストなどがあります。
※ こちらの記事では、脆弱性診断について解説しています。
2種類の手法や流れも取り上げているため、ぜひあわせてご覧ください。
■ネガティブテスト
ネガティブテストは「異常系テスト」とも呼ばれ、システムが予期せぬ入力や不正な操作に対して、クラッシュしたり重大なエラーに陥ったりしないことを確認するテストです。
実施例としては、必須パラメータを空にしてリクエストを送信したり、数値を入力すべきフィールドに文字列を入力したり、存在しないIDを指定してデータを要求したりといったケースをテストします。
誤操作や誤入力に対して、システムがダウンせず、ユーザーにわかりやすいエラーメッセージを返して正常な状態を保てるかの確認が、ネガティブテストを行う主な目的です。
APIテストは手動と自動を組み合わせるのがおすすめ
APIテストを効率的に進めるには、4つのステップに沿って実施することが重要です。まず、API仕様を正確に把握し、次にその内容にもとづいてテストケースを設計します。
設計したケースに従ってテストを実行し、レスポンスや動作が期待どおりかを確認します。最後に結果を分析し、不具合があれば原因を調査・修正し、再テストを行います。この流れにより、品質と効率を両立したテストが可能になります。
こうしたステップに沿って実施するうえで、APIテストを手動で行うべきか、自動化すべきかという議論は避けて通れません。本項目では、APIテストの自動化がもたらすメリットと、自動・手動それぞれが適したテストケースについて解説します。
APIテストの自動化は、開発の品質とスピードを向上させるうえで多くのメリットをもたらします。とくに代表的な利点は次の3つです。
● 機械がテストを実行するため、手動よりも早くテストを終えられる。
● テストに要する時間を短縮し、業務の工数削減が期待できる
● 手作業で懸念される入力漏れや操作ミスを防止できる
● 機能修正のたびに行う回帰テスト(リグレッションテスト)を効率化できる
繰り返し実行する必要があったり、正確性が求められたりするテストは自動化に向いています。代表的なテストは次のとおりです。
● 機能テスト
● パフォーマンステスト
● 負荷テスト
手動で行うには困難または非効率なテストを自動化すると、テストの網羅性や品質向上も期待できます。
自動テストでは難しい、人間の視点や柔軟性が求められる場面では手動テストが効果的です。したがって、次のテストの実施時は手動テストを検討しましょう。
● セキュリティテスト(とくに、人間の探索的思考や複雑な攻撃シナリオのテスト)
● ネガティブテスト(とくに、新しく予測困難な異常系シナリオの発見)
これらの分野にも自動化ツールは存在しますが、予期せぬ動作を完全に網羅するのは難しく、手動による柔軟な対応が求められます。さらに、開発初期など仕様が定まっておらず頻繁に変更が生じる段階では、自動化よりも手動テストの方がコスト面で有利な場合もあります。
まとめ
APIテストは機能的観点と非機能的観点の両方が重要であり、プロジェクトの目的に応じて適切なテスト手法の選択が必要です。
しかし、自社だけでテスト計画を実行するには、専門的なノウハウやリソース、検証環境の確保など、多くの課題がともないます。テストの品質や網羅性に不安がある場合は、専門家の知見を活用する選択肢も検討しましょう。
ポールトゥウィンは、30年にわたり3,000社以上のソフトウェアテストを手掛けてきた第三者検証のプロフェッショナルです。
600機種5,000台以上の端末を用いた検証、テスト自動化の導入支援まで、APIテストに関するあらゆる課題をワンストップでサポートします。自社のテスト品質向上や実施環境に課題を持つ方は、お気軽にお問い合わせください。
ポールトゥウィンのソフトウェアテスト・品質向上サービスは、 こちらからご覧ください。
