用函數指針實現的一個測試框架

用函數指針實現的一個測試框架

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章