本文へ移動

ホーム / QA / 第2部 テストの基礎

第2部 テストの基礎・第5章

API と DB のテスト

★★☆ 重要7トピック・面接 4問

画面を通さずに API と DB を直接確かめる方法を押さえる。画面より速く、画面では作れない入力も試せる。

ひとことで

画面を通さずに API を直接テストすると、速く安定する。

画面を通さずに API を直接テストすると、速く・細かく確かめられます。画面では選べない値(マイナスの数、とても長い文字列、他人の ID)を送れるのも利点です。

道具・方法向いている使い方気をつけること
curl1つのリクエストをすぐ試す、手順を文字で共有するトークンなどの秘密を共有の文章に残さない
Postman などの GUIリクエストをまとめて保存し、環境ごとに切り替えて連続で流すコレクションを共有するなら環境変数に秘密を分ける
自動テストのコードCI で毎回流す回帰テストテストデータを自分で作り、他のテストと独立させる
契約テストサービス同士の約束が守られているかを早く確かめる機能が正しいかまでは見ない(それは別のテストで)

curl と Postman

curl はコマンドで HTTP のリクエストを送る道具で、手順をそのまま共有できます。

curl -i -X POST https://staging.example.com/api/orders \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"item_id": 1, "quantity": -1}'
# -i でステータスとヘッダーも表示。期待は 400 か 422

Postman などの GUI の道具は、リクエストをまとめて保存し、環境(開発・検証)ごとの変数を切り替え、レスポンスの確認(ステータスが 201 か、項目があるか)を書いて連続で流せます。

面接ではこう答える

API のテストは、画面を通さずに API を直接呼んで確かめるテストです。画面より速く安定していて、画面では入力できない値、たとえばマイナスの数量や他人の ID も送れます。1回だけ試すなら curl、まとめて保存して流すなら Postman などの道具、毎回流す回帰テストなら自動テストのコードにします。

5.2API のテストの観点

用語★★☆ 重要
ひとことで

API のテストは、形の検査・認証・権限・処理の段ごとに、通すべきものと止めるべきものを送って確かめる。

API は、リクエストを受け取ってから、形の検査・認証・権限・処理の順に進みます。段ごとに「通すべきもの」と「止めるべきもの」を送ると、観点の抜けが減ります。

形の検査400・422認証401権限403・404処理409・500応答200・201それぞれの段で「通すべきもの」と「止めるべきもの」の両方を送る
API の処理の段と、止まったときのステータス
観点送るもの期待すること
正常系正しい値期待のステータス(201 など)と中身。DB にも正しく保存
入力の検証必須なし・型違い・範囲外・長すぎる4xx と分かりやすいエラー。500 にならない
認証トークンなし・期限切れ401
権限他人のデータの ID・一般ユーザーで管理者の API403 か 404。中身が返らない
一覧0 件・ページの境目・並び順抜けや重複がない
互換性項目の追加・名前の変更使う側(アプリの古い版など)が壊れない

面接ではこう答える

API のテストの観点は、API の処理の段に沿って考えると抜けが減ります。正しい値で期待のステータスと中身が返ることに加え、型違いや範囲外の値で 4xx になり 500 にならないこと、トークンなしで 401、他人のデータの ID で 403 か 404 になることを確かめます。一覧なら 0 件やページの境目、変更なら古い版のアプリが壊れないかも見ます。

ひとことで

何回同じリクエストを送っても、結果が1回分と同じになる性質。注文・支払いの二重処理を防ぐ。

通信が切れて再送されたり、ボタンを二度押したりすると、同じリクエストが2回届きます。何回送っても結果が1回分と同じになる性質を冪等性(べきとうせい)と呼びます。注文・支払いのように二重になると困る処理で、必ず確かめる観点です。

アプリAPIDBPOST /orders(キー K1)注文を保存201 が届く前に通信が切れる再送:POST /orders(キー K1)K1 は処理済み → 同じ結果を返す
冪等キー(Idempotency-Key)による二重送信の防止(例)
試し方確かめること
ボタンを素早く2回押す注文が1件だけ。2回目は無視されるか、同じ結果が返る
同じリクエストを curl で2回送る設計どおり(冪等キーがあれば同じ結果、なければ 409 など)
通信を遅くして、応答の前に再読み込み二重に保存されない
2つのタブから同時に送る在庫が負にならない、ポイントが二重に付かない

どう防ぐかは設計しだい(冪等キー、DB の一意制約、状態の確認)なので、まず開発者に「2回届いたらどうなる設計か」を聞き、その期待結果でテストします。

面接ではこう答える

冪等性は、同じ操作を何回行っても結果が1回分と同じになる性質です。通信の切断による再送や二度押しで同じリクエストが2回届くことがあるので、注文や支払いでは冪等性が欠かせません。テストでは二度押し、同じリクエストの再送、2つのタブからの同時操作を試し、注文が1件だけになるか、在庫やポイントが二重にならないかを確かめます。

5.4契約テスト

用語★★☆ 重要
ひとことで

