2011/04/17

CUnit

オリジナルのCUnitよりも、Google が拡張したCUnitの方が導入が簡単。
Google版にはJUnitのXML形式のレポートを生成する拡張がある。
試したバージョンはオリジナルの2.1-0、Google版の1.1.1。

・オリジナルのCUnit 2.1 のビルド方法

$ dos2unix *
$ libtoolize
$ aclocal
$ autoconf
$ automake --add-missing
$ ./configure --prefix=/usr/local --enable-curses
$ make


・Google版CUnitでJUnitのXML形式のレポートを生成する方法

CU_automated_enable_junit_xml(CU_TRUE);
CU_automated_run_tests();


・Google版CUnitでHudsonのレポートを表示するには

Hudson でレポートを表示するにはJUnit形式で出力して、
以下のスクリプトを通して修正する必要がある。

cunit-to-junit:

#!/usr/bin/perl
while (<>) {
    next if (/<cunit_testsuites>/);
    next if (/<\/cunit_testsuites>/);
    next if (/<cunit_footer>/);
    next if (/<\/cunit_footer>/);
    print;
}


・Google版CUnit サンプル

#include <stdio.h>  
#include <CUnit/CUnit.h>
#include <CUnit/Console.h>
#include <CUnit/CUCurses.h>
#include <CUnit/Automated.h>
#include <CUnit/Basic.h>
#include "config.h"

void setup_test_suite();

void test_01() {
FILE *fp;
fp = fopen("test.log", "w");
CU_ASSERT_PTR_NOT_NULL(fp);
fprintf(fp, "PARAMS=%s %s %s\n", PARAM_A, PARAM_B, PARAM_C);
fclose(fp);
}

void test_02() {
}

void test_03() {
if (strcmp(PARAM_B, "B3") == 0) {
CU_FAIL("PARAM_B is B3");
}
}

enum {
MODE_CONSOLE,
MODE_CURSES,
MODE_AUTOMATED,
MODE_BASIC,
};

int main(int argc, char **argv) {

int mode = MODE_CURSES;

if (argc >= 2) {
char *arg = argv[1];
if (strcmp(arg, "-c") == 0) {
mode = MODE_CONSOLE;
} else
if (strcmp(arg, "-r") == 0) {
mode = MODE_CONSOLE;
} else
if (strcmp(arg, "-a") == 0) {
mode = MODE_AUTOMATED;
} else
if (strcmp(arg, "-b") == 0) {
mode = MODE_BASIC;
} else {
fprintf(stderr, "uknown option: %s\n", arg);
return 1;
}
}

CU_initialize_registry();
CU_automated_enable_junit_xml(CU_TRUE);
CU_set_output_filename("cunit");
setup_test_suite();

switch (mode) {
case MODE_CONSOLE:
CU_console_run_tests();
break;
case MODE_CURSES:
CU_curses_run_tests();
break;
case MODE_AUTOMATED:
CU_automated_run_tests();
break;
case MODE_BASIC:
(void)CU_basic_run_tests();
break;
}

CU_cleanup_registry();

return 0;
}

void setup_test_suite() {
CU_pSuite suite1;

suite1 = CU_add_suite("TestSuite1", NULL, NULL);
CU_add_test(suite1, "test_01", test_01);
CU_add_test(suite1, "test_02", test_02);
CU_add_test(suite1, "test_03", test_03);
}

0 件のコメント:

コメントを投稿