用函數指針實現的一個測試框架
c語言函數指針的定義形式:
返回類型 (*函數指針名稱)(參數類型,參數類型,參數類型,…);
c++函數指針的定義形式:
返回類型 (類名稱::*函數成員名稱)(參數類型,參數類型,參數類型,….);
這裏主要記錄自己用C語言函數指針寫的一個測試框架。可以根據輸入執行想要執行的測試用例。
關於一些比較基礎和簡單的例子就不例舉了,自行google。文末鏈接我隨手查的,如果還不知道函數指針是啥和怎麼用就看看吧,先放在這裏。
/*
未使用參數申明
一些函數原型要求的參數但實際可能不使用
從編碼安全的角度,不使用的參數使用此宏定義消除PC-Lint和編譯告警
*/
#ifndef UNREFERENCE_PARAM
#define UNREFERENCE_PARAM(x) ((void)(x))
#endif
//定義入參結構
typedef struct tagINPUT_ARG_S
{
int argc;
char **argv;
}INPUT_ARG_S;
//定義執行命令的函數結構
typedef struct tagFUNC_ENTRY_S
{
char cmdName[10]; //命令名稱
int (*diagFunc)(INPUT_ARG_S *input_arg); //命令執行函數,函數指針
} FUNC_ENTRY_S;
//這裏寫了三個測試用例:test_a, test_b, test_c
FUNC_ENTRY_S g_Func[] =
{
{"aa", test_a},
{"bb", test_b},
{"cc", test_c},
};
/******************************************************************************
* 功 能: 處理函數
* 輸入參數: argc:命令組成個數, 參數個數
* argv:命令字符串, 參數數組
* 假如命令關鍵字爲“xqf”,那麼當輸入命令:xqf bb時,調用第二個函數
******************************************************************************/
void DoDbgCmd(int argc, char *argv[])
{
int index = 0;
int funcNum = 0;
bool findFlag = FALSE;
FUNC_ENTRY_S *funcEntry = NULL;
//數組中第1個元素是命令關鍵字,第2個元素是命令名稱
if (argc <= 1)
{
printf("Please input correct command.\n");
return;
}
funcNum = sizeof(g_Func) / sizeof(g_Func[0]); //計算出有幾個處理函數
for (index = 0; index < funcNum; index++)
{
funcEntry = &g_Func[index];//得到函數句柄
if (0 == strcmp(argv[1], funcEntry->cmdName)) //看看自己輸入的操作名稱是否能在函數句柄列表中找的到
{
findFlag = TRUE;
break;
}
}
if (TRUE == findFlag)//找到輸入的操作名稱
{
if (NULL != funcEntry->diagFunc)//對應的操作函數不爲空
{
input_args.argc = argc;
input_args.argv = argv;
//執行對應的操作函數
(void)funcEntry->diagFunc(&input_args);
}
else
{
printf("excute function is NULL!\n");
}
}
else
{
printf("Can't Find The Cmd.\n");
}
return;
}
int test_b(INPUT_ARG_S *input_arg)
{
int argc = input_arg->argc;
char **argv = input_arg->argv;
int ret = 0;
UNREFERENCE_PARAM(argv);//如果這個參數沒用的話就這樣操作
//具體的測試體
//省略
printf("test b success\n");
return ret;
}
//剩下兩個我就不寫了
int test_a(INPUT_ARG_S *input_arg)
{
return 0;
}
int test_c(INPUT_ARG_S *input_arg)
{
return 0;
}
1、http://www.cnblogs.com/TenosDoIt/p/3164081.html
2、http://www.cnblogs.com/windlaughing/archive/2013/04/10/3012012.html