本文へ移動

ホーム / QA / 第3部 テストの自動化

第3部 テストの自動化・第7章

テスト自動化の考え方

★★★ 必須8トピック・面接 5問

テストを自動化して、速く何度でも確かめられる仕組みを作るための考え方を押さえる。E2E と CI はこの後の章で扱う。

7.1テストピラミッド

用語★★★ 必須
ひとことで

単体テストを多く、結合テストを中くらい、E2E は主要な流れだけ、という自動テストの量の配分の目安。

テストピラミッドは、テストの種類ごとの「量の配分」の目安です。下ほど速く安く安定しているので数を多く、上ほど遅く壊れやすいので数を絞ります。

手動E2E結合(API)単体(最も多い)手動・E2E が多いE2E結合単体上ほど遅く壊れやすい下ほど速く安定テストピラミッド(目指す形)アイスクリームコーン型(避けたい形)
テストの量の配分:ピラミッド型とアイスクリームコーン型
層何を確かめるか速さ・安定量の目安
単体テスト関数・クラス1つの動き数ミリ秒。とても安定最も多い
結合(API・コンポーネント)テストDB や他の部品とつないだ動き、API の入出力数十ミリ秒〜数秒中くらい
E2E テストブラウザやアプリで利用者の操作を通しで数秒〜数分。不安定になりやすい主要な流れだけ
手動・探索的テスト見た目・使いやすさ・想定外の使い方人の時間がかかる自動化できない部分に集中

上が太い「アイスクリームコーン型」(E2E と手動ばかり)になると、テストが遅く、壊れやすく、直すのが大変になります。E2E で見つけた不具合は「下の層で見つけられなかったか」を考えます。

面接ではこう答える

テストピラミッドは、自動テストの種類ごとの量の配分の目安です。下の単体テストは速く安定しているので数を多く、真ん中の結合テストは中くらい、上の E2E テストは遅く壊れやすいので主要な流れだけに絞ります。逆に E2E と手動ばかりのアイスクリームコーン型になると、テストが遅く壊れやすくなります。E2E で見つかった不具合は、下の層で見つけられなかったかを考えます。

ひとことで

繰り返す回数が多く、結果がはっきり決まるものから自動化する。作る手間に加えて直し続ける手間も費用に入れる。

自動テストは何でも作ればよいわけではありません。繰り返す回数と作って直し続ける手間を比べて決めます。

実行した回数 →かかった時間 ↑手動自動元が取れる所作る時間
自動化の費用対効果(イメージ):直し続ける手間が大きいと、自動の線の傾きが上がる
向く向かない
何度も繰り返す(毎回のリリースの回帰テスト)1回しか行わない確認
結果がはっきり決まる(金額・ステータス)見た目の自然さ・使いやすさの判断
組み合わせが多い(入力のパターン)仕様がまだよく変わる画面
人がやると間違えやすい・時間がかかる準備に外部の物(実機の決済・メール受信)が要り、作るのが難しい

自動テストは、作る手間に加えて直し続ける手間がかかります。目安として、「手動でかかる時間 × 実行する回数」が「作る時間+直し続ける時間」より大きいなら自動化する価値があります。たとえば手動で 30 分かかる確認を毎週行うなら年に 26 時間ほど(30 分 × 52 週)になり、数時間で作れて安定して動くなら自動化する価値があります。逆に、すぐ壊れて誰も直さないテストは、信頼されず無視されるようになり、ない方がましなこともあります。

判断のこつ:まずリスクの高い主要な流れ(ログイン・購入など)の回帰テストから自動化し、成功率と実行時間を見ながら広げます。

面接ではこう答える

自動化するかどうかは、手動でかかる時間と実行する回数の積と、作る時間に直し続ける時間を足したものを比べて決めます。向いているのは、毎回のリリースの回帰テスト、金額やステータスのように結果がはっきり決まるもの、入力の組み合わせが多いものです。見た目の自然さや、仕様がまだよく変わる画面は向きません。まずリスクの高い主要な流れから自動化し、成功率と実行時間を見ながら広げます。

ひとことで

