今日も今日とて、ネットでぐるぐる〜。
- おそらく世界一導入の簡単なUnit Testフレームワーク
http://vimrc.hp.infoseek.co.jp/diary/2006-02.html#2006-02-07-3
と、面白そうなネタを見つけたんですよ。
- JTN002 - MinUnit -- a minimal unit testing framework for C
http://www.jera.com/techinfo/jtns/jtn002.html#Source_Code
で、ユニットテストのコードが、↓以下の3行。
/* 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;
mu_assertが診断用のマクロで、mu_run_testがテストランナーに相当する模様。
面白いので、ちょっと弄ってみたっすよ。
/* file: minunit.h */ // 診断用マクロ #define mu_assert(test) \ do { \ if(!(test)){ sprintf(test_buff, "ERROR: %s\nFILE:%s\nLINE:%d\n", #test, __FILE__, __LINE__); return test_buff; } \ else { printf("PASSED: %s\n", #test); } \ } while(0) // テストランナーマクロ #define mu_run_test(test) \ do { char *message = test(); tests_run++; if (message) return message; } while (0) extern int tests_run; extern char test_buff[128];
使い方のサンプルは、以下の通り。
#include <stdio.h> #include <conio.h> #include "minunit.h" int tests_run; char test_buff[128]; char* test1(void) { mu_assert(1 == 1); mu_assert(1 != 1); return 0; } char* all_tests(void) { mu_run_test(test1); return 0; } int main(int argc, char* argv[]) { char *result = all_tests(); if (result != 0){ printf("%s\n", result); } else { printf("ALL TESTS PASSED\n"); } printf("Tests run: %d\n", tests_run); getch(); return 0; }
実行例ね。
PASSED: 1 == 1 ERROR: 1 != 1 FILE:F:\Wacky\test.cpp LINE:41 Tests run: 3
ちょっとした工夫で、単体テストが出来ちゃうもんなんですなぁ。
後は、C++の例外に対応するって方法もあるね。まぁ、そこまでこだわる必要も無いかな。