本文へ移動

ホーム / QA / 第4部 非機能のテスト

第4部 非機能のテスト・第10章

性能のテスト

★★☆ 重要6トピック・面接 3問

多くの人が使っても速く安定しているかを確かめる方法を押さえる。セキュリティとアクセシビリティは次の章で扱う。

ひとことで

想定のアクセスを再現して、応答時間・エラー率・限界を測る(k6・JMeter など)。

負荷テストは、多くの利用者が同時に使ったときに、速さと安定が目標を満たすか、どこまで耐えられるかを確かめるテストです。k6、JMeter、Gatling、Locust などの道具でリクエストを大量に送ります。

負荷テスト時間 →ストレステスト時間 →耐久テスト時間 →スパイクテスト時間 →
負荷のかけ方の4つの形(縦が負荷の量)

シナリオの作り方

  • 実際の使われ方に合わせる:アクセスのログや分析から、よく使われる操作とその割合を出す(例:一覧を見る 70%・詳細 25%・購入 5%)。1つの API だけを叩き続けると、キャッシュが効いて実際より良い結果になりがちです。
  • 目標の量を決める:普段の最大のアクセス、セールなどの山、その何倍まで耐えるべきか。
  • 種類を使い分ける(下の表)。
  • 本番に近い環境で流す。データ量が少ない環境では、遅い SQL が見つかりません。外部サービス(決済など)はモックにし、本番や他社に負荷をかけないよう事前に合意します。
種類負荷のかけ方分かること
負荷テスト目標の量(普段の最大や山)を一定時間目標の応答時間・エラー率を満たすか
ストレステスト限界を超えるまで少しずつ上げる限界点と、壊れ方(止まるか・遅くなるか・戻るか)
耐久テスト普段くらいの量を数時間〜長時間メモリの漏れ、ディスクやログの増え方、接続の取りこぼし
スパイクテスト短い時間で急に増やすオートスケールが間に合うか、キューやレート制限の動き

面接ではこう答える

負荷テストは、多くの利用者が同時に使ったときに、応答時間とエラー率が目標を満たすか、どこまで耐えられるかを確かめるテストです。目標の量をかける負荷テスト、限界まで上げるストレステスト、長時間かける耐久テスト、急に増やすスパイクテストを使い分けます。シナリオはアクセスのログから実際の操作の割合で作り、本番に近いデータ量の環境で流します。

ひとことで

応答時間は平均ではなく p50・p95・p99 などのパーセンタイルで見る。負荷を上げて応答が急に悪化する所が限界点。

0500100015002000応答時間(ms)同時ユーザー数(負荷)→目標:p99 500ms(例)p50p99限界点エラー率が上がり処理量が伸びなくなるここまでが目標を満たす負荷
負荷と応答時間(形のイメージ):p99 は p50 より早く悪くなる

応答時間は平均ではなくパーセンタイルで見ます。p99 が 800ms なら「100 回に 1 回は 800ms より遅い」という意味で、平均が良くても一部の利用者は待たされていることが分かります。

負荷を少しずつ上げると、ある所から応答時間が急に伸び、エラー率が上がり、処理量(毎秒のリクエスト数)が増えなくなります。そこが限界点です。そのとき CPU・メモリ・DB の接続数・遅い SQL のどれが先に詰まったか(ボトルネック)を、監視の画面と合わせて見ます。

落とし穴:負荷をかける側のマシンが先に限界になっていないか(送る側の CPU)も確認します。

負荷試験とキャパシティ計画(SRE)

レイテンシの見方(パーセンタイルとテール)(SRE)

面接ではこう答える

負荷テストの応答時間は、平均ではなくパーセンタイルで見ます。p99 が 800 ミリ秒なら、100 回に 1 回は 800 ミリ秒より遅いという意味で、平均が良くても一部の利用者が待たされていることが分かります。負荷を少しずつ上げると、ある所から応答時間が急に伸び、エラーが増え、処理量が増えなくなります。そこが限界点で、そのとき何が先に詰まったかを監視の画面と合わせて見ます。

k6 は JavaScript でシナリオを書く負荷テストの道具です。コードで書けるので、レビューや CI への組み込みがしやすいのが特徴です。

