タダでソフト開発の生産性と品質を上げる方法(4):単体テストで威力を発揮する「MinUnit」:山浦恒央の“くみこみ”な話(94)(3/3 ページ)
「タダでソフト開発の生産性と品質を上げる方法」の第4回。今回は、単体テストで威力を発揮する「MinUnit」を紹介する。
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の中身です。中を見ると、関数マクロで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年、翔泳社)
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「山浦恒央の“くみこみ”な話」バックナンバー
- タダでソフト開発の生産性と品質を上げる方法(3):意外に使えるフリーツール「PictMaster」を使いこなす
「タダでソフト開発の生産性と品質を上げる方法」の第3回。今回は、前回紹介した無料の組合せテスト自動生成ツール「PictMaster」を使いこなす応用編だ。 - タダでソフト開発の生産性と品質を上げる方法(2):フリーの組合せテスト自動生成ツール「PictMaster」
「タダでソフト開発の生産性と品質を上げる方法」の第2回。今回は、ソースコードを簡単に分析し、計測するフリーの組合せテスト自動生成ツール「SourceMonitor」を紹介します。 - タダでソフト開発の生産性と品質を上げる方法(1):意外に使える無料のソースコード測定ツール「SourceMonitor」
「“くみこみ”な話」の新シリーズが開幕。テーマは「タダでソフト開発の生産性と品質を上げる方法」です。第1回は、ソースコードを簡単に分析し、計測するフリーツール「SourceMonitor」を紹介します。 - 猫でも分かるソフトウェアのテスト網羅(6):パス・カバレッジの王者の意外な弱点
「制御パステスト」をテーマとする「猫でも分かるソフトウェアのテスト網羅」シリーズの第6回では、前回に引き続き「C2カバレッジ」を取り上げます。パス・カバレッジの王者ともいわれる「C2カバレッジ」ですが弱点がないわけではありません。 - 猫でも分かるソフトウェアのテスト網羅(5):C2カバレッジはエベレスト登山か?
「制御パステスト」をテーマとする「猫でも分かるソフトウェアのテスト網羅」シリーズの第5回では「C2カバレッジ」を取り上げます。C1より網羅性が高いので、高信頼性を求めるソフトウェア開発の管理者や発注者に好まれますが、実際にテストを行うプログラマにとってエベレスト登山並みの大変さになる可能性もあるので注意が必要です。