本文へ移動

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

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

CI でのテスト

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

自動テストを CI に組み込み、速く・信頼される形で回すための設計を押さえる。

9.1CI でのテストの段階

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

push のたびに自動でテストし、失敗したら止める。速さと並列化が大事。

自動テストは、CI(コードを push するたびに自動でビルドとテストを流す仕組み)で動かしてはじめて効果が出ます。プルリクエストごとに流し、失敗したらマージできないようにするのが基本です。

速いテストを先に、遅い E2E は分割して並列にpush型チェック・lint単体テスト数分で失敗を知らせるE2E 1/4E2E 2/4E2E 3/4E2E 4/4レポートを1つに統合マージの可否例:直列で 40 分かかる E2E を 4 つに分けると、10 分ほどに近づく
CI でのテストの段階と、E2E の分割(シャード)による並列化
いつ流すテストねらい
push・プルリクエストごと型チェック・lint・単体・結合、主要な流れの E2E数分〜十数分で、マージしてよいかを判断する
本流のブランチに入ったときE2E の全部、検証環境へのデプロイ後のスモークテストつないだ状態で壊れていないか
夜間・定期時間のかかる E2E、いろいろなブラウザ・端末、負荷テストの一部毎回は流せない広い範囲を確かめる
  • 段階に分ける:速いテスト(単体・型チェック)を先に流し、失敗したらすぐ知らせる。遅い E2E はその後、または主要なものだけをプルリクエストで、全部は夜間やリリース前に。

目安として、プルリクエストのテストが 10 分を大きく超えると、待ち時間が開発の邪魔になり始めることが多いです。

面接ではこう答える

CI は、コードを push するたびに自動でビルドとテストを流す仕組みです。プルリクエストごとに型チェック・単体・結合と主要な E2E を流し、失敗したらマージできないようにします。速いテストを先に流してすぐ知らせ、時間のかかる E2E の全部やいろいろなブラウザのテストは、本流に入ったときや夜間に流す、と段階に分けます。

ひとことで

テストを複数のプロセスやマシンに分けて同時に流し、CI を速くする。テストが互いに独立していることが前提。

テストが増えて CI が遅くなったら、まず並列化を考えます。1台の中で複数のプロセスで流す方法と、複数のマシンに分割(シャード)して同時に流す方法があります。

分けないと:200 本を1台で 40 分4つに分割(シャード):各 50 本を同時に、約 10 分+準備マシン 1(--shard=1/4)マシン 2(--shard=2/4)マシン 3(--shard=3/4)マシン 4(--shard=4/4)→ 最後にレポートを1つにまとめる
テストの分割(シャード)による並列化(例)
  • 並列化:テストを複数のマシンやプロセスに分けて同時に流す(Playwright では npx playwright test --shard=1/4 のように何番目かを指定して分割し、1台の中の並列数は workers で指定。分けたレポートは最後に1つにまとめる)。並列にすると、テスト同士がデータを共有していると壊れるので、テストの独立が前提です。
  • 変更に関係するテストだけ流す仕組みもありますが、取りこぼしに注意し、全体も定期的に流します。
速くする手段効き方
並列化・分割マシンを増やすほど速い(準備の時間は減らない)
前提を API で作る・ログイン状態の使い回し1本あたりの時間が減る
下の層へ移すE2E の細かい確認を API や単体のテストへ
変更に関係するテストだけ流す速いが取りこぼしに注意。全体も定期的に

面接ではこう答える

並列化は、テストを複数のプロセスやマシンに分けて同時に流し、待ち時間を短くすることです。Playwright なら1台の中の並列数を workers で、マシンへの分割を --shard=1/4 のように指定し、最後にレポートをまとめます。前提として、テストがデータを共有せず独立している必要があります。あわせて、前提を API で作る、細かい確認を下の層へ移す、で1本あたりの時間も減らします。

ひとことで

ブランチの保護の設定で、決めたチェックが通らないとマージできないようにする仕組み。安定して速いチェックだけを必須にする。

テストを流しても、失敗したままマージできてしまっては意味がありません。リポジトリのブランチの保護の設定で、「このチェックが通らないとマージできない」という条件(品質のゲート)を決めます。

プルリクエスト変更を出す必須のチェックテストが全部通るレビュー承認が1人以上などマージ本流に入る必須のチェックが失敗していると、マージのボタンが押せない(ブランチの保護)
マージの条件(品質のゲート)
ゲートの例注意
型チェック・lint・単体・結合テストが通る必須にするのは安定したテストだけ。flaky を必須にすると皆が困る
主要な E2E が通る時間がかかるなら一部だけ必須に
カバレッジが下がっていない数値の目標にしすぎない
依存ライブラリの脆弱性の検査重大なものだけ止める

ゲートを増やしすぎると、待ち時間が延びて「急ぎなので外して」と言われがちです。少なく・速く・必ず守るゲートにするのがこつです。

面接ではこう答える

