MinUnitの存在感

JTN002 - MinUnit -- a minimal unit testing framework for C
C++だとCppUnitとかあるんだけど,C言語には何かテスト用ライブラリがあるのかなぁと探して見つけたのがこれ.

これの凄いのはなんと言っても

#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;

中身はこの3行だけというお手軽さ(minunit.hとして保存).やってることは超簡単で,渡した条件式を評価して偽ならメッセージをreturnするだけ.でもこれでもそれなりに使える.

static char *
all_tester() {
    mu_run_test(test_foo);
    mu_run_test(test_bar);
    return NULL;
}

static char *
test_foo() {
    mu_assert("True!", 1);
    return NULL;
}

static char *
test_bar() {
    mu_assert("False!", 0);
    return NULL;
}

公式のサンプルを更に簡単にしたけど,all_testerはより小さく目的別にスイートを作成できるし,ユニットテストなら十分(必要であればtests_run変数を通してテストスイートの数をカウント出来る).問題としては,デフォルトだとmu_run_testのマクロは「関数名 + ()」とベタ書きで引数を渡せないので,全ての値をグローバル経由で参照するしかない.テスト用コードなら問題ないと思うけど,コードに埋め込むならプリプロセッサで分割とかする必要があるかも.
ま,確かにテストを意識したりするのが目的であれば,複雑なフレームワークはいらないよなぁと思った.