【読書録】知識ゼロから学ぶソフトウェアテスト【改訂版】
知識ゼロから学ぶソフトウェアテスト【改訂版】を読了しました。テストの考え方をわかりやすく学べる非常に良い書籍だったため、学んだことの一部を私なりにまとめてみます。
書籍の紹介
ソフトウェアテストとその考え方について、様々な文献や実例を交えながら、わかりやすく解説しています。代表的な手法であるホワイトボックステストとブラックボックステストを中心に、非機能要求のテスト、運用、品質管理、テスト自動化の特性など、幅広く紹介してくださっています。
読んだきっかけ
ソフトウェアテストって結局なに?
これが私が本書を手にしたきっかけでした。
フィールドSEの時も完成した修正プログラムを画面操作レベルでテストしていましたが、「仕様通りに動くよね?表示に変なところはないよね?」程度でした。
その後、開発未経験で開発の現場に配属となり、システムの一部の改修を任されるようになりましたが、テストの手法や考え方については曖昧なままでした。
自分が作ったものに自信を持つために
基本情報技術者の勉強などでテストの手法についての知識(テスト手法の名前と概要程度ですが)は持っていました。
しかし、何をどう使い、どこまで細かく見れば良いかがわからず、取り合えずテストパターンを増やして何とかしようとしていたように思います。
本書を読んで、テストについての考え方が変わりました。
本書は私のようなソフトウェアテスト初心者から、テストやその運用、ソフトウェアの品質について学びなおしたい人には一読の価値がある書籍だと思います。
ちょっとだけまとめ
品質の悪いソフトウェアとは?
本書では、以下のように述べられています。
「バグによって本来の機能が制限され、そのソフトウェアに期待される機能(価値)を顧客やユーザーに提供できない」もの
高橋寿一. 知識ゼロから学ぶソフトウェアテスト 【改訂版】
ソフトウェアの種類によりますが、重大なバグは人命に関わるような大きな事故や巨額の損失を引き起こします。
(書籍では宇宙開発での大きな事故を取り上げています)
しかしながら、CPUやメモリなどのハード面やコンパイラなどを含めて、すべてテストを行うのは非現実的です。
まったくバグのないソフトウェアは存在するのでしょうか?答えは“ No” です。
高橋寿一. 知識ゼロから学ぶソフトウェアテスト 【改訂版】
そのため、テストでバグをすべて無くすことに注力するのではなく、「重大なバグを取り除くこと」と「少ない手間や時間でより多くのバグを抽出すること」に注力したほうが良いということになります。
ソフトウェアテストができることは貴重な技術
書籍の中に簡単なプログラムのテストケースを列挙する例題が載っていますが、これがかなり難しい。(私がダメなだけかもしれませんが…^^;)
テストケースを書くことはプログラムを書くことより実際は難しいものなの です。
高橋寿一. 知識ゼロから学ぶソフトウェアテスト 【改訂版】
ソフトウェアテストは新人やプログラミングスキルが低い人が行うというイメージがあるかもしれませんが、これは大きな間違いです。
特に前述のような効率的かつ効果的なテストパターンを列挙して、テストを行うことはかなりのスキルが必要になります。(実際、ソフトウェアテストを専門とする企業も存在します)
テストを確実に実施できる能力は、とても貴重で価値がある技術です。
バグの特性
効率的で効果的にテストを行うためには、バグの特性(どこにバグが出やすいか)を掴む必要があります。本書では以下のように述べられています。
バグというのはプログラム中に平均的に散らばっているのではなく、特定の部分に偏在しています。
高橋寿一. 知識ゼロから学ぶソフトウェアテスト 【改訂版】
プロジェクトの開始からモジュールごとのバグの発見数を調べれば、どこにバグがたくさんあるかはすぐに判ります。
高橋寿一. 知識ゼロから学ぶソフトウェアテスト 【改訂版】
プログラムで「境界」と 呼ばれる場所は常にバグが潜んでいる
高橋寿一. 知識ゼロから学ぶソフトウェアテスト 【改訂版】
複雑なコードほどバグが出やすい
高橋寿一. 知識ゼロから学ぶソフトウェアテスト 【改訂版】
などなど...
最後の「複雑なコード」というのは、条件分岐やループが多かったり、それらが複雑にネストしていたり(読むのが嫌になるw)するコードです。
逆にシンプルなコードはバグが非常に少ないとも述べられています。
実務では納期があるため、「まずは動くものを作る」ことは大切です。しかし、短くても定期的にリファクタリングの時間を設けるなど、よりシンプルなコードにしていく心がけは重要なのだと思います。
本書で薦めているテスト方法
しかしながら、どこまでテストをするのかは難しい問題です。
本書では、 完璧ではなくても効率的に多くのバグを見つけ、残り時間をバグ発生の原因追及や抑制手段の検討に充てるため、以下のように推奨しています。
まず境界値テストをやってください。そこで境界値に関わるバグをすべてつぶしてください。そしてもし入力エリアが二つ以上あるような ダイアログとかあるようならディシジョンテーブルテストを行ってください。そして状態が遷移するようなソフトウェアの場合は状態遷移をやってください。
高橋寿一. 知識ゼロから学ぶソフトウェアテスト 【改訂版】
上記の方法で見つからないケースは、組み合わせテストやホワイトボックステストなどの特定のテスト手法でしか見つからないバグとしています。
特に組み合わせテストでしか見つからないバグは、アーキテクチャレベルで防げるバグであると述べています。
組み合わせテストはテストケースが膨大になることが多いため、アーキテクチャで防げるバグを防ぐことができれば、品質を担保しつつ、工数・コスト削減に大きく寄与できることになります。
デザインパターンなどの設計を学ぶことも重要と言えます。
組み合わせテストをしないような工夫を開発者と相談してソフトウェアに入れ 込むのが正しいソフトウェア開発と言えます。
高橋寿一. 知識ゼロから学ぶソフトウェアテスト 【改訂版】
最後に
なかなか濃い内容も多く、まだすべて理解はできていませんが、また是非読み返したい良書だと感じています。
もっと沢山紹介したい内容(各テストの限界や具体的な手法、探索的テスト、運用など)はあるのですが、今回はこの辺で。
Kindle版も出ていますので、良ければ探してみてください。
最後に、本書の序章の格言を引用します。
ソフトウェアテストで重要なのは、どの部分にバグが出やすいのか、そこにどのようなテスト手法を適用すれば十分な品質が得られるかを知ることである
高橋寿一. 知識ゼロから学ぶソフトウェアテスト 【改訂版】