連載
バグ検出ドリル(20)「三角形判定」のテスト項目を設計できますか【出題編】:山浦恒央の“くみこみ”な話(120)(3/3 ページ)
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第20回と第21回は、「三角形を判定」するプログラムのテスト項目設計がテーマです。まずは今回の出題編を読んで、じっくり問題に取り組んでみてください。
4.プログラム
/* 三角形判定プログラム TrinagleHandler.c */ #define DIGITS 4 #include <stdio.h> #include <string.h> #include <stdlib.h> void triangle_handler(int side1, int side2, int side3); void input(int* val); void isosceles(); void equilateral(); void scalene(); /*********************** * 関数名: main * 機能 : (1)辺1〜3を初期化する。 (2)辺1〜3の値をコンソールからそれぞれ取得する。 (3)三角形を判定する。 * 引数 : 辺の値 * 戻り値: なし ***********************/ int main() { //辺1、辺2、辺3を初期化 int side1 = 0; int side2 = 0; int side3 = 0; //辺1、辺2、辺3を入力 input(&side1); input(&side2); input(&side3); //三角形を判定する triangle_handler(side1, side2, side3); return 0; } /*********************** * 関数名: input * 機能 : (1)コンソールから文字列を取得する。 (2)文字列の末尾を'\n'から'\0'にする (3)入力桁が4桁以上の場合は、プログラムを終了する。 (4)取得した文字列をchar型から、int型に変換する * 引数 : 辺の値 * 戻り値: なし ***********************/ void input(int* val) { int i; int len = 0; char str[DIGITS]; //辺を入力 fgets(str, sizeof(str), stdin); //文字列の長さを取得 len = strlen(str) - 1; //文字列の末尾の改行を'\0'に置き換える if (str[len] == '\n') { str[len] = '\0'; } else { //入力桁数が多い場合は、プログラム終了する while (getchar() != '\n') { printf("入力エラー\n"); exit(1); } } //入力した文字列に0〜9が含まれていない場合は、 //プログラムを終了する for (i = 0; i < len; i++) { if (!(str[i] >= '0' && str[i] <= '9')) { printf("入力エラー\n"); exit(1); } } //文字列を整数型に変換する *val = atoi(str); } /*********************** * 関数名: triangle_handler * 機能 : 3辺から三角形の種類を判定する * 引数 : 辺1、辺2、辺3 * 戻り値: なし ***********************/ void triangle_handler(int side1, int side2, int side3) { //正三角形、二等辺三角形、不等辺三角形を判定する if ((side1 + side2 >= side3) && (side2 + side3 >= side1) && (side3 + side1 >= side2)) { if (side1 == side2 && side2 == side3 && side3 == side1) { //正三角形の表示 equilateral(); } else if ((side1 == side2) || (side2 == side3) || (side3 == side1)){ //二等辺三角形の表示 isosceles(); } else { //不等辺三角形の表示 scalene(); } } else { printf("三角形ではありません\n"); } } /*********************** * 関数名: equilateral * 機能 : 正三角形のメッセージを表示 * 引数 : なし * 戻り値: なし ***********************/ void equilateral() { printf("正三角形\n"); } /*********************** * 関数名: isosceles * 機能 : 二等辺三角形のメッセージを表示 * 引数 : なし * 戻り値: なし ***********************/ void isosceles() { printf("二等辺三角形\n"); } /*********************** * 関数名: scalene * 機能 : 不等辺三角形のメッセージを表示 * 引数 : なし * 戻り値: なし ***********************/ void scalene() { printf("不等辺三角形\n"); }
リスト2 三角形判定プログラム
5.実行結果例
下記に実行結果の例を示す。
5.1 入力手順
下記に、入力手順例を示す。
- 5を入力し、エンターキーを入力した
- 6を入力し、エンターキーを入力した
- 7を入力し、エンターキーを入力した
- 出力結果が、不等辺三角形と表示された
5.2 上記の入力手順を実行した際の結果
5 6 7 不等辺三角形
リスト3 三角形判定プログラムへの入力と実行結果
4.自己採点シート
今回の自己採点シートを示します。
問題 | 項目 | 配点(点) |
---|---|---|
三角形判定プログラム | 問題文を一通り読んだ | 50 |
テスト項目を作成した | 40 | |
机上または実機テストを行い、バグを検出できた | 10 | |
表2 自己採点シート |
5.終わりに
ソフトウェアテストの大変なところは、仕様やプログラムを作成する以上に、「検証」という「後戻りの作業」が多くあるためです。皆さんも、毎日、悪戦苦闘していることでしょう。
今回は、三角形判定問題を出題しました。皆さんは、システマチックにテスト項目を作成し、バグを見つけることができたでしょうか。また、実際に机上、実機で確認した方は、バグを見つけることができたでしょうか。次回、解答を掲載しますので、結果を確かめてください。
【 筆者紹介 】
山浦 恒央(やまうら つねお)
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
1977年、日立ソフトウェアエンジニアリングに入社、2006年より、東海大学情報理工学部ソフトウェア開発工学科助教授、2007年より、同大学大学院組込み技術研究科准教授、2016年より非常勤講師。
主な著書・訳書は、「Advances in Computers」 (Academic Press社、共著)、「ピープルウエア 第2版」「ソフトウェアテスト技法」「実践的プログラムテスト入門」「デスマーチ 第2版」「ソフトウエア開発プロフェッショナル」(以上、日経BP社、共訳)、「ソフトウエア開発 55の真実と10のウソ」「初めて学ぶソフトウエアメトリクス」(以上、日経BP社、翻訳)。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「山浦恒央の“くみこみ”な話」バックナンバー
- バグ検出ドリル(19)たかが1円されど1円……1円足りないバグの恐怖
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第19回の問題は、商品と個数から合計金額を求めるプログラムのバグです。なぜか1円だけ合わない、このバグの原因を突き止めよう! - バグ検出ドリル(18)IoT時代だからこそ重要、単純でも検出が難しい通信系バグ
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第18回の問題は、相互に通信する機器のソフトウェアのバグです。IoT時代を迎えて利用場面が増えている、通信系のバグを見つけ出しましょう! - バグ検出ドリル(17)「よくある単純なバグ」だからこそ見つけにくい
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第17回の問題は、前回と同じ音楽プレーヤーのプログラムから出題します。「よくある単純なバグ」が潜んでいますが、見つけ出せますか? - バグ検出ドリル(16)音楽プレーヤーに潜むバグを見つけ出せ
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第16回の問題は「簡単なバグなのに、なかなか見つからない」バグです。何で見つからないんだ! - バグ検出ドリル(15)なぜ「山田三郎」が「まだまだ天田三郎」に化けるのか
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第15回の問題は、「思った通りに動いてくれないプログラム」のバグです。少しはプログラマーに忖度してくれよ!