- マネジメント
テスト進捗管理表テンプレート|消化率の計算とバグ曲線の読み方
テスト進捗管理表とは、テストの消化数・合格数・バグの検出数と解決数を1日1行で累計し、「予定どおりに終わるか」を毎日同じ数字で判断するための表です。消化率だけを追っていると、不合格で残ったケースや直っていないバグが見えず、終盤になって残り作業の多さに気づくことになります。
この記事では、貼り付けて使える管理表のテンプレートと記入例、各指標の式と数値入りの計算例、バグ曲線の4パターンの読み方、週次の進捗報告の文例までを1ページにまとめました。例は架空の「備品予約システム」の結合テスト(全240ケース、12営業日)です。
確認環境:Ubuntu 24.04、Python 3.11.15(標準ライブラリのみ)。掲載した計算結果と判定結果は、すべて2026-10-05に実行した出力です。
この記事の結論
- 消化率だけでは進捗は分かりません。消化率・合格率・未解決バグ数の3つを日次で並べて初めて、終わりが読めます。
- 「終わり」の予測は、消化ではなく合格の累計で行います。今回の例では、消化で見ると1日の遅れ、合格で見ると2日の遅れでした。
- バグ曲線は、検出の累計と解決の累計を2本重ねて読みます。2本の間隔が未解決バグ数です。
- 報告は「数字 → 読み取り → 打つ手 → 判断してほしいこと」の順に書くと、読み手がすぐ動けます。
テスト進捗管理の早見表
| 知りたいこと | 答え |
|---|---|
| 管理表に持つ列 | 日付、予定消化累計、消化累計、合格累計、検出バグ累計、解決バグ累計の6列(すべて累計) |
| 消化率 | 消化累計 ÷ 総ケース数 |
| 合格率 | 合格累計 ÷ 消化累計 |
| 進捗率(この記事での定義) | 合格累計 ÷ 総ケース数(= 消化率 × 合格率) |
| 未解決バグ数 | 検出バグ累計 − 解決バグ累計 |
| バグ検出密度 | 検出バグ累計 ÷ 消化累計 × 100(100ケースあたりの件数) |
| 残り日数の予測 | (総ケース数 − 合格累計)÷ 直近3日の合格ペース を切り上げ |
| 毎日見る3つ | 消化率(予定との差)、合格率、未解決バグ数 |
| バグ曲線の4パターン | 収束型・発散型・停滞型・階段型 |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「テスト進捗管理表テンプレート|消化率の計算とバグ曲線の読み方」
日次のテスト進捗管理表(テンプレートと記入例)
列の定義
| 列 | 入れる値 | 数え方の決まり |
|---|---|---|
| 日付 | テストを行った営業日 | 休みの日は行を作らない |
| 予定消化累計 | その日までに消化する予定のケース数 | テスト開始前に全日分を入れておき、途中で書き換えない |
| 消化累計 | 結果(合格・不合格・保留)を記録したケース数 | 着手しただけのケースは含めない |
| 合格累計 | 期待どおりの結果になったケース数 | 再テストで合格したら、その日に加える |
| 検出バグ累計 | 起票したバグの件数 | 重複・仕様どおりと分かったものは除く |
| 解決バグ累計 | 修正後の再テストで合格し、閉じたバグの件数 | 修正しただけの段階では数えない |
「累計」で持つのは、グラフにしたときにそのままバグ曲線になり、入力もれの日があっても翌日の数字で追いつけるためです。日ごとの増分は、前日との差で求められます。
見出し行だけのテンプレート(タブ区切り)
日付 予定消化累計 消化累計 合格累計 検出バグ累計 解決バグ累計
記入例(8日目まで)
| 日付 | 予定消化累計 | 消化累計 | 合格累計 | 検出バグ累計 | 解決バグ累計 |
|---|---|---|---|---|---|
| 2026-09-14 | 20 | 15 | 12 | 4 | 0 |
| 2026-09-15 | 40 | 33 | 27 | 9 | 3 |
| 2026-09-16 | 60 | 52 | 44 | 13 | 6 |
| 2026-09-17 | 80 | 70 | 60 | 17 | 10 |
| 2026-09-18 | 100 | 90 | 78 | 20 | 13 |
| 2026-09-24 | 120 | 112 | 98 | 22 | 17 |
| 2026-09-25 | 140 | 133 | 118 | 24 | 20 |
| 2026-09-28 | 160 | 152 | 136 | 25 | 22 |
9月21日〜23日は休みのため行がありません。同じ内容のタブ区切り版です。表計算ソフトの A1 セルに貼り付けられます。
日付 予定消化累計 消化累計 合格累計 検出バグ累計 解決バグ累計
2026-09-14 20 15 12 4 0
2026-09-15 40 33 27 9 3
2026-09-16 60 52 44 13 6
2026-09-17 80 70 60 17 10
2026-09-18 100 90 78 20 13
2026-09-24 120 112 98 22 17
2026-09-25 140 133 118 24 20
2026-09-28 160 152 136 25 22
消化率・合格率・進捗率・バグ検出密度の計算
8日目(2026-09-28)の行を使って、手で計算します。総ケース数は240です。
| 指標 | 式 | 数値を入れた計算 | 結果 |
|---|---|---|---|
| 消化率 | 消化累計 ÷ 総ケース数 | 152 ÷ 240 | 63.3% |
| 予定との差 | 消化累計 − 予定消化累計 | 152 − 160 | −8件 |
| 合格率 | 合格累計 ÷ 消化累計 | 136 ÷ 152 | 89.5% |
| 進捗率 | 合格累計 ÷ 総ケース数 | 136 ÷ 240 | 56.7% |
| 未解決バグ数 | 検出バグ累計 − 解決バグ累計 | 25 − 22 | 3件 |
| バグ検出密度 | 検出バグ累計 ÷ 消化累計 × 100 | 25 ÷ 152 × 100 | 16.4件/100ケース |
消化率63.3%と進捗率56.7%の差(6.6ポイント)が、「実行はしたが、まだ合格していない16ケース」です。この16ケースはバグの修正を待って再テストするため、消化率が100%になった後にも作業が残ります。
Pythonで全日分を検算する
上のタブ区切りを progress.tsv として保存し、次のスクリプトを同じフォルダで実行します。
import csv
import math
TOTAL = 240 # テストケースの総数
PLAN_DAYS = 12 # テスト期間(営業日)
WINDOW = 3 # 直近何日のペースで予測するか
with open("progress.tsv", encoding="utf-8", newline="") as f:
rows = list(csv.DictReader(f, delimiter="\t"))
for r in rows:
for k in r:
if k != "日付":
r[k] = int(r[k])
print("日付 消化率 予定比 合格率 進捗率 未解決 検出密度")
for r in rows:
run, ok = r["消化累計"], r["合格累計"]
print(f'{r["日付"]} {run / TOTAL:6.1%} {run - r["予定消化累計"]:+5d} '
f'{ok / run:6.1%} {ok / TOTAL:6.1%} '
f'{r["検出バグ累計"] - r["解決バグ累計"]:5d} '
f'{r["検出バグ累計"] / run * 100:7.1f}')
last, base = rows[-1], rows[-1 - WINDOW]
day_no = len(rows)
left_days = PLAN_DAYS - day_no
def forecast(label, key):
pace = (last[key] - base[key]) / WINDOW
need = math.ceil((TOTAL - last[key]) / pace)
print(f"{label}: 残り{TOTAL - last[key]}件 / 直近{WINDOW}日の平均 {pace:.1f}件/日 "
f"= あと{need}日(期間の残り{left_days}日、差 {need - left_days:+d}日)")
print()
print(f"{day_no}日目の時点(全{PLAN_DAYS}日)")
forecast("消化で見た予測", "消化累計")
forecast("合格で見た予測", "合格累計")
need_pace = (TOTAL - last["合格累計"]) / left_days
print(f"期間内に終えるのに必要な合格ペース: {need_pace:.1f}件/日")
実行結果です。
日付 消化率 予定比 合格率 進捗率 未解決 検出密度
2026-09-14 6.2% -5 80.0% 5.0% 4 26.7
2026-09-15 13.8% -7 81.8% 11.2% 6 27.3
2026-09-16 21.7% -8 84.6% 18.3% 7 25.0
2026-09-17 29.2% -10 85.7% 25.0% 7 24.3
2026-09-18 37.5% -10 86.7% 32.5% 7 22.2
2026-09-24 46.7% -8 87.5% 40.8% 5 19.6
2026-09-25 55.4% -7 88.7% 49.2% 4 18.0
2026-09-28 63.3% -8 89.5% 56.7% 3 16.4
8日目の時点(全12日)
消化で見た予測: 残り88件 / 直近3日の平均 20.7件/日 = あと5日(期間の残り4日、差 +1日)
合格で見た予測: 残り104件 / 直近3日の平均 19.3件/日 = あと6日(期間の残り4日、差 +2日)
期間内に終えるのに必要な合格ペース: 26.0件/日
計算結果の読み方
- 消化率:予定との差は−5件から−10件まで開いたあと、−8件前後で止まっています。遅れは広がっていません。
- 合格率:80.0%から89.5%へ毎日上がっています。修正と再テストが回っている形です。
- 未解決バグ数:7件を頂点に3件まで減りました。
- バグ検出密度:26.7から16.4へ下がっています。テストが進むほど新しいバグが出にくくなっている形です。
- 残り日数:消化で見るとあと5日、合格で見るとあと6日です。期間の残りは4日なので、合格で見ると2日分の差があります。期間内に終えるには、合格ペースを1日19.3件から26.0件へ上げる必要があります。
3つの指標はどれも良い方向に動いているのに、残り日数は足りない、というのがこの例の状態です。消化率の予定との差(−8件)だけを見ていると「半日ほどの遅れ」に見えますが、合格の累計で予測すると2日の差になります。
消化率・合格率・進捗率の違い
| 指標 | 分子 ÷ 分母 | 分かること | これだけ見ていると見えないこと |
|---|---|---|---|
| 消化率 | 消化累計 ÷ 総ケース数 | テストを実行する作業がどこまで進んだか | 不合格で残っているケースの量 |
| 合格率 | 合格累計 ÷ 消化累計 | 実行したもののうち、どれだけ期待どおりか | 全体のうちどこまで終わったか |
| 進捗率 | 合格累計 ÷ 総ケース数 | 「終わった」と言える量がどこまで来たか | 遅れの原因が実行側か修正側か |
進捗率という語は、消化率と同じ意味で使われることもあります。報告書の最初に「進捗率=合格累計÷総ケース数」のように式を1行書いておくと、読み手との食い違いを防げます。
3つの組み合わせで、次に見る場所が決まります。
| 消化率(予定との差) | 合格率 | 未解決バグ数 | 状態の読み取り | 次に見る場所 |
|---|---|---|---|---|
| 予定どおり | 高い | 減っている | 順調 | 残りケースの難しさの偏り |
| 予定どおり | 低い | 増えている | 実行は進むが品質が追いついていない | バグの原因の偏り、修正の体制 |
| 遅れている | 高い | 少ない | 実行する手が足りない、または環境待ち | 担当の割り当て、環境とデータの準備 |
| 遅れている | 低い | 増えている | バグでテストが止まっている | 止めているバグの優先度、前工程への戻し |
| 予定より早い | 高い | ほぼ0 | 順調、またはテストが浅い | 検出密度が想定より低すぎないか |
バグ曲線の4パターンと次に打つ手
バグ曲線は、横軸を日付、縦軸を件数にして、検出バグ累計と解決バグ累計の2本を描いたグラフです。管理表の2列をそのまま折れ線にすれば描けます。
早見表
| パターン | 検出累計の形 | 解決累計との間隔 | 読み取り | 次に打つ手 |
|---|---|---|---|---|
| 収束型 | 後半に向けて傾きが緩やかになる | 狭まっていく | 新しいバグが出にくくなっている | 残りケースが難しい機能に偏っていないかを確かめ、終了条件の確認へ進む |
| 発散型 | 後半も傾きが変わらない、または急になる | 広がっていく | 検出に修正が追いついていない。品質が安定する前の状態 | バグを原因別に集計し、多い機能は前工程の成果物を見直す。修正の担当を厚くする |
| 停滞型 | 途中から横ばい | 変わらない | バグが出ないのではなく、テストが進んでいない | 消化累計の伸びを確かめ、テストを止めているバグや環境の準備を先に片付ける |
| 階段型 | 横ばいと急な上昇を繰り返す | 上昇のたびに広がり、その後狭まる | 起票がまとめて行われている、または機能ごとに着手している | 起票を当日中に行う決まりにする。機能単位の着手なら、段ごとに収束しているかを見る |
横ばいは「収束」と「停滞」のどちらにも見えます。見分けるには、同じ期間の消化累計が伸びているかを確かめます。消化が進んでいて検出が横ばいなら収束、消化も止まっていれば停滞です。
4パターンを数字で見分ける
検出累計・解決累計・消化累計の3つがあれば、型の当たりを付けられます。8日分の数字を前半と後半に分け、次の順に確かめる簡単な判定です(しきい値は例です)。
- 後半の消化が前半の半分に満たない → 停滞型
- 検出が0件の日が半分以上あり、1日で5件以上増えた日がある → 階段型
- 後半の検出が前半以上で、未解決が増えている → 発散型
- 後半の検出が前半より少なく、未解決が増えていない → 収束型
# 日ごとの「検出バグ累計」「解決バグ累計」「消化累計」から曲線の型を判定する
SAMPLES = {
"A": dict(found=[4, 9, 13, 17, 20, 22, 24, 25],
fixed=[0, 3, 6, 10, 13, 17, 20, 22],
run=[15, 33, 52, 70, 90, 112, 133, 152]),
"B": dict(found=[3, 7, 12, 18, 25, 33, 42, 52],
fixed=[0, 2, 5, 8, 12, 15, 19, 22],
run=[15, 33, 52, 70, 90, 112, 133, 152]),
"C": dict(found=[4, 9, 13, 16, 17, 17, 17, 17],
fixed=[0, 3, 6, 9, 10, 10, 10, 10],
run=[15, 33, 52, 70, 78, 80, 81, 81]),
"D": dict(found=[0, 0, 8, 8, 8, 17, 17, 17],
fixed=[0, 0, 2, 5, 7, 8, 12, 15],
run=[15, 33, 52, 70, 90, 112, 133, 152]),
}
def diffs(xs):
return [b - a for a, b in zip([0] + xs[:-1], xs)]
def judge(found, fixed, run):
d_found, d_run = diffs(found), diffs(run)
half = len(found) // 2
first, second = sum(d_found[:half]), sum(d_found[half:])
open_now = found[-1] - fixed[-1]
open_mid = found[half - 1] - fixed[half - 1]
zero_days = sum(1 for d in d_found if d == 0)
run_first, run_second = sum(d_run[:half]), sum(d_run[half:])
if run_second < run_first * 0.5:
return "停滞型"
if zero_days >= len(found) // 2 and max(d_found) >= 5:
return "階段型"
if second >= first and open_now > open_mid:
return "発散型"
if second < first and open_now <= open_mid:
return "収束型"
return "判定保留(人が確認)"
print("例 前半検出 後半検出 未解決(中間→現在) 後半の消化 判定")
for name, s in SAMPLES.items():
d = diffs(s["found"])
half = len(d) // 2
print(f'{name} {sum(d[:half]):7d} {sum(d[half:]):8d} '
f'{s["found"][half-1]-s["fixed"][half-1]:8d} → {s["found"][-1]-s["fixed"][-1]:<6d} '
f'{sum(diffs(s["run"])[half:]):9d} {judge(**s)}')
実行結果です。例Aは、先ほどの管理表と同じ数字です。
例 前半検出 後半検出 未解決(中間→現在) 後半の消化 判定
A 17 8 7 → 3 82 収束型
B 18 34 10 → 30 82 発散型
C 16 1 7 → 7 11 停滞型
D 8 9 3 → 2 82 階段型
例Cは未解決が7件のまま動かず、後半の消化が11ケースしかありません。検出累計のグラフだけを見ると収束型とよく似ていますが、消化累計を並べると停滞型と分かります。例Dは前半と後半の検出がほぼ同じ(8件と9件)で、検出0件の日が8日のうち6日あります。
バグ曲線とバーンダウンのどちらを使うか
| 比べる点 | バグ曲線 | バーンダウンチャート |
|---|---|---|
| 縦軸 | バグの累計件数(検出と解決) | 残りの作業量(残りケース数など) |
| 線の向き | 右上がりで、次第に寝ていく | 右下がりで、0に近づく |
| 分かること | 品質が落ち着いてきたか | 期限までに作業が終わるか |
| 向いている場面 | テスト工程の中盤〜終盤、終了の判断 | テストの実行期間全体、日々の遅れの把握 |
| 条件 | 選ぶもの |
|---|---|
| 「期限までにテストを実行し終えるか」を知りたい | バーンダウン(残り未合格ケース数を縦軸にする) |
| 「バグが出尽くしてきたか」を知りたい | バグ曲線 |
| テストを終えてよいかを判断したい | 両方(残り0に近づき、かつバグ曲線が収束型) |
| グラフを1枚だけにしたい | 管理表の3指標(消化率・合格率・未解決バグ数)を数字のまま並べる |
週次の進捗報告の文例
報告は、数字 → 読み取り → 打つ手 → 判断してほしいことの順に書きます。先ほどの8日目の数字を使った文例です。
件名:【備品予約システム】結合テスト進捗報告(9/28時点)
1. 結論
合格ベースで2日分の遅れがあります。対策を2点行い、
10/2(金)の完了予定を維持する見込みです。
2. 数字(9/28終了時点、全240ケース・12営業日のうち8日目)
・消化率 63.3%(152/240) 予定160に対し −8件
・合格率 89.5%(136/152) 前週末 86.7% から上昇
・進捗率 56.7%(136/240) ※進捗率=合格累計÷総ケース数
・バグ 検出25件/解決22件/未解決3件(前週末は7件)
3. 読み取り
・消化の遅れは −8件前後で広がっていません。
・合格率は毎日上がり、未解決バグも減っており、バグ曲線は収束型です。
・ただし直近3日の合格ペース(19.3件/日)のままでは、
残り104件にあと6日かかり、残り4日に対して2日不足します。
4. 打つ手
・9/29から再テスト担当を1名追加し、合格していない16件の再テストを先に進めます。
・未解決3件のうち、予約取消のテスト12ケースを止めている1件を最優先で修正します。
5. 判断をお願いしたいこと
・10/1(木)時点で合格累計が214件に届かない場合、
完了日を10/6(火)に変更する案をご相談します。
「214件」は、必要な合格ペース26.0件/日を3日続けた値(136 + 26 × 3)です。判断の基準を数字と日付で先に書いておくと、次の報告で「届いた/届かなかった」をそのまま伝えられます。
状況別の言い回し
| 状況 | 書き方の例 |
|---|---|
| 順調 | 消化率・合格率とも予定どおりで、未解決バグは2件です。予定どおり10/2に完了する見込みです。 |
| 消化が遅れている | 消化率が予定より8件少ない状態です。原因はテストデータの準備待ちで、9/29に解消します。 |
| 合格率が低い | 合格率が72%で、前週から横ばいです。不合格の6割が検索機能に集まっているため、検索の設計書を見直します。 |
| バグが発散している | 検出が1日8件前後で続き、未解決が30件に増えています。原因別の集計を9/30に共有し、進め方をご相談します。 |
| テストが止まっている | 予約登録のバグ1件で40ケースが実行できない状態です。修正は9/29の午前に完了予定で、午後から再開します。 |
確かめて分かったこと
- 同じ表でも、消化で予測するとあと5日、合格で予測するとあと6日になりました。残り日数は合格の累計で出すほうが、実際に残っている作業に近い値になります。
- 消化率×合格率は進捗率に一致します(63.3% × 89.5% = 56.7%)。3つのうち2つを報告すれば、残りの1つは読み手が自分で確かめられます。
- 検出累計が横ばいの2つの例(AとC)は、消化累計を足して初めて区別できました。バグ曲線だけを報告に貼るときは、消化率を必ず添えます。
- バグ検出密度は、未解決バグ数より早く変化を示しました。例では未解決が減り始める6日目より前の、3日目から密度が下がり始めています。
- 階段型は、前半と後半の検出数を比べるだけでは発散型と区別できませんでした(例Dは8件と9件)。検出0件の日数を数える条件を足して区別しています。
つまずきやすい点と直し方
| つまずき | こうなる | 直し方 |
|---|---|---|
| 着手したケースを消化に数える | 消化率が先に進み、合格率が後から急に下がる | 結果を記録したケースだけを消化に数える |
| 予定の列を途中で書き換える | 遅れが表から消える | 予定は当初のまま残し、見直した計画は別の列に持つ |
| 修正済みを解決に数える | 未解決が少なく見え、再テストの量が読めない | 再テストで合格して閉じたものだけを解決に数える |
| 日ごとの件数で持つ | 入力もれの日があると、以後の合計がずれる | 累計で持ち、増分は前日との差で出す |
| 総ケース数が途中で増える | 消化率が下がって見える | 増えた日と理由を備考に残し、分母を新しい総数にそろえる |
よくある質問
Q. テスト消化率とは何ですか? A. 予定したテストケースのうち、結果を記録し終えたケースの割合です。消化累計÷総ケース数で求めます。合格か不合格かは問わないため、合格率と組にして見ます。
Q. 消化率と進捗率の違いは何ですか? A. 消化率は「実行した量」、進捗率は「終わったと言える量」の割合です。この記事では進捗率を合格累計÷総ケース数としています。組織によって定義が異なるため、報告書に式を書いておくと確実です。
Q. バグ曲線が収束しないときはどうすればよいですか? A. まずバグを機能別・原因別に集計し、集中している場所を特定します。特定の機能に偏っていれば、その機能の設計書やコードの見直しを先に行い、テストはほかの機能から進めます。
Q. 合格率は何%あればよいですか? A. 途中の時点では決まった値はなく、日ごとに上がっているかを見ます。テスト終了時は、合格していないケースの全件に理由と扱い(修正予定、対象外の合意など)が付いていることを条件にするのが分かりやすい決め方です。
まとめ
- 進捗は、消化率・合格率・未解決バグ数の3つを日次で並べて読む。
- 管理表は6列・すべて累計で持つ。予定の列は書き換えない。
- 残り日数は合格の累計で予測する。消化だけで見ると短めに出る。
- バグ曲線は検出と解決の2本を重ね、収束型・発散型・停滞型・階段型のどれかを見分ける。
- 横ばいは、消化が進んでいれば収束、止まっていれば停滞。
- 報告は数字 → 読み取り → 打つ手 → 判断してほしいことの順に書き、判断の基準を数字と日付で先に示す。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「テスト進捗管理表テンプレート|消化率の計算とバグ曲線の読み方」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。