API を提供する側と使う側の「この形でやり取りする」という約束が守られているかを、自動で確かめるテスト。

契約テスト:使う側の期待を、提供側の CI で確かめる使う側のテスト期待するリクエストと応答契約(pact ファイル)やり取りの約束提供側の CI で検証実際の API に流して比べる作る渡す一致しない → 提供側の変更が使う側を壊すことに、マージ前に気づける全部をつなぐ E2E より速く、どちらが約束を破ったかが分かる
利用者主導の契約テスト(Pact などの考え方)

契約テストは、API を提供する側と使う側が「この形でやり取りする」という約束(契約)を守っているかを確かめるテストです。OpenAPI などで書いた仕様とレスポンスの形が一致するかを自動で検査したり、Pact のような道具で「使う側が期待する形」を契約ファイルにして、提供側の CI で実際の API に流して確かめたりします(利用者主導の契約テスト)。全体をつないだ E2E テストより速く、「項目名を変えたら別のサービスが壊れた」といった不具合を早く見つけられます。

面接ではこう答える

契約テストは、API を提供する側と使う側の、「この形でやり取りする」という約束が守られているかを確かめるテストです。OpenAPI の仕様とレスポンスの形を自動で照らし合わせたり、Pact のような道具で使う側の期待を契約ファイルにして、提供する側の CI で確かめたりします。全体をつないだ E2E テストより速く、項目名を変えたら別のサービスが壊れた、という不具合を早く見つけられます。

5.5DB でデータを確かめる

用語★★☆ 重要
ひとことで

画面の表示だけでなく、DB のデータが正しく変わったかを SQL で確かめる。

画面に「登録しました」と出ても、データが正しく保存されたとは限りません。QA は DB を直接見て、保存された値・件数・関連するデータを確かめられると強いです。必ず検証用の環境で、読み取り専用のアカウントを使います。

テストデータは「準備 → 操作 → 確認 → 片付け」を再現できる形でデータを準備シードで再現できる形に操作する画面・API からDB で確認SELECT・読み取り専用片付けテストごとに独立画面の「登録しました」だけで終わらせず、保存された値・件数・関連テーブル(在庫・履歴)まで見る
テストデータの流れと、DB で確かめる位置

SELECT で確かめる

-- 注文したデータが正しく保存されたか
SELECT id, user_id, status, total, created_at
  FROM orders
 WHERE user_id = 123
 ORDER BY created_at DESC
 LIMIT 5;

-- 明細の合計と注文の合計が一致するか
SELECT o.id, o.total, SUM(i.price * i.quantity) AS items_total
  FROM orders o JOIN order_items i ON i.order_id = o.id
 GROUP BY o.id, o.total
HAVING o.total <> SUM(i.price * i.quantity);

下のラボで、本物の DB を使って SELECT を練習できます。

面接ではこう答える

画面に「登録しました」と出ても、データが正しく保存されたとは限らないので、QA は DB を直接見て確かめます。SELECT で保存された値や件数、関連するテーブルが一緒に更新されたかを見ます。必ず検証用の環境で、読み取り専用のアカウントを使い、本番の個人情報には触れないようにします。

別のページで開く →

DBラボを読み込んでいます…

DB を見るときは、画面ではずれが見えにくい次の観点を意識します。

観点確かめる例
金額・数値端数の切り捨て・四捨五入、税込みと税抜き、0 円
日時タイムゾーン(UTC で保存して日本時間で表示か)、日付が変わる直前・直後
文字文字化け、絵文字、長い名前が途中で切れていないか
削除論理削除(フラグを立てるだけ)か本当の削除か、関連データの扱い
重複・整合二重に登録されていないか、関連するテーブル(在庫・履歴)も更新されたか

特に日時は、保存は UTC、表示は日本時間、という作りが多く、日付が変わる前後(日本時間の 0 時=UTC の 15 時)のデータで集計や表示がずれる不具合がよく見つかります。

5.7テストデータの準備

用語★★☆ 重要
ひとことで

誰がいつ流しても同じ状態から始められるよう、テスト用のデータを仕組みで作り、テストごとに独立させ、後片付けする。

テストの結果がばらつく原因の多くはデータです。誰がいつ流しても同じ状態から始められるように、データの作り方と後片付けを決めておきます。

データを作るシード・API・SQLテストを流すテストごとに専用結果を確かめる画面・API・DB後片付け消す・作り直す誰がいつ流しても同じ状態から始められる
テストデータの準備と後片付けのサイクル
  • 再現できる形で用意する:SQL のスクリプトや API・シードの仕組みで作り、誰がいつ流しても同じ状態にする。手で作ったデータは消えると再現できません。
  • 境界のデータも作る:0 件・1 件・とても多い件数、期限ちょうど、長い名前など。
  • テストごとに独立させる:自動テストでは、テストごとに専用のユーザーやデータを作り、他のテストの結果に左右されないようにする。
  • 本番のデータをそのまま使わない:個人情報が含まれるので、使う場合は匿名化(マスキング)したものにする。

