火曜日, 3月 18, 2008

ユニットテスト

ユニットテスト(単体テスト)はホワイトボックステスト、ブラックボックステストの
2つのテストを実施する事で完了とする事が一般的である。
この2つのテストについて自分なりに考えてみる。

ホワイトボックステストとはプログラムの処理方式をテストする手法で
ソースコードからテストケースを作成する必要がある。

もちろん、このテスト方法を否定する事をするわけではない。
これは歴史的発展を遂げてきたテスト手法であり間違っているわけではない。

ただ、最近のプロジェクトはこのホワイトボックステストをじっくり行う
テスト期間がないような気がしている。
もちろん、昔に比べるとデバッガなどのツールが整備されており
実施そのものは行いやすくなって事は否定しない。

ホワイトボックステストとして定義されるテストには
以下のようなテストが存在する。

・カバレッジテスト
プログラムの全ての行をトレースするというテストである

カバレッジテストはホワイトボックステストの中でも
一番重要なテストだと考えている。
しかし、便利過ぎるデバッガがカバレッジテストの重要性を
見えなくしている気もしている。
カバレッジテストとは本来テストデータによって
カバレッジを上げる事が目的であるが
それをせずに同一データでデバッガのブレイクポイントと変数代入を
使用して無理やり分岐を通すテストを実施する人が多いという問題である。
もちろん、担当者のスキル問題ではあるのだが
そもそもツールが存在しなければこんな事にはならなかったのも事実である。

何で、こんな事が起きるかと言えばカバレッジテストという内容を
理解していないのが原因だと考えている。

この対策として私が考える一番単純な方法は異常系テストを除いて、
デバッガの変数代入機能の使用禁止である。

また、カバレッジでは網羅していないデータが存在するのも事実である。
それは文1、文2のIF文が存在すれば全部で組み合わせは4種類存在する。
しかし、カバレッジという観点で言えば「true-true」「false-false」で
完了してしまう。
このような事がおきないようにデシジョンテーブルを作成して
カバレッジを上げる必要性がある。

つまり私が考えるカバレッジテストとは、
「デシジョンテーブルの作成」→「全てのデータを走行」→「未テスト部分の検証」
結果がデシジョンテーブルの抜けではなく異常系と判断されれば
デバッガを利用しての未テスト部分の走行、検証。
デシジョンテーブルの抜けと判断された場合は
最初に戻ってやり直しという方法である。


・境界値テスト
プログラムの中を理解している人間はループの終了条件や
分岐文の境界を理解している。
これに特化したテストケースを実施する事である。

このテストで一番重要なのは、分岐文やループ終了条件に記述される
境界値が「なぜこの数値なのか?」という事を考えることである。
実際問題、境界値テストケースを作成する事で
その分岐文を参照する事になるため
テストケースを作成した時にテスト結果がどうなるか容易に想像する事ができる。

であれば問題なのは、そもそも「その分岐文はあっているのか?」
「その終了条件は合っているのか?」という事を考えることである。

これで境界値テストは終わったようなものである。
もし、テスト担当者がその理由を答えられない場合
テストケースをパスする事ができても、テストケースが間違っている事を
検出する事はできない。
つまり、分からなかった段階で設計者又は分かる人間に聞く必要がある
という事になる。

・アルゴリズムテスト
これは単純にアルゴリズムを検証するテストである。
「静的検証」と「動的検証」の2種類を行う必要がある。

「静的検証」とはプログラムソースレビューを指し
「アルゴリズムが性能的に問題がないか?」
「分かりやすいアルゴリズムになっているか?」
と言った観点でレビューを行う。

「動的検証」とはアルゴリズムが期待している結果を出すかという検証であり、
いわゆるテストと言われるものである。

これで一番重要だと考えるのは「静的検証」を実施する事である。
これは意外と実施されない傾向にあるがとても重要な事である。


ブラックボックステストとは、インデータに対して期待するアウトデータを定義し
その結果のみを確認するテストである。
アウトデータが正しい内容であれば、
その生成方法については問わないという考え方である。

ホワイトボックステストを実施した前提であれば
ブラックボックステストで行う必要があるのはそんなに存在しない。
カバレッジテストの箇所で触れたデシジョンテーブルが
きちっとテストされる事で基本的には
そのプログラムファイルに期待するテストを実施している事になるからである。

つまり私自身はユニットテストにブラックボックステストは
必要ないと考えている人間である。
正確なホワイトボックステストを実施すれば十分である。

0 件のコメント: