法則一覧

第95条保守性

殺虫剤のパラドックス

バグを見つける方法はどれも、その方法では見つからないバグを残す。だから変わらないテストスイートが見つけるバグは減っていく。

Boris Beizer

心得

バグの探し方を変え続ける

どうするか

回帰テストは残すが、それで新しいバグが見つかるとは期待しない。新しい入力、ファジング、プロパティベーステスト、探索的テストなど、スイートが確かめていないところを狙うテストを足す。本番にバグが漏れたら、どの種類のテストなら捕まえられたかを考え、その一件だけでなく、その種類のテストを足す。スイートは定期的に見直し、互いに重複するテストは消す。

なぜ起きるか

テスト手法は特定の種類のバグを捕まえる。しばらく使い続けると、その種類のバグは直され、開発者もそれを書かなくなる。残るのはその手法から見えないバグなので、同じテストは通り続け、欠陥はテストが見ていない場所へ移っていく。同じ殺虫剤を何シーズンも撒いた後に残るのが、その薬では死なない虫であるのと同じだ。そうなると、テストが全部通ることが示すのは、コードが昨日のバグをどれだけ避けているかであって、バグがどれだけ少ないかではない。

当てはまらなくなるとき

古いテストの守り:何年も落ちていないテストも、直したバグの再発を止め、他人が頼る挙動を固定している。新しいバグを追うために古いテストを捨てれば、今も効いている守りを失う。

出典

Boris Beizer『Software Testing Techniques』(第 2 版、Van Nostrand Reinhold, 1990)「The Pesticide Paradox and the Complexity Barrier」。"Every method you use to prevent or find bugs leaves a residue of subtler bugs against which those methods are ineffectual" と "Test suites wear out." の出典。

原典を読む

引用するとき

Hammurabi『第95条 殺虫剤のパラドックス』 https://kanywst.github.io/hammurabi/ja/laws/pesticide-paradox/

BibTeX
@misc{hammurabi-pesticide-paradox,
  title  = {殺虫剤のパラドックス},
  author = {{Hammurabi contributors}},
  note   = {Hammurabi, § 95},
  url    = {https://kanywst.github.io/hammurabi/ja/laws/pesticide-paradox/}
}

本文は CC BY-SA 4.0 です。Hammurabi の名前と記事へのリンクを添えてください。

XBlueskyはてブLinkedIn

関連する法則

GitHub で誤りを指摘する