用函数指针实现的一个测试框架
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