タダでソフト開発の生産性と品質を上げる方法(4):単体テストで威力を発揮する「MinUnit」山浦恒央の“くみこみ”な話(94)(3/3 ページ)

» 2017年04月24日 11時00分 公開
前のページへ 1|2|3       

5.MinUnitの動作原理

 MinUnitがどのように動作するのかを理解するため、minunit.hとtest.cの中身を見ましょう。

5.1 minunit.hの解説

 リスト1を再掲載します。

/* file: minunit.h */
 #define mu_assert(message, test) do { if (!(test)) return message; } while (0)
 #define mu_run_test(test) do { char *message = test(); tests_run++; \
                                if (message) return message; } while (0)
 extern int tests_run;
リスト1 minunit.hの中身

 リスト1はminunitの中身です。中を見ると、関数マクロでmu_assertとmu_run_test関数を記述しています。改行を含めるとたった4行しかありませんね。表1に2つの関数の詳細を記します。

関数名 引数 詳細
mu_assert(期待結果を確認する関数) Message testが偽の場合、messageを返却する
test
mu_run_test(テストを実行する関数) test testに記載された関数を呼び出す。messageが真の場合、messageを返却する
表1 機能詳細

 mu_assert関数は、引数testが偽の場合は、messageを返す関数です。「プログラムで記述したテスト項目」と考えると分かりやすいでしょう。例えば、mu_assert("a not equal 3", a = 3)と記述すると、以下の意味になります。

  • a=3の場合、testが真となりテストが通る
  • aが3以外の場合、testが偽となり、「a not equal 3」がmessage変数に代入される

 mu_run_test関数は、引数testに代入した関数を呼び出します。messageが真の場合は、messageを返します。使い方は、「mu_run_test(テストしたい関数名)」のように記述します。mu_assertでテストが通らなかった場合は、messageを返す仕組みです。

5.2 test.cの解説

 テストの対象となる関数を解説します。リスト2を再度見ましょう。まず、以下をご覧ください。

int sum(int a, int b) {	return a + b; } //足し算を行う関数
int sub(int a, int b) {	return a - b; } //引き算を行う関数

 2つの引数に対し、足し算と引き算を実施する関数です。ただの足し算と引き算をするだけですが、本例ではこの関数がテストの対象です。

 以下のtest_sum()関数を見てください。

static char * test_sum() {	//sum関数をテストする関数
	mu_assert("error sum function != 10",sum(3,7) == 10);
	return 0;
}

 これは、sum関数のテスト項目を記述した関数です。普通の足し算が正しく実装されていれば、3と7を足すと10となるはずです。mu_assert関数で「sum(3,7)==10」とすると、3と7をsum関数に渡した時の結果が評価されます。また、sum(3,7)==10とならない場合は、「error sum function != 10」と表示されます。

 以下のall_tests()関数をご覧ください。テスト項目を記述した関数を実行するものです。例では、test_sumとtest_sub関数を記述することで、2つのケースを実行しています。

static char * all_tests() {	//テスト実施する関数
	mu_run_test(test_sum);
	mu_run_test(test_sub);
	return 0;
}

 続いて、以下の文を見てください。

char *result = all_tests();
if (result != 0) { printf("%s\n",result); }
else { printf("ALL OK! \n"); }

 ここは、main関数内の処理を記述したものです。all_tests()関数を呼び出し、結果をresultに代入します。テストが通らない項目があった場合は、resultの内容を出力し、全て通れば「ALL OK!」と出力されます。

6.まとめ

 MinUnitの内容を以下に簡単にまとめます。

(1)minunit.h

 minunit.hには、2つの関数mu_assertとmu_run_testがあります。

(2)テスト実装

 テスト項目を記述する場合、mu_assert("文字列",期待結果)を書き、テストします。
 テストを実行する場合、mu_run_test(関数名)を記述し、実行します。

(3)結果の確認

 mu_assertの期待結果が真の場合、テスト成功となる。
 mu_assertの期待結果が偽の場合、テスト失敗となる。

7.終わりに

 今回は、単体テストフレームワークの「MinUnit」を紹介しました。このツールの強みは、実装したコードを簡単に確認できる点です。皆さまなら、すぐに使いこなせるでしょう。

 本ツールがシンプルすぎると感じた方は、使いやすいようにminunit.hを修正すると良いでしょう。4行しかありませんので、修正も簡単です。このコラムをきっかけに、単体テストに興味を持っていただければ幸いです。

 次回は、他のxUnit系ツールを取り上げます。

参考文献

[1]Interface 2015年11月号、CQ出版

[2]「知識ゼロから学ぶソフトウェアテスト[改訂版]」(高橋寿一、2013年、翔泳社)


【 筆者紹介 】
山浦 恒央(やまうら つねお)

東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)


1977年、日立ソフトウェアエンジニアリングに入社、2006年より、東海大学情報理工学部ソフトウェア開発工学科助教授、2007年より、同大学大学院組込み技術研究科准教授、2016年より非常勤講師。

主な著書・訳書は、「Advances in Computers」 (Academic Press社、共著)、「ピープルウエア 第2版」「ソフトウェアテスト技法」「実践的プログラムテスト入門」「デスマーチ 第2版」「ソフトウエア開発プロフェッショナル」(以上、日経BP社、共訳)、「ソフトウエア開発 55の真実と10のウソ」「初めて学ぶソフトウエアメトリクス」(以上、日経BP社、翻訳)。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.