見出し画像

83号:テスト設計(技法)の必要性

≣ はじめに

ASTERセミナー標準テキスト」の80ページについてです。

今回は、テスト設計(技法)の必要性を練習問題を解く過程で感じてもらおうという回です。

何かを学ぶ際に、自分が”その何か”について何をどのくらい知っているのかを把握すると、『できるようになりたいな』と学習のモチベーション向上につながったり、学ぶべき箇所を自覚することで効率的に学習が進みます。
今回の(「ASTERセミナー標準テキスト」の80ページの)狙いはそこにあります。


≣ Myersの三角形判定問題

「Myersの三角形判定問題」の背景等については、辰巳さんの"A Lifelong Software Tester's Blog"というブログの記事がとても充実しています。

5回に渡って詳細に書かれています。読んでいて楽しいので、ご一読されることをおすすめします。

ものすごく簡単に言えば、「三角形の三辺の長さとして3個の正の整数を入力したら、三角形の形状(不等辺三角形、二等辺三角形、正三角形)を出力するプログラムのテストを作りなさい」という問題です。

この問題は名著と呼ばれるMyersが執筆した『ソフトウェア・テスト技法』という本の初めのほうに載っていることで有名になりました。
この本は、とても勉強になる良書なのですが、「原因結果グラフからデシジョンテーブルを作るアルゴリズムの説明」が、"長いわりにいい加減"で苦しんだという辛い経験を思い出してしまいます。
CEGTestが使える今となっては、読み飛ばしてよい箇所なのですが。

「Myersの三角形判定問題」は、「こんな簡単なプログラム(ソフトウェア)でもテストを抜け漏れなく作るのは難しい」ことを実感してもらうためにあります。プログラムの仕様がすぐに理解できる点でも良い問題ですね。

続いて答えを書きますが、解いたことが無い人は5分で良いので、考えてから以下を読んでください。


≣ Myersの三角形判定問題(書籍の解答)

書籍に載っている解答は下表の2列目(テスト条件の1~14(※))のとおりです。3列目のテストデータの列は私が参考に書いたものです。

(※) 細かい話をいえば、14番目はテスト条件ではありません。

画像1

「3. 辺の順番を考慮する」、「13. 辺の数が3個以外」、「14. 期待結果を示してある」あたりが抜けがちです。

これらのほかに、巨大な値を入力して桁あふれを起こさないかのテスト(そのときに三角形が成立するかの判定が正しく行われることのテスト)を考える人もいます。良いテストだと思います。
たまに「マイナスの値の入力」のテストを考える人もいますが、そちらはあまり重要なテストではないように思います。(気になるなら、実施した方がよいですが……。)
本には、「(参考)1項目1点として、平均的なプログラマは14点中、7.8点」と書いてあるのですが、テスターであっても(初めて解いたときに)全問正解するのは難しいのではないかと思います。

セミナーでこの問題を行うと、「"1個の辺の長さが0"のテストをしているのに、さらに、"3個の辺の長さがすべて0"のテストを別途おこなうのは何故ですか?」という質問を受けることがあります。

「同感です。変ですよね。」と答えています。
(論理的な理由をご存知の方、教えてください!!)

この問題の主旨は「簡単なプログラム(ソフトウェア)でも、テスト設計技法を用いずに、抜け漏れのない網羅的なテストを作るのは難しいことを実感してもらうため」であって、完璧なテストケースを作ることではないので良いのでしょうが、「書籍なのだから、ちゃんとした解答を用意してよ」と思います。←私はソフトウェアエンジニアとしてみたときのMyersは嫌いです。


≣ 山浦さんの記事

山浦恒央の“くみこみ”な話(121)」でもこの問題を取り扱っていて、おもしろいので読んでみてください。


≣ 咳さんのプログラム

2012年の”とてか”(とちぎテストの会議)のTDDライブだったかで、咳さんが書いた「Myersの三角形判定問題」プログラムに対するテストの議論がありました。

要は(三角形が成立する辺の長さであることが分かった3つの整数から)三角形の形状判定をおこなうときに「三辺のうち、同じ数値がいくつあるかを調べる関数を使う。(このとき、この関数にはバグが無いことが分かっているとする)」というプログラム、つまり、
  「(同じ数値が)3つなら正三角形」、
  「2つなら二等辺三角形」、
  「それ以外なら不等辺三角形」
