開発支援・コーディング

ユニットテストとは|逆ピラミッドは検出率が単体だけより低いのに、時間は約158倍かかった

ユニットテストはどこまで届くのか上の層に寄せると何が起きるのかどの構成が得なのか

テストを上の層に寄せた構成は、検出率46.0%でした。単体だけの50.0%を下回ります。

実行時間は8.0秒から1260.8秒へ。約158倍かけて、見つかる欠陥は減っています。

この記事の要点

  • 単体だけで50.0%・8.0秒
  • ピラミッドで76.0%・258.0秒
  • 逆ピラミッドは46.0%・1260.8秒
  • E2Eだけは11.3%・1600.0秒

逆ピラミッドは検出率が単体だけより低いのに、時間は約158倍かかった

上の層は1件あたりが重いので、本数を確保できません。件数が確保できないと、届く範囲も狭くなります。

ユニットテストをどれだけ置き、どの層に厚みを寄せるかで、検出率と実行時間の両方が変わります。実際に計算しました。

欠陥を300件用意しました。内訳は関数の中で完結する誤りが176件・繋ぎ目が85件・通しでしか出ないものが39件です。

1件あたりの実行時間は、単体0.02秒・結合1.5秒・E2E20秒として置きました。件数が増えるほど、その層の欠陥を捕まえやすくなる形にしています。

構成を4通り比べる

text
欠陥 300件。内訳は関数の中 176件・繋ぎ目 85件・通しでしか出ない 39件

構成                    見つけた欠陥  検出率  一式の実行時間  1件あたりの時間
単体だけ 400件                       150件   50.0%            8.0秒           0.02秒
ピラミッド 400/60/8                  228件   76.0%          258.0秒           0.55秒
逆ピラミッド 40/40/60                 138件   46.0%         1260.8秒           9.01秒
E2Eだけ 80件                        34件   11.3%         1600.0秒          20.00秒

上の層に寄せた逆ピラミッドは、検出率46.0%でした。単体だけの50.0%を下回っています。

実行時間は1260.8秒で、単体だけの8.0秒の約158倍です。時間をかけて、見つかる欠陥が減っています。

本数が確保できない

理由は単純です。1件20秒かかると、60件で1200秒になります。それ以上は増やせません。

その60件では、欠陥の6割を占める関数の中の誤り176件に手が回りません。単体テストは40件しかありません。

出典もこの性質を要するに、画面を通して端から端まで走らせるテストは、壊れやすく、書くのに費用がかかり、走らせるのに時間がかかると述べています。

時間をかけたほうが見つかる、とは限らない。

一式の実行時間(秒)検出率(%)→176083.6単体だけピラミッド逆ピラミッドE2Eだけ欠陥300件での計算。右下にあるほど、短い時間で多く見つかる。
図1 ── 構成ごとの検出率と実行時間
出典Martin Fowler「TestPyramid」2026-08-18 確認
In short, tests that run end-to-end through the UI are: brittle, expensive to write, and time consuming to run.
原文Martin Fowler「TestPyramid」 この内容の有効期限2027-02-18

層ごとに、届く欠陥の種類が違う

単体テストは関数の中しか見ません。繋ぎ目と通しは、上の層でなければ出てきません。

ユニットテストが届く範囲は、1つの関数の中です。この計測では欠陥の6割がここにありました。

3種類に分ける

  1. 関数の中。計算違い、条件の書き間違い、境目の扱い
  2. 繋ぎ目。渡す値の形、呼ぶ順番、失敗したときの扱い
  3. 通し。画面の操作、設定の食い違い、環境の差

1番目は単体テストで見つかります。2番目と3番目は、単体テストをいくら増やしても出てきません

だから単体だけの構成は50.0%で頭打ちになります。残り半分は、構造として届かない範囲です。

下ほど本数を置く

件数の比は、この計測のピラミッド型で400対60対8です。下ほど多く置きます。

出典も要点をその本質は、画面を通して走る高水準の広域テストより、低水準の単体テストをはるかに多く持つべきだということであるとしています。

