« MinUnit -- a minimal unit testing framework for C | トップページ | 7つの習慣の研修 »

Stack Unit Testing Framework for C (SUtest)

MinUnitを改良して、C言語用の単体テストツールを作ってみた。判定ロジックはMinUnitの3行マクロでそのまま使わせてもらって、

  • テストスイート読み込み

  • テストコマンド用ソース作成

  • テストコマンドコンパイル

  • テストコマンド実行&結果出力

  • という一連の作業を自動化してみた。

    テストスイートはテキスト形式の超簡単な形式で、どんどんテストケースを積み上げられる形。積み上げるのでStack Unit Testing Framework for C(SUtest)なんて名付けてみた。笑

    自分で試しに導入してみたんだが、コレが意外にも使える。社内で誰か試してみて感想が聞きたいぜ。

    テストスイートはこんな感じ。関数名、復帰値の変数型、条件式、引数、・・・

    /*
    # cat2string(); 文字列と数字を結合して文字列にする
    cat2string|char*|result == NULL|NULL|0
    cat2string|char*|result == NULL|NULL|1024
    cat2string|char*|result == NULL|NULL|-1
    cat2string|char*|result == NULL|NULL|-1024
    cat2string|char*|strcmp(result, "abc0") == 0|"abc"|0
    cat2string|char*|strcmp(result, "abc1024") == 0|"abc"|1024
    cat2string|char*|strcmp(result, "abc-1") == 0|"abc"|-1
    cat2string|char*|strcmp(result, "abc-1024") == 0|"abc"|-1024
    */


    んで、テストコマンド用ソースはこんな感じ。

    #include "hoge.h"
    #include "sutest.h"

    int tests_run = 0;

    static char* test_sutest0(){
        char* result = (char*)cat2string(NULL, 0);
        su_assert("error!!: LINE=[41]", result == NULL );
        return 0;
    }

    static char* test_sutest1(){
        char* result = (char*)cat2string(NULL, 1024);
        su_assert("error!!: LINE=[42]", result == NULL );
        return 0;
    }

    static char* test_sutest2(){
        char* result = (char*)cat2string(NULL, -1);
        su_assert("error!!: LINE=[44]", result == NULL );
        return 0;
    }

    static char* test_sutest3(){
        char* result = (char*)cat2string(NULL, -1024);
        su_assert("error!!: LINE=[45]", result == NULL );
        return 0;
    }

    static char* test_sutest4(){
        char* result = (char*)cat2string("abc", 0);
        su_assert("error!!: LINE=[47]", strcmp(result, "abc0") == 0 );
        return 0;
    }

    static char* test_sutest5(){
        char* result = (char*)cat2string("abc", 1024);
        su_assert("error!!: LINE=[48]", strcmp(result, "abc1024") == 0 );
        return 0;
    }

    static char* test_sutest6(){
        char* result = (char*)cat2string("abc", -1);
        su_assert("error!!: LINE=[50]", strcmp(result, "abc-1") == 0 );
        return 0;
    }

    static char* test_sutest7(){
        char* result = (char*)cat2string("abc", -1024);
        su_assert("error!!: LINE=[51]", strcmp(result, "abc-1024") == 0 );
        return 0;
    }

    int testcase_count = 63;

    static char* all_tests(){
        su_run_test(test_sutest0);
        su_run_test(test_sutest1);
        su_run_test(test_sutest2);
        su_run_test(test_sutest3);
        su_run_test(test_sutest4);
        su_run_test(test_sutest5);
        su_run_test(test_sutest6);
        su_run_test(test_sutest7);
        return 0;
    }


    int main(int argc, char **argv) {
        char *message = all_tests();
        if (message != 0) {
            printf("%s\n", message);fflush(stdout);
        }
        else {
            printf("ok\n");fflush(stdout);
        }
        printf("Testcase : %d\n", testcase_count);fflush(stdout);
        printf("Tests run : %d\n", tests_run);fflush(stdout);

        return message != 0;
    }

    このテストコマンド用ソースをコンパイルして、実行するのだ。
    # コンパイルが system() なんでちょいとしょぼい感じかも。

    自作のヘッダーを使ったり、memset()などを指定したりすればかなり守備範囲が広がる。

    |

    « MinUnit -- a minimal unit testing framework for C | トップページ | 7つの習慣の研修 »

    コメント

    この記事へのコメントは終了しました。

    トラックバック


    この記事へのトラックバック一覧です: Stack Unit Testing Framework for C (SUtest):

    « MinUnit -- a minimal unit testing framework for C | トップページ | 7つの習慣の研修 »