面接ではこう答える

テストデータは、手で作るのではなく、SQL のスクリプトや API、シードの仕組みで、誰がいつ流しても同じ状態を作れるようにします。自動テストでは、テストごとに専用のユーザーやデータを作って、他のテストの結果に左右されないようにします。0 件や上限ちょうどなど境界のデータも用意し、本番のデータを使うなら個人情報を匿名化します。

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • API の処理の段ごとに、通すべきものと止めるべきものを送る
  • 二重送信(冪等性)と契約テスト
  • DB で保存された値を確かめ、テストデータを仕組みで用意する
  • API のテストと道具(curl・Postman):画面を通さずに API を直接テストすると、速く安定する。
  • API のテストの観点:API のテストは、形の検査・認証・権限・処理の段ごとに、通すべきものと止めるべきものを送って確かめる。
  • 二重送信と冪等性のテスト:何回同じリクエストを送っても、結果が1回分と同じになる性質。注文・支払いの二重処理を防ぐ。
  • 契約テスト:API を提供する側と使う側の「この形でやり取りする」という約束が守られているかを、自動で確かめるテスト。
  • DB でデータを確かめる:画面の表示だけでなく、DB のデータが正しく変わったかを SQL で確かめる。
  • テストデータの準備:誰がいつ流しても同じ状態から始められるよう、テスト用のデータを仕組みで作り、テストごとに独立させ、後片付けする。

この章のクイズ

面接ではこう聞かれる

まず答えを見ずに声に出して答え、そのあと開いて比べる。

Q1API のテストでは、どんな観点を確かめますか?

模範回答

大きく、正しい入力、正しくない入力、権限、状態の4つで考えます。正しい入力では、期待どおりのステータス(作成なら 201 など)と、レスポンスの項目・型・値を確かめます。正しくない入力では、必須の項目がない、型が違う、範囲外、とても長い文字列などで、4xx と分かりやすいエラーが返り、500 にならないことを確かめます。

権限では、認証なしで 401、他人のデータの ID に変えると 403 か 404 になることを確かめます。これはセキュリティ上いちばん大事な観点の1つです。状態では、同じリクエストを2回送ったときに二重に登録されないか、削除済みのデータを更新したらどうなるかを見ます。最後に、レスポンスの形が仕様(OpenAPI など)と一致しているかも確かめます。

深掘りされたら

  • 画面のテストではなく API のテストをする利点は何ですか?
  • ページング(何件ずつ返すか)のある API では何を試しますか?

見られているポイント正常・異常・権限・状態の観点と、500 にならないことの重視

Q2テストのために DB を見るとき、気をつけることは何ですか?

模範回答

一番は、本番の DB に書き込まないことです。検証用の環境で、できれば読み取り専用のアカウントを使います。本番を見る必要があるときは、権限と手順を決めた上で SELECT だけにし、件数の多いテーブルでは LIMIT を付け、全件を読むような重い SQL を流さないようにします。

確かめる内容としては、画面に出た値だけでなく、保存された値(時刻のタイムゾーン、金額の端数)、関連するテーブル(在庫や履歴)も更新されたか、二重に登録されていないかを見ます。テストデータは手で作らず、SQL やシードの仕組みで誰でも同じ状態を作れるようにし、個人情報を含む本番のデータはそのまま使いません。

深掘りされたら

  • テストデータを毎回きれいな状態に戻すには、どうしますか?

見られているポイント本番の安全と、DB で確かめる観点・テストデータの扱い

Q3注文が二重に登録される不具合が本番で起きました。再発を防ぐために、どんなテストを足しますか?

模範回答

まず、どの経路で二重になったかを確かめます。二度押しか、通信の切断による再送か、2つのタブからの同時操作かで、足すテストが変わるからです。

そのうえで、API のレベルで同じリクエストを2回送るテスト、同時に送るテストを自動化し、注文が1件だけで在庫や支払いも1回分になることを DB まで確かめます。画面では二度押しを E2E で1本押さえます。あわせて、他の「二重になると困る処理」(支払い・ポイント付与)にも同じ観点のテストがあるかを見直し、テスト観点の一覧に冪等性を加えます。

深掘りされたら

  • 開発側には、どんな仕組みを提案しますか?

見られているポイント原因の経路に合わせたテストと、横展開

Q4自動テストのテストデータは、どう用意しますか?

模範回答

テストごとに、必要なデータを API やデータを作る関数で作り、他のテストと共有しないようにします。共有すると、実行の順番や並列に流したときに結果が変わって、flaky の原因になるからです。

ユーザー名などには一意な値(時刻や乱数を含める)を使い、テストの後で消すか、環境ごと定期的に作り直します。マスターデータのように全員が使う変わらないデータは、シードで最初に入れておきます。本番のデータを使う場合は、個人情報を匿名化したものだけにします。

深掘りされたら

  • 画面からデータを作るのと、API で作るのでは、何が違いますか?

見られているポイントテストの独立と再現性