品質のゲートは、リポジトリのブランチの保護の設定で、テストなどのチェックが通らないとマージできないようにする仕組みです。型チェック、単体と結合のテスト、主要な E2E などを必須のチェックにします。flaky なテストを必須にすると皆の作業が止まるので、安定して速いものだけを必須にし、少なく速く必ず守るゲートにします。

  • 失敗したテストの名前・エラー・スクリーンショットやトレースを、CI の結果から1クリックで見られるようにする(HTML のレポートを成果物として保存する)。
  • テストごとの成功率と実行時間の推移を記録し、flaky なテストや遅くなったテストを見つける。
  • 失敗をチャットに通知する。ただし通知が多すぎると見られなくなるので、本流のブランチの失敗に絞るなど工夫する。
残すもの使い道
HTML のレポートどのテストが失敗したかを一覧で見る
スクリーンショット・動画・トレース失敗した瞬間の画面と操作を再生して原因を探す
テストごとの成功率と時間の推移flaky と、遅くなったテストを見つける
ひとことで

デプロイ直後に、主要な機能がそもそも動くかを数分で確かめるテスト。本番ではテスト用のアカウントで行う。

検証環境や本番にデプロイした直後に、主要な機能がそもそも動くかを短時間で確かめるのがスモークテストです(機械に電気を通して煙が出ないかを見る、が名前の由来)。

デプロイスモークテスト合格なら公開を続ける失敗なら切り戻す
デプロイ後のスモークテスト
決めること例
範囲トップ表示・ログイン・検索・購入の手前まで(数分で終わる量)
本番での注意本当に注文しない。テスト用のアカウント・テスト用の商品を使う
失敗したとき自動で知らせる。切り戻すかの判断を誰がするか
定期的な実行同じテストを数分おきに本番で流すと、外からの監視(合成監視)にもなる

面接ではこう答える

スモークテストは、デプロイした直後に、ログインや検索のような主要な機能がそもそも動くかを短時間で確かめるテストです。CI からデプロイのあとに自動で流し、失敗したら知らせて切り戻しを判断します。本番で流すときは本当に注文しないよう、テスト用のアカウントや商品を使います。同じテストを定期的に流せば、外からの監視にもなります。

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • 速いテストから段階に分けて流し、すぐ知らせる
  • 並列化と分割で待ち時間を減らす
  • マージの条件(ゲート)とデプロイ後のスモークテスト
  • CI でのテストの段階:push のたびに自動でテストし、失敗したら止める。速さと並列化が大事。
  • 並列化と分割(シャード):テストを複数のプロセスやマシンに分けて同時に流し、CI を速くする。テストが互いに独立していることが前提。
  • マージの条件(品質のゲート):ブランチの保護の設定で、決めたチェックが通らないとマージできないようにする仕組み。安定して速いチェックだけを必須にする。
  • デプロイ後のスモークテスト:デプロイ直後に、主要な機能がそもそも動くかを数分で確かめるテスト。本番ではテスト用のアカウントで行う。

この章のクイズ

面接ではこう聞かれる

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

Q1E2E テストが遅くて CI に 1 時間かかります。どう改善しますか?

模範回答

まず、どのテストが時間を使っているかを測ります。そのうえで、3つの方向で考えます。1つ目は並列化で、テストを複数のマシンに分けて同時に流します(Playwright なら --shard で分割)。そのためにはテスト同士がデータを共有せず独立している必要があります。

2つ目はテスト自体を速くすることで、ログインや前提のデータの準備を毎回画面で行わず API で済ませる、固定の待ち時間(sleep)をなくす、などです。3つ目は流す範囲を分けることで、プルリクエストでは主要な流れだけ、全部は本流に入ったときや夜間に流します。入力のパターンの確認のように E2E でなくてよいものは、API や単体のテストに移します。

深掘りされたら

  • 並列化したら、かえって失敗が増えました。何を疑いますか?

見られているポイント計測→並列化・準備の高速化・範囲の分割・下の層への移動

Q2ローカルでは通るテストが、CI でだけ落ちます。どう調べますか?

模範回答

CI とローカルの違いを1つずつ疑います。まず CI のレポートのスクリーンショットやトレースで、どの操作で何が起きたかを見ます。そのうえで、CI のマシンが遅いことによる待ち方の問題、並列で流したときのデータの共有、タイムゾーンや言語の設定、ブラウザやフォントの版、環境変数や秘密の値の違い、を確かめます。

CI と同じコンテナをローカルで動かす、CI と同じ並列数で流す、と再現に近づけます。毎回落ちるのか、たまに落ちるのか(flaky か)も、過去の実行の記録から確かめます。

深掘りされたら

  • タイムゾーンが原因だったら、どう直しますか?

見られているポイント環境の差を順に疑う切り分け

Q3テストが失敗しているのにマージされてしまうことがあります。どうしますか?

模範回答

まず、なぜマージされたかを確かめます。必須のチェックに入っていない、flaky が多くて「どうせまた落ちた」と思われている、急ぎで設定を外した、などが考えられます。

そのうえで、ブランチの保護で必須のチェックを設定し、失敗したらマージできないようにします。ただし必須にするのは安定したテストだけにし、flaky なものは隔離して直すまで外します。テストが信頼されれば、皆が失敗を本物の問題として扱うようになります。チームの合意をとってから設定を変えます。

深掘りされたら

  • 緊急の修正で、テストを待てないと言われたら?

見られているポイント仕組み(ゲート)と信頼(flaky 対策)の両面