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()などを指定したりすればかなり守備範囲が広がる。
最近のコメント