ソフトウェアテストとは
簡単に説明すると、作ったソフトウェアが期待通りに正しく動作するかを確かめる事です。
これは、お客様が実現したい動作が実行されているかの確認の他に、想定外の操作でソフトウェアが壊れないか、入力ミスをしてもエラーを出して、ユーザに正しい動作をさせるように誘導できているかという確認も含まれます。
ソフトウェアテストの種類は、色々ありますが、今回は、比較的技術よりのテストである、単体テストと結合テストについて紹介していきます。
単体テストと結合テストの定義
単体テスト
ソフトウェアの最小単位(関数やメソッド、クラスなど)の部品単体で、詳細設計書通りに正しく動作しているかどうかを確認するテストです。入力値と期待結果を定義しておき、正しい結果が返ってくるか、期待した通りの正常系な結果又は異常系な結果になっているかを確認します。
結合テスト
前述したプログラムの部品を組み合わせた時に、正しく連携出来るかを確認するテストです。単体テストで問題が無くても、組み合わせたら問題を発生することがあるので、大事な確認になります。ちなみにインプットは基本設計書となります。
テスト技法
同値分割
テスト対象の入力をグループ分けして洗い出すテスト技法です。
この手法で、OK部分(又はNG部分)を定義することで、反対のNG部分(又はOK部分)の領域を把握することができます。
例:「0〜120歳まではOK」「それ以外はNG」みたいにグループを分ける。
境界値分析
入力の「境目」(ギリギリの値)を重点的にテストする技法です。
これにより、有効ではない値を一つに絞ってテストすることで、テスト工数の削減につながります。
例:年齢の入力で「0歳〜120歳が有効」なら、テストすべきなのは「-1」「0」「120」「121」。
ディシジョンテーブル
条件と結果を表にまとめて、パターン漏れを防ぐ方法です。
これにより複雑な条件と期待値の関係を表形式で整理することで、視覚的な観点から理解しやすくなり、網羅性の向上が期待できます。
基本的に単体テストは、このディシジョンテーブルを作れないかどうかを最初に精査します。
インタフェーステスト
モジュール同士のデータのやり取り(インターフェース)が正しくできているかを確認する結合テストです。
例:登録画面Aで登録したデータが参照画面Bで欠損無く表示されている等
画面の手動確認とテスト自動化について
最近は、主に単体テストで、JUnitやXUnitのようなテストコードで、単体テストの自動化を実現している企業やプロジェクトが多いと思います。
単体テストとは、前述した通りソフトウェアの最小単位(関数やメソッド、クラスなど)をテストする工程です。しかし、テストコードが誕生する前は、画面やコンソールに出てくる実行結果をシステムを動かして人間の目で確認することが多かったです。そのため、バグが発見しづらく、テストの工数も膨れ上がっていきがちでした。その問題を解決するために作られたのがテストコードです。画面を起動しなくても、テスト対象の関数やメソッドだけを実行して、その合否すらもプログラムで判断するようになりました。また、ボタン一つでテストを実行できるため、テストに対する労力が手動確認に比べてかなり軽くなりました。結合テストを自動化するためのSelenium(WebDriver)などもありますが、ここでは割愛します。
テストコードによるテスト自動化のメリットまとめ
・テスト対象のプログラムだけをピンポイントで単体テストできるため独立性を担保できる。
・フロントエンド(画面の見た目や画面項目の制御)の実装が終わっていなくても先立って単体テストができる。
・システムを手動で動かす時と比べてテストの実行時間がとても短い
・プログラムが結果を判断することで、バグを確実に発見できる。
まとめ
ソフトウェアテストの最終的な目的は、お客様との信頼を守るためだったり、後の修正コストの爆発を抑えるためだったりするので欠かせない工程です。しかし、テストにも専門的な知識や技術、工程によっては、技術者目線ではなくお客様目線で考えてテストをするスキルが必要なので、プログラミングやその他開発技術の学習と同じ又はそれ以上に学習が必要です。テストの学習は後回しにされがちですが、エンジニアとして一人前になるためには、テストについてもしっかり学習していく姿勢が重要になっていくと思います。