外部API連携のテスト観点|制御できない相手への備え

決済代行、地図、SNS認証、配送、SaaS、顧客の基幹システム。いまや多くのシステムは、外部サービスとのAPI連携なしには成り立ちません。しかし、いざテストの段になると「どこまで確認すればよいのか」「本番を叩くわけにもいかない」と手が止まりがちです。
外部API連携のテスト観点を難しくしている本質は、たった一つです。それは連携相手を自分たちでコントロールできないという点に尽きます。相手の仕様も、障害も、変更のタイミングも、こちらの都合では動きません。
本記事では、決済やSaaSなど「制御できない相手」との連携を前提に、正常系から異常系、非同期、データ不整合、仕様変更への備えまでを体系的に整理します。受託開発のPMやエンジニアが、レビューや見積もりの根拠として使える粒度でまとめました。
受託開発では、連携相手が顧客側の基幹システムであるケースも少なくありません。この場合、相手の都合で試験環境が用意されない、仕様書が古い、といった事情も重なります。だからこそ「相手をどこまで信用してよいか」をテスト設計の段階で言語化しておくことが、後の手戻りを大きく減らします。
なぜ外部API連携のテスト観点は難しいのか
自社で作った機能のテストと、外部API連携のテストは、難しさの種類が違います。前者は仕様も実装も自分たちの手の内にありますが、後者は「相手」という不確定要素が常につきまといます。
まず押さえたいのは、外部連携のテストが難しくなる根本原因です。次の4つが代表的です。
- 相手の仕様・挙動を制御できない:ドキュメントに書かれていない挙動や、突然の仕様変更が起こり得る
- 本番環境を自由に叩けない:決済や配送依頼は実際の課金・出荷につながり、繰り返し実行できない
- 障害を任意に再現できない:相手のサーバーダウンや遅延は、こちらが好きなタイミングで起こせない
- 課金・レート制限がある:呼び出すたびに費用が発生したり、回数上限に達したりする
これらは自社内の連携でも一部当てはまりますが、外部サービスでは制約が一段と厳しくなります。「相手が理想どおりに動く前提」を捨てることが、テスト設計の出発点です。
特に見落とされやすいのが「本番を叩けない」制約です。決済APIで実際に決済を走らせれば課金が発生し、配送APIを叩けば実際の出荷手配が動きかねません。テスト用に何度も繰り返す、という自社機能では当たり前の進め方が通用しないのです。
そのため、外部連携のテストは「本物に近い代替環境をどう用意するか」という設計判断とセットになります。ここを曖昧にしたまま進めると、テスト工数の見積もりが大きく外れる原因になります。相手のせいで環境が整わないリスクを、早い段階でPMが把握しておくことが重要です。
なお、本記事は「他者が提供するAPIとの連携」に固有の話に絞ります。自分たちが提供するAPI自体の検証手順は、APIテストのやり方と観点チェックリストで解説しています。自社サービス間の連携という文脈はマイクロサービスのテスト戦略が近いため、あわせて参照すると全体像を整理しやすくなります。
テスト環境の作り方:サンドボックス・スタブ・モックの使い分け
外部API連携のテストで最初に決めるべきは「何を相手役に据えるか」です。本物を叩くのか、代替物を使うのかで、確認できる範囲もコストも大きく変わります。
代表的な選択肢は、サンドボックス、スタブ、モック、そして本番実接続の4つです。それぞれ得意分野が異なるため、目的に応じて使い分けます。
| 相手役 | 概要 | 得意なこと | 苦手なこと |
|---|---|---|---|
| サンドボックス | 外部事業者が提供する試験環境 | 実仕様に近い正常系・認証の確認 | 任意の障害再現や自由なデータ操作 |
| スタブ | 固定的な応答を返す代替 | 特定レスポンスの再現・異常系の作り込み | 相手の実挙動との差異検出 |
| モック | 呼び出し自体を検証する代替 | 送信内容・呼び出し回数の検証 | 実データの往復確認 |
| 本番実接続 | 本物のAPIを叩く | 最終的な疎通・結合の確証 | 課金・副作用・繰り返し実行 |
用語は書籍でも整理されています。吉井健文『フロントエンド開発のためのテスト入門』によれば、スタブは「値を返す代替」、モックは「呼び出しを検証する代替」と役割が分かれており、ネットワークレベルでAPI応答を差し替える手法も紹介されています。
異常系はスタブ/モックで作り込み、正常系の最終確証はサンドボックスや実接続で取る、という二段構えが基本方針になります。実接続はコストと副作用が大きいため、通す範囲を絞る判断がPMの腕の見せどころです。
実接続テストはどこまでやるか
実接続は「安心料」として全ケースで使いたくなりますが、課金や副作用を考えると現実的ではありません。実接続に回すのは、次のような「代替物では確証が持てない箇所」に限定するのが賢明です。
- 認証・トークン取得の一連の流れが通ること
- 主要な正常系が、実際のレスポンス形式で成立すること
- 通信経路(IP制限・証明書・プロキシ)に問題がないこと
多くのケースは、スタブやモックで代替します。スタブは「この入力にはこの応答を返す」と決め打ちできるため、通常は起こしにくい異常応答も自在に再現できます。エラーレスポンスや不正な形式を意図的に返し、自社側の処理が破綻しないかを確かめられるのが強みです。
契約による検証という考え方
サンドボックスや実接続に頼りすぎず、「自分たちが期待する入出力の形」をテストとして固定しておく方法があります。相手のレスポンスがその形から外れたら検知できるようにしておく、という発想です。
この考え方は、相手の全機能を検証するものではありません。あくまで自社が依存している範囲だけを対象にします。相手の仕様変更で連携が壊れる事故を、早い段階で機械的に拾えるのが利点です。詳しくは後半の「仕様変更・廃止への備え」で改めて触れます。
正常系のテスト観点:データマッピングと認証トークン
制御できない相手だからこそ、正常系こそ丁寧に確認する必要があります。特に事故が多いのが、データの受け渡しと認証まわりです。
データマッピングでは、自社の項目と外部APIの項目の対応を1件ずつ突き合わせます。型・桁・必須/任意・単位・文字コード・日付形式など、ズレやすい点を洗い出します。日付やタイムゾーンの扱いは特に事故が多いため、書式やタイムゾーンの一致は入念に確認しておくと安心です。
金額のように精度が重要な項目は、丸めや桁あふれに注意します。相手が最小単位(例:円単位か、その下の単位か)で値を扱う場合、単位を取り違えると桁がずれます。境界となる値、たとえば最大桁数ちょうどや、ゼロ・マイナス・極端に大きい値を入れて、想定どおりに扱われるかを確かめます。
正常系で確認したいデータマッピングの観点を整理します。
| 観点 | 確認内容 | 見落とし例 |
|---|---|---|
| 型・桁 | 数値/文字列/真偽値と最大長の一致 | 金額を整数と小数で取り違える |
| 必須・任意 | 欠落時の相手側の扱い | 任意項目の未送信で既定値が入る |
| 単位・精度 | 金額の最小単位や少数桁 | 円とセント相当を混同する |
| 文字コード | 全角・絵文字・多言語の通過 | 絵文字でエラーになる |
| 日付形式 | タイムゾーン付き書式の一致 | UTCとローカル時刻のズレ |
外部APIの認証方式は、いくつかのパターンに分かれます。方式によって確認すべき点も変わるため、まず自分たちが使う方式を把握しておきます。
| 認証方式 | 概要 | テストで見る点 |
|---|---|---|
| APIキー | 固定の鍵を付与する | 鍵の秘匿と、誤った鍵の拒否 |
| トークン方式 | 有効期限付きの token を発行 | 期限切れと再取得の動作 |
| 署名方式 | リクエストに署名を付与する | 署名生成の正しさと改ざん検知 |
認証トークンでは、取得だけでなく「更新」まで含めて検証します。アクセストークンには有効期限があるのが一般的で、期限切れ後の再取得(リフレッシュ)が正しく動かないと、稼働中に突然エラーが多発します。
やっかいなのは、この不具合が開発中には表面化しにくい点です。テスト期間が短ければトークンは期限内のままで、期限切れの経路が一度も通らないこともあります。時計を進める、期限切れ応答をスタブで返すなど、意図的に期限切れを起こす工夫が必要になります。トークンの有効期限切れと再取得は、必ずテストケースに含めるべき最重要の正常系です。
- トークン取得が成功し、以降のリクエストに正しく付与される
- 有効期限切れを検知し、自動で再取得できる
- 再取得の失敗時に、無限リトライや多重取得に陥らない
- 認証情報(キー・シークレット)が誤りのとき、適切に検知できる
異常系と耐障害性の外部API連携のテスト観点
正常系よりも差がつくのが異常系です。相手はいつでも遅延・エラー・無応答になり得るため、異常系こそが検証の中核になります。
まず、外部APIが「期待どおりに返らない」パターンを網羅します。代表的な異常系を整理します。
| 異常系 | 想定する状況 | 期待する自社側の挙動 |
|---|---|---|
| タイムアウト | 応答が一定時間内に返らない | 打ち切り、リトライまたは縮退 |
| 通信断 | 接続自体が確立できない | エラー通知、再試行の制御 |
| 5xxエラー | 相手サーバー側の障害 | リトライ対象として扱う |
| 4xxエラー | 要求内容の誤り | リトライせず原因を記録 |
| 遅延応答 | 遅いが最終的に返る | 待ち時間の上限管理 |
| 不正な応答 | 想定外の形式・欠損 | パースエラーを安全に処理 |
これらへの備えとして重要な技術用語を、正確に押さえておきます。
- リトライ:失敗したリクエストを再送する仕組み。無条件の即時再送は相手の負荷を高めるため避ける
- 指数バックオフ:再送間隔を回数ごとに広げる方式(例:1秒、2秒、4秒)。混雑時の連鎖的な悪化を防ぐ
- 冪等性(べきとうせい):同じ操作を複数回実行しても結果が一度と変わらない性質。リトライ時の二重処理防止に不可欠
- サーキットブレーカー:障害が続く相手への呼び出しを一時的に遮断し、回復を待つ仕組み
- フォールバック/縮退運転:外部APIが使えないとき、代替表示や機能限定で処理を継続すること
リトライを設計するなら、冪等性の担保はセットで検証する必要があります。リトライで決済や注文が二重に走ると、実害に直結するためです。
二重送信・二重処理をどう試すか
冪等性は「言葉として知っている」だけでは不十分で、実際に二重実行して結果を確かめる必要があります。特に危ういのが、相手に処理は届いたのに、応答だけ受け取れなかったケースです。自社側は「失敗した」と判断してリトライし、結果として相手側で二重に処理されてしまいます。この「成功したのか失敗したのか分からない」状態こそ、冪等性が真価を問われる場面です。次のような観点でテストします。
- 同一リクエストを意図的に2回送り、処理が1回分に収束するか
- タイムアウト後にリトライした際、相手側で重複登録されないか
- 冪等キー(idempotency key)を使う場合、キーの生成・付与が正しいか
- ネットワーク断で「送ったが応答を受け取れなかった」状態からの復旧が安全か
異常系の設計をさらに深掘りしたい場合は、エラーハンドリングテストの設計と実践が具体的な組み立て方の参考になります。
タイムアウトと打ち切りの設計
外部APIを待ち続けると、自社システム全体が巻き込まれて遅くなります。1つの遅い連携が、無関係な画面の応答まで悪化させることは珍しくありません。だからこそ、待ち時間の上限を明確に決めておく必要があります。
- 接続のタイムアウトと、応答のタイムアウトを分けて設定しているか
- 上限に達したとき、確実に処理を打ち切れるか
- 打ち切り後に、リトライへ回すか縮退へ回すかが決まっているか
- 複数の外部呼び出しが連なる処理で、全体の待ち時間が上限を超えないか
サーキットブレーカーを使う場合は、遮断と復帰の条件もテスト対象になります。障害が一定回数続いたら遮断し、一定時間後に少しだけ試して回復を確認する、という一連の流れが設計どおり動くかを見ます。遮断中はフォールバックへ切り替わり、利用者に致命的なエラーを見せない設計が理想です。
レート制限・スロットリング・課金への備え
外部APIの多くには、単位時間あたりの呼び出し回数に上限があります。これを超えると一時的にエラーが返る、いわゆるレート制限です。開発中は気づかず、負荷が上がった本番で初めて表面化することが少なくありません。
やっかいなのは、異常系対策として入れたリトライが、レート制限をさらに悪化させる場合がある点です。エラーが返るたびに即座に叩き直すと、上限を早く使い切り、余計にエラーが増える悪循環に陥ります。異常系とレート制限は、切り離さず一体で設計・検証するのが安全です。
レート制限とスロットリングは似ていますが、区別して扱うと整理しやすくなります。
| 用語 | 意味 | テストで見る点 |
|---|---|---|
| レート制限 | 回数上限を超えると拒否される | 上限到達時のエラー処理と待機 |
| スロットリング | 過負荷時に応答を意図的に遅く/制限する | 遅延時のタイムアウトとの兼ね合い |
| クォータ | 日次・月次などの総量上限 | 上限接近時の検知と通知 |
| 従量課金 | 呼び出し回数・量に応じた費用 | 無駄な呼び出しやリトライ増を抑制 |
テスト観点としては、上限に達したときの挙動を必ず確認します。上限到達を示すレスポンスを受けたら、一定時間待って再試行する制御が働くか、そして待たずに叩き続けて状況を悪化させないかを見ます。
- レート制限到達時に、待機してから再試行できるか
- リトライの多発が、かえって上限消費を早めていないか
- 課金対象の呼び出しが、テストで想定外に膨らまないか
- クォータ接近時に、運用側へアラートが上がる設計か
レート制限や課金への備えは、テストだけでなく設計の工夫でも軽減できます。同じ問い合わせを毎回外部に投げず、一定時間キャッシュする。細かな呼び出しをまとめてバッチ化する。呼び出し側で流量を制御する。こうした工夫が効いているかも、あわせて確認したい観点です。
- 変化しにくいデータを、適切な時間キャッシュしているか
- リトライ時に、間隔を空けて相手の負荷を抑えているか
- 大量処理で、呼び出しが一気に集中しない設計か
課金や副作用の重い連携の代表例が決済です。決済まわりの具体的な確認項目は、決済システムのテスト観点に整理していますので、金額を扱う連携では特に参照する価値があります。
非同期・Webhookのテスト観点:順序・重複・署名検証
外部連携では、結果が即時に返らず、後から通知される「非同期」の形が多く使われます。配送状況の更新や決済結果の確定などが典型で、相手からのWebhook(コールバック通知)で受け取ります。
同期APIなら「呼んで、待って、結果を受け取る」という流れですが、非同期では結果を受け取るタイミングを相手に委ねます。この主導権の移動が、テストを一段難しくします。テスト側で通知を任意に発生させられるよう、擬似的にWebhookを送る手段を用意しておくと検証がはかどります。
Webhookは便利な反面、同期API以上に「相手を信用しすぎない」姿勢が求められます。押さえるべき性質を整理します。
- 順序保証がないことがある:通知は必ずしも発生順に届かない。後から古いイベントが来る前提で設計する
- 重複して届くことがある:同じ通知が複数回来る可能性がある。冪等に処理する必要がある
- 本物とは限らない:第三者が偽の通知を送る余地がある。署名検証で真正性を確かめる
- 順不同・遅延を許容する:数分〜数時間遅れる可能性を織り込む
Webhookは「順序保証なし・重複あり・要署名検証」を前提に組むのが安全です。特に署名検証を省くと、なりすまし通知で状態が書き換わる事故につながります。
Webhook受信のテストで確認したい項目は次のとおりです。
| 観点 | 確認内容 |
|---|---|
| 署名検証 | 正しい署名は受理し、不正な署名は拒否する |
| 重複受信 | 同一イベントを複数回受けても結果が一度分に収束する |
| 順序逆転 | 新しい状態の後に古い通知が来ても上書きしない |
| 遅延到達 | 大幅に遅れて届いた通知を安全に処理する |
| 受信失敗 | 受信側の一時障害後に再送を受け取れる |
署名検証は、通知が本物かどうかを確かめる要の仕組みです。一般に、送信側と受信側で共有する秘密情報を使って署名を計算し、受信側で同じ計算をして一致するかを確かめます。この検証を省くと、外部を装った偽の通知で状態を書き換えられる危険が生じます。
受信エンドポイントは、何度呼ばれても結果が変わらない「冪等」な作りにしておくと安全です。相手は応答を受け取れないと再送してくることがあり、二重処理が起きやすいためです。受信後は速やかに受領応答(ACK)を返し、重い処理は後続に回す設計もよく使われます。
非同期処理では、外部と自社の状態が一時的にズレます。この「ズレていても最終的に揃う」という結果整合性の考え方を、次のセクションで扱います。
データ不整合と仕様変更・廃止・本番リリースへの備え
外部連携で最も厄介なのが、外部と自社の状態がずれる「データ不整合」です。非同期通信や通信断があると、片方だけ処理が進んだ状態が生まれます。
たとえば、決済は成立したのに自社側の注文は未確定のまま、あるいはその逆といった状況です。利用者から見れば「お金は払ったのに商品が届かない」といった不信につながり、受託開発では顧客の信頼を直接損ないます。だからこそ、ズレを放置せず拾い上げる仕組みが欠かせません。
即座に完全一致を求めるのではなく、時間をかけて最終的に一致させる「結果整合性」を前提に設計するのが現実的です。そのうえで、ズレを検知・修正する仕組みを用意します。
- 突合(つきあわせ):外部と自社の記録を定期的に照合し、差分を洗い出す
- リカバリ手順:差分が見つかったときの再送・取消・手動対応の手順を定める
- 状態の可視化:処理中・確定・失敗などの状態を記録し、追跡できるようにする
「ズレは起きる」前提で、検知と修正の手段まで含めてテストすることが肝心です。突合やリカバリの具体的な進め方は、データ整合性テストの進め方で詳しく解説しています。
突合をテストするときは、正常時だけでなく「ズレている状態」を意図的に作って試します。片方だけ処理が完了した状態や、金額・件数が食い違う状態をスタブで再現し、突合がその差分を正しく検出できるかを確かめます。検出後に、再送・取消・手動対応のどれに振り分けるかまで確認できると安心です。
突合の頻度や範囲も、テスト計画で決めておきたい論点です。全件を毎回照合するのか、一定期間の差分だけを見るのか。データ量と重要度に応じて、現実的な運用に落とし込みます。金額や在庫のように実害が大きいデータほど、照合を厚くする判断が妥当です。
相手の仕様変更・廃止への備え
外部APIは、こちらの都合と無関係にバージョンアップや廃止が行われます。ある日突然、レスポンス形式が変わって連携が壊れる、という事態は珍しくありません。備えの観点を整理します。
| 備え | 内容 | 効果 |
|---|---|---|
| バージョン管理 | 利用中のAPIバージョンを明示・固定する | 予期せぬ変更の影響を抑える |
| 監視 | 連携のエラー率・応答時間を継続監視する | 異常を早期に検知する |
| 契約的な検証 | 期待する入出力の形をテストで固定する | 仕様変更の破壊を検知する |
| 告知の追跡 | 提供元の変更告知・廃止予定を追う | 移行を前倒しで計画する |
ここでいう「契約的な検証」とは、自社が期待するリクエスト・レスポンスの形をテストとして固定し、それが崩れたら気づけるようにする考え方です。相手の全機能をテストするのではなく、自分たちが依存している部分だけを守るのがポイントです。
本番リリース時の注意点
最後に、リリース時に特有の観点があります。テスト環境と本番では、鍵も宛先も監視も変わるため、切り替えの確認を怠ると初日から事故になります。
ありがちなのが、接続先がサンドボックスのまま残っていて、本番で決済が成立しない、あるいは逆にテストのつもりが本番を叩いてしまう、という取り違えです。設定値がコードや環境変数のどこで切り替わるのかを、リリース前に一覧で確認しておくと防ぎやすくなります。
- 本番用のAPIキー・シークレットに正しく切り替わっているか
- 接続先URLがサンドボックスのまま残っていないか
- IP制限・証明書・プロキシなど通信経路の設定が本番向きか
- リリース直後の連携エラー率・遅延を監視する体制があるか
- 問題発生時に、切り戻し(ロールバック)や機能停止ができるか
まとめ:外部API連携のテスト観点チェックリスト
外部API連携のテスト観点は、突き詰めれば「制御できない相手」といかに折り合うかに集約されます。相手が理想どおりに動く前提を捨て、遅延・障害・重複・変更を織り込むことが出発点でした。
自社機能のテストが「正しく作れているか」を確かめる作業だとすれば、外部連携のテストは「相手が期待どおりでなくても、自社が壊れないか」を確かめる作業だと言えます。守るべきは自分たちの側であり、相手を直すことはできません。この視点の切り替えが、抜け漏れを防ぐ鍵になります。外部連携は不確実性との付き合い方そのものであり、テスト計画の段階で備えを織り込めるかが品質を分けます。
本記事の要点を、最終確認用のチェックリストとして整理します。
- テスト環境:サンドボックス・スタブ・モック・実接続を目的で使い分けたか
- 正常系:データマッピングと、トークンの取得・更新まで確認したか
- 異常系:タイムアウト・5xx・リトライ・指数バックオフを検証したか
- 冪等性:二重送信・二重処理が起きないことを実際に試したか
- レート制限:上限到達時の待機と、リトライ多発の抑制を確認したか
- 非同期/Webhook:順序逆転・重複・署名検証を前提に組んだか
- データ不整合:結果整合性を前提に、突合とリカバリを用意したか
- 仕様変更・廃止:バージョン固定・監視・契約的検証で備えたか
- 本番リリース:鍵・接続先・監視・切り戻しを切り替え確認したか
信頼性に関する定量データは、IPAのソフトウェア開発分析データ集などの公的資料が参考になります。リトライや冪等性といった用語の定義を社内で揃えたい場合は、JSTQBの資格・シラバス情報を共通の土台にすると認識のズレを防げます。
外部連携の検証は範囲が広く、少人数の体制ではすべてを自前で担保しきれない場面もあります。テスト体制の見直しや、異常系・耐障害性の検証を強化したいとお考えの方は、テスト代行サービスへのご相談窓口からお気軽にお問い合わせください。
次に読むならこの記事
テストの手戻りを減らしたい方へ
テスト仕様書のExcelテンプレートを無料で配布しています。自社で整備する場合も、外部に任せる場合も、まずは型を持つところから。