この比が成り立つのは、下ほど1件が安いからです。400件の単体テストが8.0秒で終わります。

同じ8.0秒では、E2Eは0.4件しか回せません。本数の比は、そのまま時間の比の裏返しです。

出典Martin Fowler「TestPyramid」2026-08-18 確認
Its essential point is that you should have many more low-level UnitTests than high level BroadStackTests running through a GUI.
原文Martin Fowler「TestPyramid」 この内容の有効期限2027-02-18

上の層は、二段目として置く

上の層を捨てる話ではありません。数で稼ぐ層と、通しを確かめる層は役割が違います。

ユニットテストを軸にしつつ上の層も置いたピラミッド型が、この計測では76.0%で最も高くなりました。単体だけでも、E2Eだけでもありません。

E2Eを8件足すだけで、単体だけの50.0%から26ポイント上がります。少数でも、そこにしかない欠陥に届くためです。

出典もこの位置づけを高水準のテストは、テストの二段目の防御としてそこにあるのだと、私はいつも主張していると述べています。

上の層で何を確かめるか

  1. 主要な流れが通ること。申請から承認までが最後まで動く
  2. 設定が揃っていること。本番と同じ組み合わせで動く
  3. 外との繋ぎ。相手の返し方が変わっていない
  4. 画面が壊れていないこと。押せる、読める

細かい条件の網羅は、上の層でやりません。1件20秒を条件の数だけ並べると、時間が持たないからです。

自分の構成を測る

この計測の欠陥の内訳は置いた値です。自社の内訳は、直近の不具合を数えれば出ます

繋ぎ目の不具合が多いなら、結合の層を厚くします。内訳と本数の比が合っているかを見ます。

上の層は不安定にもなりやすい層です。E2Eテストの記事では、たまに落ちるテストが判定をどう狂わせるかを測っています。

上の層は少数でよい。ただし0にすると届かない範囲が残る。

充足 2 / 4不具合を層ごとに数えている内訳が分からないと、どの層を厚くすべきか決められない上の層を少数だけ置いているE2Eを8件足すだけで、検出率が50.0%から76.0%へ上がる上の層で条件を網羅しようとしている1件20秒かかるため本数を確保できず、検出率がかえって下がる単体テストだけで済ませている繋ぎ目と通しの欠陥には構造として届かず、50.0%で頭打ちになる欠陥300件・テスト構成4通りでの計算にもとづく。
図2 ── 構成を決める前の点検項目
余談 この計測での注意

欠陥の内訳も、1件あたりの時間も置いた値です。捕まえる確率は、件数が増えるほど上限に近づく形にしています(単体120件・結合25件・E2E12件で約63%)。実際の比率は作っているものによって変わります。ここで見せているのは、上の層は1件が重いために本数を確保できず、その結果として検出率まで下がるという関係です。

出典Martin Fowler「TestPyramid」2026-08-18 確認
I always argue that high-level tests are there as a second line of test defense.
原文Martin Fowler「TestPyramid」 この内容の有効期限2027-02-18

よくある質問

ユニットテストだけで足りますか
足りません。この計測では50.0%で、繋ぎ目と通しでしか出ない欠陥に届きませんでした。
上の層を厚くすればよいのでは
逆効果でした。逆ピラミッドの構成は検出率46.0%で、単体だけの50.0%を下回りました。
なぜ上に寄せると下がるのですか
件数を確保できないためです。1件20秒かかると本数を増やせず、欠陥の6割を占める関数内の誤りに手が回りません。
どの構成がよいですか
この計測ではピラミッド型が76.0%で最も高く、時間も258.0秒に収まりました。

まとめ

  • 小さな単位で動きを確かめる
  • 単体だけでは繋ぎ目に届かない
  • 上に寄せると件数が確保できない
  • 厚みは下に置く

今日から始められること

  1. 直近の不具合を3種類に分ける
  2. 関数の中・繋ぎ目・通し、の件数を数える
  3. いまのテストの層ごとの本数を数える
  4. 多い種類に対して本数が足りているか見る

実務で組んだユニットテストのワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る