用函数指针实现的一个测试框架

用函数指针实现的一个测试框架

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

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