CUnit

ftjamのインストール方法(Windows BorlandC++5.5)

1. ftjam をダウンロードする。
http://www.freetype.org/jam/index.html
ftjam-2.3.5-win32.zip
2. 展開するとjam.exeが出てくるので、PATHの通っている場所に配置する。
3. 以下の環境変数を設定する。

set JAM_TOOLSET=BORLANDC
set BORLANDC=c:\home\bin\BCC55

CUnitのインストール方法(Windows BorlandC++5.5)

1. CUnitをダウンロードする。
http://sourceforge.net/projects/cunit/
cunit-2.0-1.zip
2. 展開する。
3. 展開したルートの Jamrules ファイルを編集する。
24行目の「prefix」に、インストール先を指定する。パスセパレータが「\\」である点に注意。
4. 展開したルートで jam install を実行する。

テストスイート自動生成スクリプト

CUnit用のテスト関数を、ディレクトリ中の全ソースファイル(*_test.c)から抜き出してきて、すべてをテストスイートに登録するようなawkスクリプト
標準出力に、すべてのテストを実行するようなテストモジュールのソースファイルを出力する。
カレントディレクトリからコマンドライン引数に指定されたファイルを調べて、

void test_xxxx(void) {

というパターンの関数名を抜き出す。スイートはファイルごとに作り、その中にテスト関数をすべて追加する。

BEGIN {
	idx = 0
	for(i = 1; i < ARGC; i++) {
		filename = ARGV[i]

		suite_name = filename
		read_tests(filename)
	}
	write_test_main()
}

function read_tests(filename,   func_name) {
	while((getline < filename) > 0) {
		if($0 ~ /^void +test_[^(]+\(void\)/) {
			func_name = gensub(/^void +(test_[^(]+)\(void\).*$/, "\\1", "")

			suite_names[idx] = suite_name
			func_names[idx] = func_name
			idx++
		}
	}

	close(filename)
}

function write_test_main() {
	printf "#include \"CUnit/CUnit.h\"\n"
	printf "#include \"CUnit/Basic.h\"\n"
	printf "\n"

	for(i = 0; i < idx; i++) {
		printf "void %s(void);\n", func_names[i]
	}
	printf "\n"

	printf "main() {\n"
	printf "\tCU_pSuite pSuite;\n"
	printf "\tCU_initialize_registry();\n"

	for(i = 0; i < idx; i++) {
		if(last_suite != suite_names[i]) {
			printf "\n"
			printf "\tpSuite = CU_add_suite(\"%s\", NULL, NULL);\n", suite_names[i]
			last_suite = suite_names[i]
		}
		printf "\tCU_add_test(pSuite, \"%s\", %s);\n", func_names[i], func_names[i]
	}

	printf "\n";
	printf "\tCU_basic_run_tests();\n";
	printf "\tCU_cleanup_registry();\n";
	printf "\treturn 0;\n";
	printf "}\n";
}

上記スクリプトを使ってテストを楽に実行するmakefile(Borland Make用)

TARGETをまともに設定してあげれば、

make test

一発で全テストを最新モジュールに対して実行する。
問題点は、

  • 毎回全テスト関数を調べなおすので、遅そう
  • コンパイルの依存関係はmakedepとかで生成しないといけない
  • コンパイルを全モジュールにしてないか?

というあたり。

CC=bcc32
CUNIT_PATH=c:\home\bin\CUnit

CFLAGS=-I$(CUNIT_PATH)\include -L$(CUNIT_PATH)\lib


test: test.exe
	test.exe

clean:
	del *.obj *.exe *.tds

test.c: *_test.c
	gawk.exe -f test_gen.awk $** > $*.c

test.exe: test.obj CBoard_test.obj CCell_test.obj CBoard.obj CCell.obj
	$(CC) $(CFLAGS) $** libcunit.lib -o$*.exe