オブジェクト指向と単体・結合テスト
最近テストについてちゃんと考え理解しはじめたので、現時点での自分の理解を整理しておこうと思います。
私は最初はテストって言うと、ただ単にビルド・コンパイルが上手くいって、そして入力データに対する正しいデータが出力されればいいと思っていました。
条件網羅とかも一応知ってはいたのですが、それがどう関係してくるのか、いまいちピンと来なかったんです。
また、テストコードについても知りませんでした。最近はようやくこのテストの重要性に気づきはじめた次第です。
以下に書くことは、あくまで個人的な見解ですので参考までにしていただけるとありがたいです。
前置きはこのくらいにして、少しずつ本題に入って行こうと思います。
オブジェクト指向とテスト
一応誤解を生まないために言っておきますが、オブジェクト指向とはオブジェクト指向プログラミングのことです。
ここでは、オブジェクト指向プログラミングについては割愛します。
気になる方は、個人的に分かりやすいサイトへのリンクを貼り付けているので、そちらを参照下さい。
一応、「オブジェクト」と「クラス」の違いまで読んでいただければ良いです。
少し話がそれました。
設計レベルまでのテストだと、単体テストと結合テストというものがあります。 以下の図をご覧ください。
単体テストは詳細設計(内部設計)に対応するテストです。
そして、結合テストは基本設計(外部設計)に対応するテストです。
この説明で理解できる人は、この記事を読まなくていいです。
ここからは私の見解です。間違っていたらごめんなさい。
まずは設計から
「とある1つの配列の平均、分散、標準偏差を求め画面上に表示するプログラム」を例に挙げて考えてみましょう。
オブジェクト指向の考え方に則って、プログラム設計を考えると、
- 計算機能を担当するCalcクラス
- 計算結果の表示を担当するShowクラス
に分けられます。(人によって分け方は様々ですが)
画像が大きすぎて、申し訳ないです。
Calcクラスには、平均を計算するメソッド、分散を計算するメソッド、標準偏差を求めるメソッドがあります。
Showクラスには、計算結果を箇条書き形式で表示するメソッドがあります。(箇条書き形式でなく表形式とかでも構いません)
イメージとしてはこんな感じ。
さてではこの例で、テストについて考えていきましょう。
単体テスト
単体テストの概念をのせておきます。
単体テスト(ユニットテストと呼ばれることもあります)は、プログラムを構成する比較的小さな単位(ユニット)が個々の機能を正しく果たしているかどうかを検証するテストです。 通常、関数やメソッドが単体テストの単位(ユニット)となります。 プログラムが全体として正しく動作しているかを検証する 結合テストは、開発の比較的後の段階でQAチームなどによって行なわれることが多いのとは対照的に、単体テストは、コード作 成時などの早い段階で開発者によって実施されることが多いのが特徴です。
ここで言う、単位(ユニット)とはクラス(またはメソッド)です。
つまり、Calcクラス、Showクラスそれぞれが持つ機能を満たしているのかを確認するのが単体テストとなります。
具体的には、Calcクラスは平均、分散、標準偏差を正しく計算できるか?
Showクラスは与えられた値を箇条書き形式で表示できているか?、ということを確認することです。
結合テスト
単体テストと同じ要領で説明していきます。
結合テストの概念をのせておきます。
結合テストとは、システム開発におけるプログラムの検証作業の中でも、手続きや関数といった個々の機能を結合させて、うまく連携・動作しているかを確認するテストのことである。 結合テストでは、個々の機能を果たすためのプログラム部品(プログラムモジュール)を組み合わせて、データの受け渡しがうまく行われているか、コードの記述様式は揃っているか、データを授受するタイミングはずれていないか、といった点が確認され る。結合テストで不備が発見された際には、再度コーディングが行われる。
つまり、CalcクラスとShowクラスを繋げてみて、平均・分散・標準偏差を正しい値で表示できるかを確認するテストです。
学びはじめて間もないと、オブジェクト指向プログラミングとかテストとかあまりイメージしにくいと思いますが、参考になれば嬉しいです。