信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

2012

19

12月

ソフトウェアテストについて

テクログ

こんにちわ、本日はシステムのテスト手法につきましてわかる範囲で書いていきたいと思います。 システムのテストを全くやったことないよっていう人はSE/プログラマの方の中にほとんどいらっしゃらないかと思います。 例えば業務システムの場合、テスト専門部門(品質保証部門)を用意している企業も珍しくはありませんが、どんな作り手の方でも最低限の単体テスト(UT)くらいは実施しますよね。 今回はその際のテストについてです。 システムのテストは大きく2つの分類に分けられます。 ・ブラックボックステスト ・ホワイトボックステスト の2種類です。 違いは以下の通り。 ブラックボックステスト…システムの外部に着目して仕様通りかどうかのテストを行う ホワイトボックステスト…システムの内部構造に着目してテストを行う 例えば、ここに 『身長を入力したら 165cm未満で低め/165以上180以下で標準/それ以上は高め を結果として表示してくれる PHPプログラムがあったとします。処理としては、非常に簡素ですが以下とします。 index.html


身長:
calc.php

コードに関しては特に説明する必要もないくらいですね。 入力された結果をcalc.phpに渡してその判断結果をprintするだけです。 さて、まずは上記のプログラムに対してテストを行う場合に、ブラックボックステストで行う場合のテストケースを考えてみましょう。 仕様は上に書いたとおりです。 ブラックボックステストを漏れが少なく行う為の有効な手法の1つとして、同値分割と限界値分析(境界値分析)という手法があります。 ◆同値分割とは 入力を同じように扱えるグループに値を分けたものを同値クラスと呼び、それぞれの代表的な値を用いてテストを行う。 有効な同値クラスを、有効同値クラス、無効(エラー)となる同値クラスを無効同値クラスと呼ぶ。(ソフトウェアテストwikiより) →要約すると『同じように扱えるグループの代表的な値を入れる』って事です。 上記の例では、 164cm以下なら『低め』が返るグループ 165~179cmなら『標準』が返るグループ 180cm以上なら『高め』が返るグループ 同値分割を使用してのテストは、各グループの代表値を使用してテストケースを作成します。 上記はすべて有効同値クラスと言われるものですね。 例えば、上記テストケースを作成するとしたら以下のような感じでしょうか? 身長の入力:期待される結果 100 :低めが表示されること 170 :標準が表示されること 190 :高めが表示されること 同値クラスは、あくまでその地域の代表となる値なので特にどの数値がいいとかいうのはないので、上記は各クラスから適当に抜き出した値です。 有効同値クラスのテストは上の例のようなもので問題ありません。 逆に無効同値クラスを考えたときに、例えば負の値が入力された場合を考えます。 すると身長でマイナスというのは本来存在しないが(厳密にいうと極端に低い値も存在しないとは思いますが)、入力では入れることができるマイナスの数値のケースが上記プログラムでは抜けている事に気づく事ができます。 現状のプログラムではマイナスが入力された時にも『低め』が表示されるので、身長の事なんだからマイナスの場合はエラーを表示させる必要があるかもという発想に至ることができます。 実際のプログラムでは、このような異常ケースを考えていない事が致命的な不具合につながることがあります。 エラーケースを考えて仕様に『身長がマイナスの場合は正しい値を入力してくださいと表示する』という仕様が追加されたら、 無効同値クラスのテストケースは下記のものを追加でしょうか。 身長の入力:期待される結果 -5 :正しい値を入力してくださいと表示されること。 さらに無効同値クラスを考えるときに、例えば数値以外の入力があった場合を考えたとします。 先ほどのエラー処理をいれたソースはこのようなコードであったとすると…

入力値に数字以外の日本語を入れると、なぜか結果は『低め』になります。 理由はintval()の関数の仕様が数値変換失敗時は 0を返すという理由です。 ですので、全角や数値以外の場合は変換失敗として0が返されるので}elseif($shincho < 165)に該当してしまって低めと間違った結果を表示してしまいます。 この場合は数値以外をJSで入力できなくしてあげたり、php側で数値かどうかのチェックを入れて数値以外ならエラーを出力するなどの対策を考える必要があります。 上記のように、無効同値クラスを考えただけでも2つの想定外になる要素を排除する事ができます。 同値分割は、グループわけをして代表的な値を入力して正しく期待結果が返る事を確認するテストになります。 テスト作成時には、異なる結果が得られる分岐がある場合はこの同値分割を意識する必要があります。 ちと長くなりましたが…本日はもう1つだけ。 限界値分析に関してです。 ◆限界値分析とは 入力を同じように扱えるグループに値を分け、その境界となる値を用いてテストを行う。プログラムのエラーは分岐の境界で発生する場合が多いため、限界値分析に基づいたテストを行うことで、同値分割に基づいたテストよりも多くの欠陥を発見することができる。(ソフトウェアテストwikiより) →要約すると『同じように扱えるグループの境目の値をテストする』って事です。 文書見ただけでもわかりますが、異なる結果を出力する境目になりますので、上記例を使って限界値テストを実施する場合は 身長の入力:期待される結果 -1:正しい値を入力してくださいが表示される事 0:低めが表示されること 164:低めが表示されること 165:標準が表示されること 179:標準が表示されること 180:高めが表示されること このような項目になりますね。 -1~0の間(エラーから低め)、164~165の間(低めから標準)、179~180(標準から高め) の間で1つの数値上昇に対して結果が変わるので、そこをテストします。 境界値テストを実施することで、165未満の判定が }elseif($shincho < 165){が正しいところを }elseif($shincho <= 165){となっていた場合には、165で『低め』が誤って表示されるのでバグを発見することができます。 境界近くの値は上のif分の記述ミス等のようなバグが発生しやすいです。 実際、ni-yoが所属しているチームでつい最近も境界線の値の判断ミスでバグが発生しました。 ブラックボックステストを作成時に同値分割/限界値分析を意識するだけで、何も意識していない状態よりはかなり品質は変わってきます。 長くなりましたので、ホワイトボックスはまた後日にでも! では( ´ ▽ ` )ノ

この記事を書いた人

マスオさん

新納誠一

所 属:
役員
出身地:
新潟
仕事内容:
プログラミング