この記事は、2022年4月15日に配信した「エンジニアへの挑戦状 #3 テストデータ作成問題」の解説となります。まだ問題を解いていない方は、こちらからご覧ください 。
あなたのプログラマとしての力を測る問題でした。所要時間は3~5分としましたが、何を問われているかをすぐに理解できた方は、1分ほどで解けたかもしれません。一方で、プログラマでない方には、さっぱりわからなかったでしょう。あなたは解けましたか? では、早速解説していきます。
問題を解くための考え方
ソフトウェアのテストが漏れなく実施されているかを確認するためには、網羅率という指標がよく使われます。コードカバレッジとも呼ばれ、テストが済んだ割合を表すものです。このコードカバレッジには、C0(命令網羅)、C1(分岐網羅)、C2(条件網羅)といった基準があります。
C0はプログラムのソースコードに書かれているすべての命令文を実行したかを測定するものです。次のソースコードがあった場合、すべての命令文を網羅するには、それぞれの条件を満たすデータが必要なので、少なくとも3つのテストデータが必要です。
int price = 0;
if (main == FOOD_UME) { /* メインが松竹梅の梅のとき */
price += 500;
} else if (main == FOOD_TAKE) { /* メインが松竹梅の竹のとき */
price += 700;
} else { /* メインが松竹梅の松のとき */
price += 1000;
}
テストデータの例
C1はそれぞれの分岐が少なくとも1回は実行したかを測定するものです。たとえば、次のソースコードには、1つ目の分岐と2つ目の分岐があります。このとき、すべての分岐を試すには1つ目の分岐で3通り、2つ目の分岐で3通りなので3×3=9通りのテストデータが必要だと思うかもしれません。
int price = 0;
if (main == FOOD_UME) { /* メインが松竹梅の梅のとき */
price += 500;
} else if (main == FOOD_TAKE) { /* メインが松竹梅の竹のとき */
price += 700;
} else { /* メインが松竹梅の松のとき */
price += 1000;
}
if (side == FOOD_SALAD) { /* サラダをサイドメニューにしたとき */
price += 200;
} else if (side == FOOD_POTATO) { /* ポテトをサイドメニューにしたとき */
price += 250;
} else {
/* サイドメニューなしのとき */
}
しかし、分岐を少なくとも1回実行すればよいため、次のような3つのテストデータを用意すれば、すべての分岐を通過します。すべてのテストパターンを調べるのではなく、あくまでも分岐を通過したかを調べる、ということが求められるのです。
解説
さて、上記を踏まえて今回の問題を考えてみます。
それぞれの条件の分岐から単純に考えると、それぞれ3通りなので、3×3×3×3=81通りのテストパターンを考える必要があるように見えます。しかし、実際にそれだけのテストを記述するのも面倒ですし、処理の数が増えるとテストにも時間がかかります。
そこで、できるだけこのテストパターンを減らすことを考えます。このとき、「直交表」という考え方があります。データ分析において、コンジョイント分析という分析方法で使われる方法ですが、これをソフトウェアのテストにも応用したものです。
今回の場合、次のような9通りを用意すれば充分です。
上記のデータでテストをした結果、No.2、No.4、No.9のテストが失敗し、その他のテストが成功したとします。すると、この3つに共通する条件としてdrinkがDRINK_ONLYのときだとわかります。
つまり、この条件で分岐するところに問題があることがわかります。
他の条件分岐も同様で、いずれの条件で問題があっても、それぞれ対応するテストが3つ失敗することになり、テスト結果から条件を特定できます。これは、どの列についてもそれぞれの値が3回ずつ登場し、しかも他の列と条件が重複しないように組み合わされているためです。
このため、正解は【選択肢3】となります。
このような表を考えるのは大変なように思えますが、実際には「L9直交表」と呼ばれる直交表がインターネット上などに公開されていますので、これを今回の条件に割り当てただけです。
他にも、L8直交表やL16直交表などさまざまなものが公開されています。ぜひテストデータを作成するときに使ってみてください。
エンジニアスタイルでは、今後もあなたのスキルの振り返りになるような問題を出題予定です。問題のレベルや出題範囲は随時拡大予定ですので、今後もぜひ解いてみてくださいね。
【出題・解説者】
増井 敏克さん
増井技術士事務所代表。技術士(情報工学部門)。情報処理技術者試験にも多数合格。ビジネス数学検定1級。「ビジネス」×「数学」×「IT」を組み合わせ、コンピューターを「正しく」「効率よく」使うためのスキルアップ支援や、各種ソフトウェアの開発、データ分析などを行う。著書に『プログラマを育てる脳トレパズル 遊んでおぼえるPythonプログラミング&アルゴリズム』『もっとプログラマ脳を鍛える数学パズル アルゴリズムが脳にしみ込む70問』『プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問』『図解まるわかり アルゴリズムのしくみ』(以上、翔泳社)などがある。