はじめに
実装と違い、テストを進んで取り組みたいと考える人は少ないと思います。筆者もテストが重要だということは理解していたものの、苦手意識があり、あまり手をつけていませんでした。今回はそれを克服すべく、勉強したことを書きましいた。
ソフトウェアテスト技法とは
ある特定の条件下においてソフトウェアの振る舞いを記録し、それを期待される結果と比較・検証を行うプロセスのこと。開発者の意図した通りにプログラムが動くのか、いくつかのテストケースを用いて検証を行い、ソフトウェアの品質を保証するのが目的。ソフトウェアテスト技法とは、なるべく少ないテストケースでなるべく多くのバグを発見するための技術のこと。
ソフトウェアテストの種類
- ユニットテスト : メソッド単位のテスト
- 結合テスト : メソッドの組み合わせのテスト
- UI/システムテスト : データベースやUI部品を組み合わせてテスト
重要な概念
ソフトウェアテスト技法には網羅性とピンポイントとテスト設計アプローチという概念があります。
網羅性とピンポイント
網羅性とは、テストの漏れをなるべくなくすことで、ピンポイントとは怪しい部分を重点的に調べることです。ソフトウェアテストでなるべく多くのバグを発見するには、テスト技法によってテストの網羅性を確保しつつ、バグが潜んでいそうな部分やシステムの機能的に重要なところは、他に比べてテストケースを増やして調べる必要があります。
テスト設計アプローチ
テスト設計アプローチには以下の2つがあります。
- 契約によるテスト
- 防御的テスト
契約によるテストとは、事前条件(渡される必要のある引数など、メソッドが正しく呼び出される際に満たすべき条件)の範囲内でテストを行うアプローチのことで、防御的テストとは、事前条件の範囲外もテストを行うアプローチです。
以下の例を見てみましょう。
fun test(n: Int) {
return n * n * n
}
上記のメソッドは1~10までの整数しか渡されない(事前条件)と仕様で決まっていた場合、その範囲でしかテストを行わないものを契約によるテストと言い、上記のメソッドは1~10までの整数しか渡されないと仕様で決まっているが、その範囲外(文字列など)のテストも行い、例外やエラーが出ることを確認することを防御的テストと言います。
最後に
テスト技法はバグをなるべく多く発見するための手段であり、目的ではありません。正解はなく、大事なのはどういったアプローチを行うのか明確にすることで、これを意識していればテストの指針も明確になり、スムーズにテストが進められると思います。