テストの経済学・心理学的捉え方

ネタ元は、「ソフトウェア・テストの技法」第2章をまとめたものです。
ソフトウェア開発のときに行う「テスト」に焦点を当てており、大変面白い本です。
ソフトウェアのテストについての古典中の古典ですね。
以下の文章中に出てくる「テスト」はすべて「ソフトウェア・テスト」のことです。

テストの定義について

これまでは誤った定義であり、それがテストの貧困さの要因
誤った定義:
「テストとは、プログラムが意図された機能どおりに正しく動いてくれることをしめすことである」
「テストとは、プログラムが思い通りに動くことの確信を作っていくプロセスである」
真の定義:
「テストとは、エラーをみつけるつもりでプログラムを実行するプロセスである」

真の定義の理由

テストの価値を高めるために必要なことは...
プログラムの品質・信頼性を向上させること
プログラムの信頼性を向上させるとは、エラーをみつけ、それを取り除くこと
ということは...
× テストはプログラムが作動することを示すためのもの
○ テストはできる限り多くのエラーを見つけるためのもの

(前提として、プログラムはエラーを含んでいるという仮定のもとでテストを始めるべき)

真の定義の重要性

人間は心理学的に目標に向かって進むもの
目標が異なれば、進み方が異なる

例)
誤った定義のもとでは、できるだけ失敗に導かないテストケースを選んでしまう。
真の定義のもとでは、エラーを見つける確率の高いテストケースを選ぶ

もうひとつ定義すべきこと:テストの成功とは?

誤った定義によれば
成功:エラーが見つからなかったテスト
失敗:エラーが見つかったテスト
真の定義によれば
成功:エラーが見つかったテスト
失敗:エラーが見つからなかったテスト

例)
何か不快を感じている患者に対する診察
診断テストによって
成功:原因がわかったとき
失敗:原因が不明のままだったとき
(プログラムは完全に健康な状態にある場合はありえないため、「何か不快を感じている患者」と捉えられる)

まとめると、テストとは、プログラムの中のエラーを存在すると仮定して見つけようとする破壊的なプロセス

テストの経済学

:すべてのエラーを見つけるためのテストは可能か?
:どんなに単純なプログラムであっても「否」
それはなぜか。
ブラックボックステスト:完全にテストするためには、無限のテストケースが存在する
ホワイトボックステスト:経路を徹底的にテストすると、テストケースは膨大で実質的に不可能
完全なテストが存在しない以上、より「効果的」つまり「経済的」なテストを考えなければならない。

テストの原則

テスト・ケースの必須条件は、予想される出力または結果を定義しておくことである。
一番多く見過ごされるあやまりのひとつ。 事前に定義していなければ、「もっともらしくみえる」ものを正しいと判断してしまう(本当は誤っていることがある)。

プログラマは自分自身のプログラムをテストしてはならない
「破壊的な過程」であるテストは、プログラムを建設した人間には心理的に困難。 プログラマの仕様に対する誤解に基づくエラーは、自分では見つけ出すのが困難。 したがって、不可能ではないが、効果的ではない。

プログラム開発グループは自分たちのプログラムをテストしてはいけない
前項目と同じ理由。 加えて、時間とコストのプレッシャーのある開発チームは、正しい定義に基づいたテストを実行するのが難しい。

それぞれのテストの結果を完全に検査せよ
当然のことでありながら、よく見落とされる。 エラーが判明した後で見直してみると、以前のテストでエラーの兆候が現れていることも多い。

テスト・ケースは、正しい予想できる入力条件ばかりでなく、あやまった予想しない場合も考えて書かなければならない
突然発見されるエラーの多くは、プログラムが予測できない状態で使われたときに発生する。

プログラムを調べるのに、それが意図されたように動くかどうかをみただけでは、なかば成功したにすぎない。残りの半分は、意図されなかった動きをするかどうかを調べることである
前項目から導かれる必然の理由。

プログラムが本当に使い捨てのものでない限り、そのテスト・ケースも使い捨てにしてはならない
テストが使い捨ての場合、テストを何度も行おうとするとき、2回目以降はテストがゆるくなる。 テスト作成という投資の無駄遣い。

エラーは見つからないだろうという仮定のもとにテストの計画をたててはいけない
プロジェクト管理者がよく犯すあやまりで、誤った定義を使っている結果。

プログラムのある部分でエラーがまだ存在している確率は、すでにその部分でみつかったエラーの数に比例する
つまり、エラーがすでに多く発見されている場所は、これからもエラーが発生しやすい場所。 したがって、こうした部分のテストを行うのがより効果的、経済的。

テストとは、非常に創造的であり、知的に挑戦しがいのある仕事である
大きなプログラムをテストするのに必要とされる創造力は、、そのプログラムを設計するときに必要な創造力をしのぐ。

最後に、最重要なテストの原則をもう一度

テストとは、エラーを見つけようとしながら、プログラムを実行する過程である
よいテストケースとは、まだ発見されていないエラーを検出する確率の高いものである
成功したテストケースとは、まだ発見されていないエラーを検出したものである