外部サービスや DB の代わりに差し替える偽物の総称。スタブは決まった値を返し、モックは呼ばれ方を確かめる。

テストする部品が、外部のサービスや DB に頼っていると、テストが遅く不安定になります。そこで、本物の代わりに差し替える偽物を使います。まとめてテストダブル(映画のスタントの代役から)と呼びます。

テストする部品例:注文の処理本物の決済サービス遅い・お金がかかる・不安定テストダブル決まった応答を返す速い・いつも同じ結果失敗の応答も作れる本物の代わりに差し替える
本物の代わりにテストダブルを差し替える
種類役割例
スタブ決まった値を返すだけ決済 API が常に「成功」を返す
モック呼ばれ方(回数・引数)を確かめる注文のあと、メール送信が1回呼ばれたか
フェイク簡単な本物の代わりの実装メモリの中だけで動く DB
スパイ本物を動かしつつ、呼ばれ方を記録するログの出力を記録して確かめる

現場では全部まとめて「モック」と呼ぶことも多いです。注意:モックを使いすぎると、本物との食い違い(API の形が変わった)を見逃します。モックで速く確かめつつ、本物とつなぐ結合テストや契約テストを少し残します。

面接ではこう答える

テストダブルは、テストのときに本物の代わりに差し替える偽物の総称です。スタブは決まった値を返すだけのもので、決済が必ず成功する、のように使います。モックは呼ばれ方、たとえばメール送信が1回呼ばれたかを確かめるものです。テストが速く安定し、失敗の応答も簡単に作れますが、使いすぎると本物との食い違いを見逃すので、結合テストや契約テストと組み合わせます。

ひとことで

テストコードは準備・実行・確認(AAA)の3段で書き、1テスト1観点・独立・結果が毎回同じ、を守る。

テストコードは「読めば何を確かめているか分かる」ことが大事です。基本の形は準備・実行・確認の3段(英語の頭文字で AAA)です。

準備(Arrange)データ・状態を作る実行(Act)確かめたい操作を1つ確認(Assert)期待結果と比べる
テストコードの基本の形(AAA)
test('在庫が 0 の商品はカートに入れられない', async () => {
  // 準備
  const item = await createItem({ stock: 0 });
  // 実行
  const res = await api.post('/cart', { itemId: item.id, quantity: 1 });
  // 確認
  expect(res.status).toBe(409);
});
決まり理由
1つのテストで1つのことを確かめる落ちたとき、テスト名だけで何が壊れたか分かる
名前は「条件と期待」を文で「test1」ではなく「在庫が 0 なら入れられない」
テスト同士を独立させる順番を変えても、並列でも同じ結果になる
結果が毎回同じになる時刻・乱数・外部の状態に左右されないよう固定する
確認を必ず書く確認のないテストは、動いても何も確かめていない

面接ではこう答える

テストコードは、準備、実行、確認の3段で書くのが基本で、英語の頭文字から AAA と呼ばれます。1つのテストでは1つのことを確かめ、名前には「在庫が 0 なら入れられない」のように条件と期待を書きます。テスト同士は独立させて、順番を変えても並列で流しても同じ結果になるようにし、時刻や乱数は固定します。

ひとことで

テストでコードのどれだけが実行されたかの割合。命令網羅(C0)と分岐網羅(C1)がある。高くても十分とは限らない。

カバレッジは、テストを流したときにコードのどれだけが実行されたかの割合です。テストが通っていない場所を見つけるのに役立ちます。

if 会員なら割引する(何もしない)合計を返すはいいいえ会員だけのテスト1本:命令網羅(C0)は 100%、分岐網羅(C1)は 50%(「いいえ」を通っていない)
命令網羅と分岐網羅の違い
種類数え方注意
命令網羅(C0・ステートメント)実行された行(命令)の割合分岐の片側を通らなくても 100% になりうる
分岐網羅(C1・ブランチ)if の「はい」「いいえ」をそれぞれ通った割合C0 より厳しい。条件の組み合わせまでは見ない

カバレッジが高い=よくテストされている、ではありません。確認(assert)の弱いテストでも、コードを通ればカバレッジは上がるからです。数値を目標にしすぎず、「カバレッジが低い所=確実にテストされていない所」を見つける道具として使います。

