はじめに
『はじめて学ぶソフトウェアのテスト技法』を読んでいます。
このQiitaは本の内容をもとに、自分の思考整理と、理解促進のために書いています。
技術書に出てくる概念的な説明は、とにかく理解が難しいです。
読み進めているとだんだんとページの上を視線がすべるだけになっていって理解することができない、なんてことはよくあります。
なので理解を深めるために、噛み砕き、自分の言葉でアウトプットし直していこうと思いました。そんなQiitaです。
テストとはなにか
テストとはなにかを説明したり定義するものは数多く存在します。
本の中に書かれている部分では、以下の一文が自分の理解と合っているように思いました。
「ある特定の条件下でシステムまたはコンポーネントを操作するプロセスであり、その結果を観察または記録して、システムまたはコンポーネントのある側面を評価すること」
"IEEE Standard Glossary of Software Engineering Terminology" より
本の中では 「ある特定の条件」
を具体化したものがテストケースだと書かれています。この点には同意します。
また、文章中の言葉は以下のように読みました。
- 「システムまたはコンポーネントを操作する」 = 入力
- 「結果を観察または記録」 = 出力
- 「評価する」 = 出力結果と期待値の比較
入力と出力があって、その結果と期待値を比較するのがテスト、かな。
テストの成熟度
テストには成熟度というものがあって、5つのレベルに分けられるそうです。
この5つというのは、組織や人のテストに対する姿勢であったり、その時々でのシチュエーションによってどう認識しているかを測るものに見えます。
レベル0
「テストとデバッグには何の差もない。デバッグ以外にはテストには特別な意味はない」
そもそもテストが無い状況だと読みました。
テストを書くことはバグの原因究明を助けたり、再現性を高めることにもつながりますが、その認識も出来ていない(あるいはする余裕がない)状況かもしれません。
レベル1
「テストの目的は、ソフトウェアが動くことを示すことである」
動くことを示すテストというのは、つまり動くソフトウェアに合わせて作るテストになる可能性があるということ。
このアプローチは、ソフトウェアが(基本的に)正しいという全体から始まっていますが、欠陥を見つけ出そうとする我々の眼を曇らせる可能性があります。
正しい仕様をもとにしてテストケースを考えるべきだということと読みました。
TDDにおけるテストファーストにも、同じような意味が込められていますね。
レベル2
「テストの目的は、ソフトウェアが動かないということを示すことである」
動かないことを示すテストを書くことで、その時にソフトウェアがどう振る舞うべきかを考える姿勢につながりそうです。
ここで例外を見つけることで、検査するパターンを増やすか、あるいは「例外」として丸めるか、その判断が必要になってくるレベルだと思います。
レベル3
「テストの目的は、何かを証明することではなく、プログラムが動かないことによって発生する危険性をある許容範囲までに減らすことである」
プログラムが動かない場合に発生する問題を把握した上で、どこまで許容できるか判断を下すレベル。
この問題の発生確率は低いとはいえ、もし起きてしまえば会社が潰れてしまうほどにインパクトがあるので対応しようとか。
この問題の発生確率は高いとはいえ、起きても会社がどうこうなるほどのインパクトはないのでまだ対応しなくていいとか。
ビジネス面も考慮して優先順位付けができるレベルで、現場ではこのレベルが特に必要になりそう。
レベル4
「テストは行動ではない。大げさなテストをすることなく品質の高いソフトウェアを作るための精神的な規律である」
つまりこれまでのレベルを全てクリアした状態と読みました。神状態。
この成熟度レベルになると、よりテストの容易なソフトウェアを開発することに重点が置かれます。
例えば行き届いた自動化であったり。
例えばテスト容易な設計でプロダクトコードが書かれていたり。
品質保証のためのテストという観点のみでなく、プロダクト開発も加速するような、そんなレベルと読みました。
さいごに
今自分がどこのレベルにいるか、組織はどのレベルにいるか、今この瞬間ではどのレベルのスタンスを選択するかが、実際の開発現場では重要になりそうです。
自分はおそらく品質を担保するためでなく、安心して開発を行うための補助輪としてのテストを書くという意味ではレベル2と3の間くらいに居るように思いました。
レベル4になりたい。