ステークホルダーの優先度変更がCI/CDパイプラインの検証範囲を曖昧にする──自動テスト戦略の揺らぎ
優先度変更のたびに「何をテストすべきか」が定まらない
アジャイルで進めている案件では、スプリント途中のスコープ変更や優先度の入れ替わりが避けられません。その過程で、「今週中に機能Aをリリースするから、機能Bのテストは次回に回そう」という判断が何度も繰り返されます。
これ自体は悪くない判断なのですが、問題はCI/CDパイプラインの検証範囲が、その都度の優先度判断に左右されてしまうことです。
現場では、こういう流れになりやすいです:
- 機能Aの優先度が上がったので、機能AのE2Eテストだけ走らせる設定に変更する
- 翌週、機能Cが急浮上したので、パイプラインに機能Cのテストを追加する
- 気づくと、機能Bのテストは「いつか走らせる予定」のまま放置されている
- リリース直前に「機能Bは本当に動いているのか?」という不安が生じる
このパターンは特に、スプリント単位でリリースを区切っている場合に顕著です。ステークホルダーの優先度判断は正当なのに、その判断がCI/CDパイプラインの設計に反映されていないために、検証の網目に穴が開いてしまう。
パイプラインの「検証範囲の定義」と「実行スケジュール」を分けて考える
この問題の根本は、「何をテストするべきか」と「今回のスプリントで何をテストするか」を混同していることです。
前者は長期的な品質ポリシーであり、後者は短期的なビジネス優先度です。この二つを同じレイヤーで判断していると、優先度の変更に応じてパイプライン自体が揺らぎます。
現実的な対策は、こう整理することです:
1. 全体的な検証範囲を定義する(変更しない)
- 単体テスト:全モジュール対象
- 統合テスト:コア機能+共通部品が対象
- E2Eテスト:ユーザーフローの主要パターンが対象
- パフォーマンステスト:リリース前月に実施
この定義は、プロジェクト期間中はほぼ固定です。
2. 実行スケジュールを優先度に応じて調整する
- 機能Aが優先ならば、機能Aのテストを毎日実行
- 機能Bは週1回に落とす
- 機能Cは統合テストのみ、E2Eは月1回
# .github/workflows/ci.yml の例(疑似コード)
jobs:
unit-tests:
runs-on: ubuntu-latest
steps:
- run: npm test # 全モジュール、毎コミット実行
feature-a-e2e:
runs-on: ubuntu-latest
if: github.event_name == 'push' # 毎プッシュ
steps:
- run: npm run test:e2e:feature-a
feature-b-e2e:
runs-on: ubuntu-latest
if: github.event.schedule == '0 2 * * 0' # 週1回(日曜2時)
steps:
- run: npm run test:e2e:feature-b
feature-c-integration:
runs-on: ubuntu-latest
if: github.event.schedule == '0 2 1 * *' # 月1回(1日2時)
steps:
- run: npm run test:integration:feature-c
重要なのは、「何をテストするか」の定義は変わらないということです。検証範囲は固定で、実行頻度や実行条件だけを調整します。
「検証範囲の曖昧さ」が招く二つの問題
1. テストの重複と漏れが同時に発生する
優先度に応じてパイプラインを都度変更していると、ある機能は3つのテストで検証されているのに、別の機能は単体テストだけ、という状況になります。これは非効率なだけでなく、本番環境での予期しない障害につながりやすいです。
現場では「前回のスプリントでは動いていたはずなのに」という言い訳が増えます。実際には、その機能のE2Eテストが外されていたのかもしれません。
2. 新しいエンジニアが「何をテストすべきか」を判断できない
チームに新しいメンバーが入ったとき、パイプラインの設定を見ても「なぜこの機能はテストされていないのか」が不明です。優先度判断なのか、技術的な理由なのか、単なる忘れなのかが区別できません。
結果として、新しいメンバーは慎重になり、「念のため全部テストしよう」と判断するか、「前回と同じ範囲でいいだろう」と判断するか、どちらかの極端に振れやすくなります。
検証範囲を明示的に文書化する
実装上の工夫として、検証範囲を明示的に管理することをお勧めします。
# テスト戦略ドキュメント
## 単体テスト
- 対象:全ての新規モジュール、変更があるモジュール
- 実行:毎コミット
- カバレッジ目標:60%以上
## 統合テスト
- 対象:決済機能、ユーザー認証、データベース連携
- 実行:毎日深夜
- 対象環境:ステージング
## E2Eテスト
- 対象:
- ユーザー登録→ログイン→購入完了の主要フロー
- 検索→絞り込み→詳細表示の情報取得フロー
- 実行頻度:
- 主要フロー:毎コミット
- その他フロー:週1回
- 対象環境:ステージング(本番同期)
## パフォーマンステスト
- 対象:決済処理(レスポンス時間 < 2秒)
- 実行:月1回、またはスケーリング変更時
- 対象環境:本番環境相当
## 優先度変更時の判断ルール
- 検証範囲の定義は変更しない
- 実行頻度(毎日 → 週1回など)は変更可
- 新機能追加時は、検証範囲ドキュメントに追記してからパイプライン設定を変更
このドキュメントをプロジェクトリポジトリに置き、スプリント計画時に参照します。優先度が変わっても「検証範囲は変わらない、実行頻度が変わるだけ」という認識が共有できます。
スプリント計画で「テスト実行スケジュール」を明示する
アジャイルのスプリント計画では、機能の優先度だけでなく「今スプリント中にどのテストを何回実行するか」も明示することをお勧めします。
スプリント28(2週間)
- 機能A:開発完了、E2Eテスト毎日実行
- 機能B:開発中、E2Eテストは来週から
- 機能C:保守モード、統合テストのみ週1回
- 機能D(前スプリント):本番稼働中、回帰テストなし
これをスプリントボードに記載することで、ステークホルダーも開発チームも「今週は何が検証されているのか」が一目瞭然になります。
小規模チームで始めやすい実装ステップ
- 現在のパイプライン設定を整理する
- 今、どのテストが走っているか、走っていないか、リストアップ
- 「なぜこのテストは走っていないのか」を確認
- 検証範囲ドキュメントを作る
- 「理想的には何をテストすべきか」を書く
- 技術的な制約や時間的な制限は後で考える
- 実行スケジュールを分離する
- 毎日実行するテスト(ユニットテスト、主要フロー)
- 週1回実行するテスト(その他フロー、統合テスト)
- 月1回実行するテスト(パフォーマンス、全体回帰)
- スプリント計画に組み込む
- 機能の優先度と同時に「このスプリント中のテスト実行スケジュール」も決める
これだけで、優先度の変更に強いCI/CDパイプラインになります。
おわりに
ステークホルダーの優先度判断は尊重すべきものです。ただし、その判断をそのままパイプライン設定に反映させると、長期的には品質の不確実性が高まります。
「検証範囲は固定、実行スケジュールは柔軟」という設計にすることで、ビジネスの優先度変更に対応しながら、検証の網目を保つことができます。