という仕組みを用いて形状判定を行うプログラムだった場合、Myersの解答例の「辺の順番を考慮する」テストに意味はあるか? という議論でした。

結論をいえば、「TDDでは意味がないがブラックボックステストとしては意味がある」のでしょうが、「みんなが納得するように説明しろ」と言われたら難しいかもしれません。


≣ 自分なら……

「ブログなのだから自分ならどういう解答になるのか書きなさいよ」という声がしたような気がするので書きます。

■ テスト分析

自分なら、まず、テスト分析します。6W2Hと言っていますが、要は何をテストしてほしいのかを確認します。そのためには、このソフトウェアってなんのために作るの?というテスト対象のソフトウェアに期待されていることを知る必要があります。

この問題を読むと、このソフトウェアには3つの使い方があるのではと思いました。

 ● 小学生向け三角形の理解ゲーム
 ● ベルトコンベアに流れてくるものの自動チェック(デモ)
 ● プログラミング教育の演習問題の答え合わせツール

「小学生向け三角形の理解ゲーム」とは、三角形の名前を覚えたての小学生が3辺の長さを入力して自分が考えた形の名前と比べて、「合っていた」「間違っていた」と確認するためのゲームです。でも、「終わりに」に書いた『直角二等辺三角形』への考慮が書いていないことと、もしそうなら、3辺の入力は小学生にさせずに、3辺の整数は小学生への問題として出して、三角形の形状を選択させるゲームにするかなあと思います。

二つ目の「ベルトコンベアに流れてくるものの自動チェック(デモ)」とは、ベルトコンベアに乗って流れてくる積み木の色と形を自動判別して、別の箱に自動仕分けするシステムを見たことがあるので、そういう機械のデモプログラムの可能性もあるかなあと思いました。でも、その場合は、「読み取り長の精度」の指定が無いのが問題で、やっぱり、無理がある想定かなと思います。

残るは「プログラミング教育の演習問題の答え合わせ」ですが、これが一番ありそうです。初めてプログラミングを習った人へ「Myersの三角形問題を実装してこい」という宿題が出されたときに提出された宿題の出来栄えをチェックする用途です。(生徒が20人もいたら答え合わせが手間ですから)

■ テスト設計

ということで、「プログラミング教育の演習問題の答え合わせ」のためのテストと仮定して話を進めます。

自分なら、0~99までの入力を3つの総組合せである100万のテストを自動化します。期待結果は、まずはヘロンの公式で三角形が成立するかを確認し、成立する場合は咳さん方式で形状を確定する方法で作ります。

そうして作った入力と期待結果が入ったファイルから1行ずつ読み込んでテスト対象を動かして自動テストします。(そのために、演習問題にテスタビリティを上げる仕様を追加すると思います。たとえば、辺の値はコマンドラインの引数で与えるものとする)

なお、辺の数や文字種などのエラー処理については、このプログラミング課題の目的ではないと思うのでテストは用意しません。


≣ 終わりに

今回は、テスト設計(技法)の必要性を練習問題を解く過程で感じてもらおうという回でした。問題を解いていただいた人には面白い問題だと思っていただけたかもしれません。

解かずに読み進めてしまった人は今からでも構いませんので、解いてみて、解答例と見比べてみてください。

上にもいくつか書きましたが、突っ込みどころが多い問題ですので、酒の肴にもってこいです。(笑)

ちなみに、「(この仕様では)直角二等辺三角形という表示をすることはない」というネタが好きです。直角二等辺三角形の三辺がすべて整数ということはありえませんから。

「直角二等辺三角形という表示はない」と書きましたが、数学的にはそうですが、もしも、学習用ソフトならば「仕様漏れ」と思います。
例えば、一辺が10センチの折り紙を三角に折って斜辺を14センチと測って「10, 10, 14」と入力した子供がいた想定したとします。何と表示すべきでしょうか?
「二等辺三角形」と表示すべきという考えも正しいと思います。
しかし、「二等辺三角形(直角二等辺三角形の可能性大)」と表示するのも悪くないと思います。

テストの7原則の7に「テストは状況次第」があります。そのソフトウェアの使用目的に対して妥当な結果かどうかを確認できているかどうかについてはいつも気にしておきたいですね。

いいなと思ったら応援しよう!