CUnit@単体テストはじめ

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

コメント

このブログの人気の投稿

プライバシーポリシー

git@よく使うコマンド早見表

MochiOS@仮想ファイルシステムの作成part10