ふにゃるんv2

もとは、http://d.hatena.ne.jp/Wacky/

最小なユニットテストフレームワーク

今日も今日とて、ネットでぐるぐる〜。

と、面白そうなネタを見つけたんですよ。

で、ユニットテストのコードが、↓以下の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++の例外に対応するって方法もあるね。まぁ、そこまでこだわる必要も無いかな。