面接ではこう答える

カバレッジは、テストを流したときにコードのどれだけが実行されたかの割合です。実行された行の割合が命令網羅、C0、if の両側を通ったかの割合が分岐網羅、C1 で、C1 の方が厳しい基準です。ただし、確認の弱いテストでもコードを通ればカバレッジは上がるので、高いから品質が十分とは言えません。テストされていない所を見つける道具として使うのが適切です。

ひとことで

テストのしやすさ。要素の目印、データ作成の API、時刻や外部の差し替え、ログなど、作りの側の工夫で高まる。

テスタビリティは「テストのしやすさ」です。自動テストが作りにくい・不安定になる原因の多くは、テストの側ではなく作りの側にあります。QA が設計の段階で次のような提案をすると、テストが速く安定します。

困りごと作りの側の工夫効果
要素が探しにくいボタンにラベルを付ける、data-testid を付ける画面の変更で壊れにくい
前提のデータを画面から作るのが遅いテスト環境だけで使えるデータ作成の API準備が数秒になる
時刻で結果が変わる「今の時刻」を外から差し替えられるようにする期限切れなどを再現できる
外部サービスに頼る外部への接続先を設定で差し替えられるようにするモックで失敗も試せる
何が起きたか分からない処理ごとのログ、エラーの ID失敗の原因がすぐ分かる

「テストしにくい」と感じたら、テストで無理に頑張る前に、開発者に作りの側の変更を相談します。シフトレフトの具体的な形の1つです。

面接ではこう答える

テスタビリティは、ソフトウェアのテストのしやすさです。自動テストが不安定になる原因の多くは作りの側にあり、ボタンにラベルや data-testid を付ける、テスト用のデータ作成の API を用意する、今の時刻や外部サービスの接続先を差し替えられるようにする、といった工夫で大きく改善します。QA が設計の段階からこれを提案するのが、シフトレフトの具体的な形です。

自動テストは作って終わりではなく、製品と一緒に直し続けるものです。手入れをやめると、落ちたまま放置され、誰も結果を信じなくなります。

習慣具体的に
落ちたらすぐ直す失敗の担当を決める(当番制など)。「赤いまま」にしない
製品の変更と一緒に直す仕様を変えるプルリクエストで、テストの修正も一緒に入れる
重複を減らす同じことを確かめるテストが複数の層にあれば、下の層に寄せる
定期的な棚卸し長く失敗も検出もしていないテスト、遅いテストを見直して消す・軽くする
共通の部品にまとめるログイン・データ作成・Page Object を共通化して、直す場所を1つに

「テストを消す」ことも保守の一部です。価値の低いテストを消して実行時間を短くすると、残りのテストが速く回り、信頼されます。

道具は、製品の言語と、チームがすでに使っているものに合わせて選ぶのが基本です。代表的なものを並べます。

用途代表的な道具メモ
単体・結合(JavaScript・TypeScript)Jest、Vitestフロントエンドや Node.js のアプリ
単体・結合(Python・Java)pytest、JUnitサーバー側のアプリ
Web の E2EPlaywright、Cypress、Selenium新しく始めるなら Playwright・Cypress が多い
APIPostman、REST Assured、各言語の HTTP クライアントコードで書くと CI に入れやすい
モバイルXCUITest、Espresso、Appiumモバイルアプリの章を参照
負荷k6、JMeter、Gatling、Locust性能のテストの章を参照
アクセシビリティaxe(E2E に組み込める)、Lighthouse

道具の名前より、「なぜその道具を選んだか(チームの言語・速さ・並列実行・デバッグのしやすさ)」を説明できることが面接では大事です。

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • テストピラミッドと、何を自動化するかの判断
  • テストダブル・AAA・カバレッジなど、テストコードの基本
  • テストしやすい設計を提案し、自動テストを保守し続ける

この章のクイズ

面接ではこう聞かれる

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

Q1テストピラミッドとは何ですか? なぜその形がよいのですか?

模範回答

