●テストプログラム・テンプレート 【補足】 テストプログラムは、以下のツリー構造になります。 ・メイン関数(ソースファイル) ・テスト・グループ(ヘッダファイル、ソースファイル) ・テストケース(関数) 【使い方】 テストプログラムを新規作成するときは以下の手順を踏みます。 ・メインソースをコピーして作成します。(全てのセクションをコピーします) ・テスト・グループ(ヘッダ)をコピーして作成します。(全てのセクションをコピーします) ・テスト・グループ(ソース)をコピーして作成します。(全てのセクションをコピーします) ・すべての XXX と Xxx をモジュール名に置換します。 テスト・グループを追加するときは以下の手順を踏みます。 ・メインソースについて ・main 関数の enum の値と、switch ( iFunc ) の内容を修正します。 ・テスト・グループ(ヘッダ)について ・テスト・グループ(ヘッダ)をコピーして作成します。(全てのセクションをコピーします) ・(テスト・グループ)をテスト・グループ名に置換します。 ・すべての XXX と Xxx をモジュール名に置換します。 ・テスト・グループ(ソース)について ・テスト・グループ(ソース)をコピーして作成します。(全てのセクションをコピーします) ・(テスト・グループ)をテスト・グループ名に置換します。 ・すべての XXX と Xxx をモジュール名に置換します。 ・T_Xxx_Set_init、T_Xxx_Set_setup、T_Xxx_01 を作成します。 テストケースを追加するときは以下の手順を踏みます。 ・テスト・グループ(ヘッダ)について T_Xxx_02 のプロトタイプ宣言を追加します。 ・テスト・グループ(ソース)について ・T_Xxx_run の mTest 定数と switch ( iTest ) の内容を修正します。 ・テンプレートから T_Xxx_01 をコピーして、すべての Xxx をモジュール名に置換します。 ・(テストケース)をテストケース名に置換します。 ・テンプレートを元に各テストプログラム作成します。 ◆メインソースファイル /*********************************************************************** * <<< テスト・プログラム・メイン >>> ************************************************************************/ #include void main(void); int err( int code, char* msg ); /*********************************************************************** * <<< [main] メイン >>> ************************************************************************/ void main() { enum { iStartTest = 1, /* 初めにテストするテスト・グループ番号 */ nTest = 1 /* テスト・グループ数 */ }; int iFunc, iFunc0; Errors_Msg msgs[5]; Except3_Try trys[10]; Errors_MsgPool_init( Errors_MsgPool_getGlobl(), msgs, sizeof(msgs) ); Except3_init( trys, sizeof(trys) ); #ifndef ERRORS_CUT_DEBUG_TOOL Errors_setErrorHandler( err ); #endif /* srand( 1 ); */ #ifdef FOR_QUICK_TEST Errors_setStart( 1, &iFunc0 ); #else Errors_setStart( iStartTest, &iFunc0 ); #endif for ( iFunc = iFunc0; iFunc <= nTest; iFunc++ ) { switch ( iFunc ) { #ifdef USES_T_XXX case 1: T_Xxx_run(); break; #endif default: Errors_notSupport(); break; } } Errors_testCasePrintf( "" ); Errors_errPrintf( "###### Error count = %d ######", Errors_errCount ); } /*********************************************************************** * <<< [err] エラーハンドラ >>> ************************************************************************/ #ifndef ERRORS_CUT_DEBUG_TOOL int err( int code, char* msg ) { if ( code == Errors_ASSERT ) Errors_break( 0xAAAA ); if ( code != Except3_Err_OutOfTry ) c_throw( Error_Msg_getGlobl() ); return ERRORS_EXIT; } #endif ◆テスト・グループ(ヘッダ)ファイル /*********************************************************************** * <<< (テスト・グループ)のテスト >>> ************************************************************************/ #ifndef __T_XXX_H #define __T_XXX_H /*********************************************************************** * <<< 優先ヘッダ >>> ************************************************************************/ #ifndef USES_PRIORITY_HEADER /*[START_OF_PRIORITY_HEADER]*/ #define USES_T_XXX typedef struct _T_Xxx_Set T_Xxx_Set; typedef struct _T_Xxx_ComSet T_Xxx_ComSet; /*[END_OF_PRIORITY_HEADER]*/ #endif /* USES_PRIORITY_HEADER */ /*-----------------------------------------------------------------*/ /* <<< Interface Area ---------------------------------------- >>> */ /*-----------------------------------------------------------------*/ /*********************************************************************** * <<< [T_Xxx] (テスト・グループ) >>> ************************************************************************/ void T_Xxx_run(void); void T_Xxx_01( T_Xxx_ComSet* comset ); void T_Xxx_02( T_Xxx_ComSet* comset ); void T_Xxx_03( T_Xxx_ComSet* comset ); void T_Xxx_04( T_Xxx_ComSet* comset ); /*********************************************************************** * <<< [T_Xxx_Set] テスト条件 >>> ************************************************************************/ struct _T_Xxx_Set { /* 以下はサンプル */ /* テスト条件(public) */ int iGnd; /* 描画するグランド, 0〜3 */ int iTexGnd; /* 登録テクスチャグランド, 0〜3 */ int draw; /* 描画方法、GP3D_GOURAUDSHADINGなど */ int scr_w, scr_h; /* 画面サイズ */ int bpp; /* BitsPerPixel */ /* テスト条件の派生属性(private) */ int iTexGnd2d; /* 同上、グランドの定数 GP54BMG0 など(派生属性)*/ void* obj_mem; /* メモリ領域 */ int obj_mem_size; /* メモリ領域のサイズ */ /* 以上はサンプル */ }; void T_Xxx_Set_init( T_Xxx_Set*, T_Xxx_ComSet* ); void T_Xxx_Set_setup( T_Xxx_Set* ); /*********************************************************************** * <<< [T_Xxx_ComSet] 全テスト共通のテスト条件 >>> ************************************************************************/ struct _T_Xxx_ComSet { int dummy; /* 共通のテスト条件はありません */ }; #endif /* __T_XXX_H */ ◆テスト・グループ(ソース)ファイル /*********************************************************************** * <<< (テスト・グループ)のテスト >>> ************************************************************************/ #include /*********************************************************************** * <<< [T_Xxx_run] 各テストの実施 >>> ************************************************************************/ void T_Xxx_run() { enum { iStartTest = 1, /* 初めにテストするテストケース番号 */ mTest = 1 /* テストケース数 */ }; int iTest, iTest0; T_Xxx_ComSet set; Errors_setStart( iStartTest, &iTest0 ); /* 各種条件でテストする */ for ( iTest = iTest0; iTest <= mTest; iTest ++ ) { Errors_testCasePrintf( "T_Xxx: [Test Case %d]", iTest ); /* テスト */ c_try { switch ( iTest ) { case 1: T_Xxx_01( &set ); break; default: Errors_notSupport(); break; } Errors_printf_release( Errors_okLabel ); } c_catch ( Errors_Msg*, msg ) { Errors_errCount ++; Errors_printf_release( Errors_errLabel ); msg; /* avoid warning */ } c_end_catch; } } /*********************************************************************** * <<< [T_Xxx_01] (テストケース)のテスト >>> ************************************************************************/ void T_Xxx_01( T_Xxx_ComSet* comset ) { T_Xxx_Set set; /* データ ---------------------------------*/ /* テスト ---------------------------------*/ /* テスト条件を整える */ /*(MEMO:デフォルト値以外の設定は init と setup の間に書く)*/ T_Xxx_Set_init( &set, comset ); T_Xxx_Set_setup( &set ); /* テストの実施 */ /* 自動チェック ---------------------------------*/ /*(MEMO:たとえば、以下のようなテストツールを使います)*/ Errors_autoChk( format, _var, cond ); Errors_autoChk2( format, _declaration, _let, cond ); Errors_autoChkW( format, _var1, _op, _var2 ); Errors_chkRet( ret == OK, ret ); if ( err ) error(); /* 手動チェック ---------------------------------*/ /*(MEMO:たとえば、以下のようなブレークポイントを設定します)*/ Errors_break_release( 0x101 + iGnd * 0x10 ); } /*********************************************************************** * <<< [T_Xxx_Set_init] テスト条件をデフォルトに設定する >>> *【引数】 * ・T_Xxx_Comset* comset; 共通のテスト条件(入力) * ・T_Xxx_Set* set; テスト条件(出力) ************************************************************************/ void T_Xxx_Set_init( T_Xxx_Set* set, T_Xxx_ComSet* comset ) { /* 共通のテスト条件 comset に基づいたデフォルトのテスト条件 set を設定する */ } /*********************************************************************** * <<< [T_Xxx_Set_setup] テスト条件に基づいてテスト環境を設定する >>> *【引数】 * ・T_Xxx_Set* set; テスト条件 *【補足】 *・T_Xxx_Set_init 関数の呼び出しから、本関数の呼び出しの間に、 * テスト条件を設定してください。ただし、派生属性は本関数の内部で * 自動的に設定します。 ************************************************************************/ void T_Xxx_Set_setup( T_Xxx_Set* set ) { /* テスト条件の派生属性を設定する =========================== */ /* テスト環境をセットアップする =========================== */ }