MinUnitがどのように動作するのかを理解するため、minunit.hとtest.cの中身を見ましょう。
リスト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の中身です。中を見ると、関数マクロで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)と記述すると、以下の意味になります。
mu_run_test関数は、引数testに代入した関数を呼び出します。messageが真の場合は、messageを返します。使い方は、「mu_run_test(テストしたい関数名)」のように記述します。mu_assertでテストが通らなかった場合は、messageを返す仕組みです。
テストの対象となる関数を解説します。リスト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!」と出力されます。
MinUnitの内容を以下に簡単にまとめます。
(1)minunit.h
minunit.hには、2つの関数mu_assertとmu_run_testがあります。
(2)テスト実装
テスト項目を記述する場合、mu_assert("文字列",期待結果)を書き、テストします。
テストを実行する場合、mu_run_test(関数名)を記述し、実行します。
(3)結果の確認
mu_assertの期待結果が真の場合、テスト成功となる。
mu_assertの期待結果が偽の場合、テスト失敗となる。
今回は、単体テストフレームワークの「MinUnit」を紹介しました。このツールの強みは、実装したコードを簡単に確認できる点です。皆さまなら、すぐに使いこなせるでしょう。
本ツールがシンプルすぎると感じた方は、使いやすいようにminunit.hを修正すると良いでしょう。4行しかありませんので、修正も簡単です。このコラムをきっかけに、単体テストに興味を持っていただければ幸いです。
次回は、他のxUnit系ツールを取り上げます。
[1]Interface 2015年11月号、CQ出版
[2]「知識ゼロから学ぶソフトウェアテスト[改訂版]」(高橋寿一、2013年、翔泳社)
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.