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

» 2017年04月24日 11時00分 公開

3.MinUnitとは

 近年、アジャイル技法を採用する組織が急増するに従い、「単体テストフレームワーク」と呼ぶ単体テストを支援するツールが広く出回るようになりました。このフレームワークを使うと、プロジェクトが違ってもが同じ方法でテストができます。単体テストフレームワークでは、テスト・コード(テストをするためのプログラム)を書いてテストします。C言語のassert関数みたいなものとお考えください。

 単体テストフレームワークは、大抵の言語向けに実装されており、多種多様です。これをまとめて「xUnit」と呼びます。例えば、Java言語用の単体テストフレームワークの「JUnit」が代表格で、多くの現場で導入しています。組み込み業界でも、数は少ないのですがxUnitを使っている組織もあります。

 今回紹介するMinUnitは、他と異なり、最小限の機能だけを備えたC言語用の単体テストフレームワークです。詳細は後述しますが、中身は、改行を含めるとたった4行しかなく、実装したコードを簡単に確認できます。今回、MinUnitでの単体テストを解説します。

4.動作環境の整備

 本テスト・ツールを使う前準備として、以下の環境を構築してください。

  1. Cコンパイラの導入(「MinGW」と「gcc」の環境構築)
  2. MinUnitのダウンロード

 Cコンパイラの導入は非常に面倒ですが、じっと我慢してやりましょう。既に導入済みの方は、飛ばして結構です。なお、Cコンパイラの導入方法は、いろいろありますので、各自好きな方法で導入してください。

4.1 環境構築(MinGW&gcc)

 C言語用のツールなので、C言語の環境構築をします。今回は、MinGW(Minimum GNU for Windows)とgcc(GNU C Compiler)で構築することにします。まず、MinGWのWebサイトからインストーラをダウンロードしてください。

 インストーラを実施すると以下の画面になります(図1(左))。

図1 図1 セットアップ画面(左)、ディレクトリ設定画面(右)(クリックで拡大)

 図1(左)は、インストーラを実行した際の画面です。「Install」を選択すると、インストールディレクトリなどを設定する画面(図1(右))が表示されます。「Continue」を選択すると図2となります。

図2 図2 ダウンロードとMinGWインストールマネジャー

 図2は、インストールの進行画面を表したものです。右上の部分が100%となったら、「Continue」を選択します。選択後、図3が出てきます。

図3 図3 MinGWインストールマネジャー

 図3では、用途に合わせてパッケージをインストールします。今回は、「mingw32-base」と「mingw32-gcc-g++」にチェックを入れてください。その後、左上のメニューバーの「installation」から、「Apply Changes」を選択します。選択後、図4(左)が出ます。

図4 図4 Schedule of Pending Action画面(左)、Applying Scheduled Changes(右)(クリックで拡大)

 図4(左)の画面で、「Apply」を選択してください。図4(右)が表示され、「Close」を押すと、MinGWとgccのダウンロードは終了です。続いて、パスを設定します。

 Windows7の場合は、「コントロールパネル」→「システムの設定」→「システム」→「システムの詳細設定」から図5(左)の「システムのプロパティ」画面を開きます。

図5 図5 システムのプロパティ(左)、「環境変数」画面(右)(クリックで拡大)

 図5(左)の「環境変数(N)」を選択し、図5(右)の「環境変数」画面を開きます。下にある「システム環境変数(S)」の「PATH」欄を選択状態にし、「編集(I)」を選択します。末尾に、パスを指定し、「OK」を選択すれば終了です。

 インストールの確認は、スタートメニューの「コマンドプロンプト」を開き、「gcc --version」と入力すると確認できます。図6のように表示されればOKです。

図6 図6 gccのバージョン確認

4.2 MinUnitの導入

 次に、MinUnitを導入します。MinUnitのWebサイトへ行き、リスト1に示すソースコードをコピーして、minunit.hとしてファイルを作成してください。

/* 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の中身

4.3 テスト対象の関数のセット

 次に、単体テストの対象となるソースコード(関数)をセットします。今回、リスト2に示した「test.c」の中に、単体テストを実施する関数を2つセットします。テスト対象とする関数は、足し算する関数(sum)と、引き算の関数(sub)です。足し算関数と引き算関数を入れたtest.cをminunit.hと同じディレクトリに保存してください。

#include<stdio.h>
#include "minunit.h"	
int tests_run = 0;	//テストケース数
int sum(int a, int b) {	return a + b; } //足し算を行う関数
int sub(int a, int b) {	return a - b; } //引き算を行う関数
static char * test_sum() {	//sum関数をテストする関数
	mu_assert("error sum function != 10",sum(3,7) == 10);
	return 0;
}
static char * test_sub() {	//sub関数をテストする関数
	mu_assert("error sub function != 5",sub(6,1) == 5);
	return 0;
}
static char * all_tests() {	//テストを実施する関数
	mu_run_test(test_sum);
	mu_run_test(test_sub);
	return 0;
}
int main(int argc, char **argv) {
	char *result = all_tests();
	if (result != 0) { printf("%s\n",result); }
	else { printf("ALL OK! \n"); }
	printf("test num: %d\n",tests_run);
	return result != 0;
}
リスト2 テスト対象のファイル(test.c)

 minunit.hとtest.cの保存完了後、MinGWから以下のコマンドでコンパイルし、実行します。

  • コンパイルコマンド:gcc test.c
  • 実行コマンド:a.exe

 実行結果が、図7のように表示されれば環境構築完了です。

図7 図7 実行結果

Copyright © ITmedia, Inc. All Rights Reserved.