2分で100人まで5分間 100人を保つ1分で0へ同時の仮想利用者時間 →
下のスクリプトの負荷のかけ方(stages)
import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '2m', target: 100 },  // 2分で100人まで増やす
    { duration: '5m', target: 100 },  // 5分保つ
    { duration: '1m', target: 0 },    // 1分で0へ
  ],
  thresholds: {
    http_req_duration: ['p(95)<500'],  // 95% が 500ms 未満
    http_req_failed: ['rate<0.01'],    // 失敗が 1% 未満
  },
};

export default function () {
  const res = http.get('https://staging.example.com/api/items');
  check(res, { '200 が返る': (r) => r.status === 200 });
  sleep(1);  // 利用者が考える時間
}
書くときのこつ理由
thresholds に合格の基準を書く満たさなければ失敗として終わるので、CI で合否を判定できる
sleep で利用者の間を入れる入れないと、実際よりはるかに激しい負荷になる
check で中身も確かめる速くてもエラーの画面を返していたら意味がない

負荷テストは、結果が正しく読めるかどうかが準備で決まります。また、他のシステムに迷惑をかけないよう、事前の合意が欠かせません。

準備すること内容しないと起きること
環境本番に近い台数・設定。他のテストと同時に使わない結果が本番と違う。他の人のテストを止める
データ本番に近い件数(匿名化したもの)遅い SQL が見つからない
外部サービス決済・メールなどはモックに他社に負荷をかける・費用が発生する
監視CPU・メモリ・DB・アプリのログを見られるように遅くなっても原因が分からない
合意と連絡日時・量を関係者(SRE・インフラ・クラウドの規約)に伝える攻撃と間違えられる、アラートが鳴る
負荷をかける側送る側のマシンの CPU・回線に余裕送る側が先に限界になり、正しく測れない

結果の報告には、条件(環境・データの量・シナリオ・時間)を必ず書きます。条件がそろっていないと、前回と比べられません。

ひとことで

処理の流れの中で一番詰まっている所。そこが全体の速さを決めるので、限界点で何が先に詰まったかを監視で探す。

ボトルネックは、処理の流れの中で一番詰まっている所です。そこが全体の速さを決めるので、他を速くしても効果がありません。限界点に来たとき、何が先に詰まったかを監視の画面で探します。

ロードバランサーアプリDB の接続DB一番細い所が全体の速さを決める例:アプリの CPU に余裕があるのに遅い → DB の接続の数が足りず待っている
ボトルネックは「一番細い所」
見えること疑う所次に調べること
アプリの CPU が 100% 近いアプリの処理・台数台数を増やすと伸びるか、重い処理はどれか
CPU に余裕があるのに遅い何かを待っている(DB・外部・接続の数)DB の接続の数・ロックの待ち・外部の応答時間
DB の CPU が高い遅い SQL・インデックスの不足スロークエリのログ、実行計画
時間とともにメモリが増え続けるメモリの漏れ耐久テストで、増え方と再起動の要否
一定の数で急にエラー上限の設定(接続の数・レート制限)設定値と、超えたときの動き

QA が原因を直すことは少ないですが、「何人のときに、何がどうなったか」を監視の数字と一緒に報告すると、開発者や SRE がすぐ動けます。

負荷試験とキャパシティ計画(SRE)

面接ではこう答える

ボトルネックは、処理の流れの中で一番詰まっている所で、そこが全体の速さを決めます。負荷テストで限界点に来たら、アプリの CPU、メモリ、DB の接続の数、遅い SQL、外部サービスの応答のどれが先に詰まったかを監視の画面で探します。たとえば CPU に余裕があるのに遅いなら、DB や外部の何かを待っていると考えます。

ひとことで

Web の画面の体感の速さの指標。LCP は表示の速さ、INP は操作への反応の速さ、CLS はレイアウトのずれにくさ。

サーバーが速くても、画面の表示が遅ければ利用者には遅く感じます。Web の画面の体感の速さは、Google が示す Core Web Vitals の3つの指標で見るのが一般的です。