テストの種類ごとの量の目安で、下から単体テストを最も多く、その上に結合(API)テスト、いちばん上に E2E テストを少しだけ置く形です。下の層ほど速く、安く、安定していて、失敗したときに原因の場所もすぐ分かります。上の層ほど利用者に近い確かめ方ですが、遅く、壊れやすく、直すのに手間がかかります。

逆に E2E と手動ばかりの「アイスクリームコーン型」になると、テストに時間がかかり、flaky も増えて信頼されなくなります。E2E で不具合が見つかったら「もっと下の層で見つけられなかったか」を考え、入力の組み合わせのような細かい確認は単体や API のテストに移すようにします。

深掘りされたら

  • フロントエンドが中心のアプリでも同じ形がよいと思いますか?

見られているポイント層ごとの速さ・安定・費用の違いと、配分の理由

Q2どのテストを自動化するか、どう決めますか?

模範回答

「何度も繰り返す」「結果がはっきり決まる」「リスクが高い」ものから自動化します。代表は、毎回のリリースで確かめる主要な流れ(ログイン・購入など)の回帰テストや、入力のパターンが多い確認です。逆に、1 回しかしない確認、見た目や使いやすさの判断、仕様がまだよく変わる画面は手動に残します。

判断の目安は費用対効果で、「手動でかかる時間 × 実行する回数」が「作る時間+直し続ける時間」より大きいかです。例えば手動で 30 分かかる確認を毎週行うなら、年に 26 時間ほどになります。作ったあとは成功率と実行時間を見続け、すぐ壊れて誰も直さないテストは、直すか消すかを決めます。

深掘りされたら

  • 自動テストの保守にかかる手間を減らすには、どうしますか?

見られているポイント向く・向かないの基準と、保守まで含めた費用対効果

Q3自動テストの導入や改善で工夫した経験を教えてください。

模範回答

例えば、E2E テストがよく落ちて誰も結果を信じなくなっていたチームなら、まず「再実行で通ったテスト」を一覧にして、flaky なテストの数と原因を見えるようにします。原因の多くが固定の待ち時間とテスト同士のデータの共有だと分かれば、要素の状態を待つ書き方に変え、テストごとに専用のデータを API で作るようにします。

直すまでの間はそのテストを隔離して期限を決め、新しく flaky が出たらすぐ分かるよう、成功率を毎週チームで確認します。結果として、失敗したら本物の不具合だと信じてもらえる状態に戻すことが目標です。実際の面接では、ここに自分の経験と、成功率や実行時間の変化といった数字を入れて話します。

深掘りされたら

  • うまくいかなかったことは何ですか?
  • 開発者にテストを書いてもらうために、何をしましたか?

見られているポイント課題の見える化・原因に合った対策・数字での成果

Q4カバレッジが 100% なら、テストは十分だと言えますか?

模範回答

言えません。カバレッジはコードが実行されたかどうかしか見ないので、確認の弱いテスト、たとえば結果を何も確かめないテストでも 100% になりえます。また、命令網羅が 100% でも、if の片側を通っていないことがありますし、条件の組み合わせや仕様の抜けは測れません。

なので、カバレッジは「低い所はテストされていない」と分かる道具として使い、十分かどうかは、リスクの高い所に境界値などのケースがあるか、本番に流出した不具合の傾向で判断します。数値を目標にしすぎると、意味の薄いテストが増えることも伝えます。

深掘りされたら

  • 命令網羅と分岐網羅の違いは?

見られているポイントカバレッジの限界の理解

Q5モックを使う利点と、使いすぎたときの問題は何ですか?

模範回答

利点は、外部サービスや DB に頼らないのでテストが速く安定することと、タイムアウトやエラーのような本物では起こしにくい状況を簡単に作れることです。

使いすぎると、本物との食い違いを見逃します。たとえば外部の API の項目名が変わっても、モックは古い形のまま成功を返すので、テストは通るのに本番で壊れます。なので、単体テストではモックで速く確かめ、本物とつなぐ結合テストや契約テストを少し残して、食い違いを捕まえるようにします。

深掘りされたら

  • スタブとモックの違いは?

見られているポイントテストダブルの利点と限界、組み合わせ方