CUnit@単体テストはじめ
はじめに
自作kernel作るにあたってDebug機能が欲しくなり。
snprintfが必要となり。
やっぱlibc欲しいなとlibcを作り始め(newlib使ってもよかったんだけど、自作楽しいので)。
snprintfを作ったのだが、これ動くのか?と。
単純に作業量2倍になるので、趣味でテスト系は避けてきたのだけど、やっぱ避けて通れないよねテスト。
というわけで、CUnit使うか・・・の備忘録。
ライブラリインストール
sudo apt-get install libcunit1-dev
テスト対象コード例(target.c)
int target_func( void )
{
return 5;
}
テストコード例
#include <CUnit/CUnit.h>
#include <CUnit/Basic.h>
#include "target.c"
void test_func_1( void )
{
ret = target_func();
CU_ASSERT_EQUAL( ret, 5 );
}
int main( void )
{
CU_pSuite suite;
/* テストレジストリ初期化 */
CU_initialize_registry();
/* テストスイート追加 */
suite = CU_add_suite( "TestSuite", NULL, NULL );
/* テスト追加 */
CU_add_test( suite, "test1", test_func_1 );
/* テスト実行 */
CU_basic_set_mode( CU_BRM_VERBOSE );
CU_basic_run_tests();
/* テストレジストリ削除 */
CU_cleanum_registry();
return 0;
}
static関数をテストしたい場合も考慮して、テスト対象コードをinclude。
サブ関数をstub化
サブ関数をstub化する方法はいくつかあるが、テスト対象コードをいっさい変えずにやるのは無理っぽい。
下記が最善策かなぁ。検索してもいい案が出てこないので自分で考えてみた。
#ifndef CALL
#define CALL( a ) a
#endif
#ifndef PROTO
#define PROTO( a, b ) a b
#endif
PROTO( extern int, target_sub( void ) );
int target_sub( void )
{
return 5;
}
int target_func( void )
{
return CALL( target_sub() );
}
テストコードは、テスト対象コードのincludeの前に下記を定義しておく
#define CALL( a ) stub_##a
#define PROTO( a, b ) a stub_##b
テスト対象コードincludeの後に下記を定義する
int stub_target_sub( void )
{
return 5;
}
コメント
コメントを投稿