LCP(表示の速さ)一番大きな要素が表示されるまで良い:2.5 秒以下INP(反応の速さ)操作してから画面が反応するまで良い:200 ミリ秒以下CLS(ずれにくさ)読み込み中にレイアウトがずれる量良い:0.1 以下
Core Web Vitals の3つの指標(良いの目安)
測り方道具の例特徴
手元で測る(ラボのデータ)Lighthouse・開発者ツールのパフォーマンス条件をそろえて比べられる。リリース前の確認に
実際の利用者で測る(フィールドのデータ)分析・監視のツール、Chrome の利用者のデータ本当の体感。目安は利用者の 75 パーセンタイルで判定

テストでは、遅い端末と遅い回線(開発者ツールで CPU と通信を遅くする)でも確かめます。速い PC と社内の回線だけで見ていると、利用者の体感とずれます。

面接ではこう答える

Core Web Vitals は、Web の画面の体感の速さを表す3つの指標です。LCP は一番大きな要素が表示されるまでの時間で 2.5 秒以下、INP は操作してから画面が反応するまでの時間で 200 ミリ秒以下、CLS は読み込み中にレイアウトがずれる量で 0.1 以下が良いとされます。Lighthouse などで手元で測るのに加え、実際の利用者のデータも見ます。

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • 負荷テストの種類とシナリオの作り方
  • パーセンタイルと限界点で結果を読み、ボトルネックを探す
  • 画面の体感の速さ(Core Web Vitals)も確かめる

この章のクイズ

面接ではこう聞かれる

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

Q1負荷テストの結果から何を判断しますか?

模範回答

大きく3つを判断します。1つ目は目標を満たしているかです。想定のアクセス量で、p95 や p99 の応答時間とエラー率が SLO や要件の範囲に入っているかを見ます。平均だけでは一部の遅い利用者が見えないので、パーセンタイルで見ます。

2つ目は限界点です。負荷を上げていって、応答時間が急に伸び、エラーが増え、処理量が伸びなくなる点を確かめ、想定の最大アクセスに対してどれだけ余裕があるかを出します。3つ目はボトルネックです。そのとき CPU・メモリ・DB の接続数・遅い SQL のどれが先に詰まったかを監視と合わせて特定し、改善の候補や、サーバーを増やす判断の材料にします。

あわせて、テストの環境やデータ量が本番とどれだけ違うか、負荷をかける側が限界になっていないかも確認し、結果の信頼できる範囲を添えて報告します。

深掘りされたら

  • 平均は良いのに p99 だけ悪いとき、何を疑いますか?
  • 本番と同じ規模の環境が用意できないときはどうしますか?

見られているポイント限界・ボトルネック・SLO との比較

Q2負荷テストのシナリオは、どうやって作りますか?

模範回答

実際の使われ方に合わせて作ります。アクセスのログや分析のデータから、よく使われる操作とその割合(例:一覧 70%・詳細 25%・購入 5%)を出し、利用者の流れとして並べます。1 つの API だけを叩き続けると、キャッシュが効いて実際より良い結果が出やすいので避けます。

量は、普段の最大のアクセスと、セールなどの山を元に目標を決め、その何倍まで確かめるかを決めます。環境は本番に近いデータ量で用意し、データが少ないと遅い SQL が見つかりません。外部の決済などはモックにして、他社や本番に負荷をかけないよう事前に関係者と合意します。結果を見るときは、負荷をかける側のマシンが先に限界になっていないかも確かめます。

深掘りされたら

  • ログイン後の操作を大量に流すとき、アカウントやデータはどう用意しますか?

見られているポイント実際の使われ方に合わせることと、環境・データ・外部への配慮

Q3「画面が重い」と言われました。何をどう測りますか?

模範回答

まず「重い」が、開くまでが遅いのか、操作への反応が遅いのか、表示がずれるのかを聞き分けます。それぞれ Core Web Vitals の LCP、INP、CLS に当たります。

次に、開発者ツールのネットワークタブで、遅い API がないか、大きな画像や JavaScript を読んでいないかを見ます。API が速いのに遅ければ、画面の側の処理を疑い、パフォーマンスのタブや Lighthouse で測ります。速い PC だけでなく、CPU と回線を遅くした条件でも測り、数字と条件を添えて報告します。

深掘りされたら

  • 手元の測定と、実際の利用者の数字が違うのはなぜですか?

見られているポイント体感の分解と、サーバー側と画面側の切り分け