求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code
会员   
订购 | 案例 | 建模扩展语言 | 模型框架 | 学习资源 | 培训&咨询 | 解决方案 | 用户组 | 客户专区 | 联系我们
产品介绍
功能介绍  
工具链
购买
更新日志
 
 
CUnit整理
 

一、简介:

CUnit是一个用C语言写的单元测试库,它是一个简单的测试框架,提供了丰富的断言语句来测试常用的数据类型,此外,对于跑测试用例和反馈测试结果,CUnit都有一些不同的接口,它可以编译成动态库或者静态库。

二、安装使用

1.准备工具:

首先要安装mingw和msys,下载地址:点击打开链接

注意只需选择Basic Setup安装即可,如下图:

安装完成后要设置环境变量,把安装目录的bin文件目录加入到path里面即可,如下图:

设置好环境变量,可以去cmd控制台看一下是否生效,测试指令为gcc -v。

2.编译方法:

去msys的安装目录里面打开msys.bat文件,如:D:\MINGW\msys\1.0\msys.bat。

通过CD指令指向CUnit的项目路径,如:CD D:\CUnit-2.1-3。

然后依次执行以下指令即可编译完成。

libtoolize
automake --add-missing
autoreconf
./configure --prefix=/mingw
make
make install

三、基本框架

CUnit是一个可以跨平台的框架。它只有一个Test Registry, 一次测试(Test Registry)可以运行多个测试包(Test Suite),而每个测试包可以包括多个测试用例(Test Case),每个测试用例又包含一个或者多个断言类的语句。如下图所示

四、基本流程

1)准备好你要测试的函数

2)初始化test注册函数:CU_initialize_registry()

3)添加测试包:CU_add_suite()

4)添加测试用例:CU_add_test()

5)运行测试用例:比如,CU_console_run_tests

6)清除test注册资源:CU_cleanup_registry

五、测试函数说明(下面CUnit自带的说明)

int maxi(int i1, int i2)
{
return (i1 > i2) ? i1 : i2;
}

void test_maxi(void)
{
CU_ASSERT(maxi(0,2) == 2);
CU_ASSERT(maxi(0,-2) == 0);
CU_ASSERT(maxi(2,2) == 2);
}

从上面可以看出,我们可以直接用CU_ASSERT这个宏来测试你的函数

demo(下面这个demo是自己写的,用来测试我的链表初始化函数)

INT32 cunit_link_list_init(void)
{
return 0;
}
INT32 cunit_link_list_cleanup(void)
{
return 0;
}

/*********************************************
***
*** Test Func : link_list_is_empty
***
*********************************************/
void link_list_test_case1(void)
{
BOOL retValue, expectValue;

LINK_LIST_T pList = link_list_init();

retValue = link_list_is_empty(pList);
expectValue = TRUE;

CU_ASSERT(retValue == expectValue);
}

void link_list_test_case2(void)
{
BOOL retValue, expectValue;

LINK_LIST_T pList = link_list_init();
link_list_insert_at_tail(1, pList);

retValue = link_list_is_empty(pList);
expectValue = TRUE;

CU_ASSERT(retValue == expectValue);
}

// test cases
CU_TestInfo link_list_test_case[] = {
{"link_list_is_empty_case1", link_list_test_case1},
{"link_list_is_empty_case2", link_list_test_case2},
CU_TEST_INFO_NULL,
};

// suite
CU_SuiteInfo suites[] =
{
{ "Test For Linked List", cunit_link_list_init, cunit_link_list_cleanup, NULL, NULL, link_list_test_case },
CU_SUITE_INFO_NULL,
};

int cunit_test_main(void)
{
if(CUE_SUCCESS != CU_initialize_registry())
{
printf("<CUnit Test> CU_initialize_registry fail!!!\n");
return CU_get_error();
}

if(CUE_SUCCESS != CU_register_suites(suites))
{
printf("<CUnit Test> CU_register_suites fail!!!\n");
CU_cleanup_registry();
return CU_get_error();
}

#if 0
//output file.xml
CU_set_output_filename("link_list_test_result");
CU_automated_run_tests();
#endif

CU_basic_set_mode(CU_BRM_VERBOSE);
CU_basic_run_tests();

CU_cleanup_registry();

return CU_get_error();
}

运行结果如下

测试的结果一目了然,很方便。当然如果你觉得这样的输出结果还不够美观,那也可以用xml的方式去查看,如下图

要想生成XML文件,需要将上面代码注释的内容打开,也即是添加下面两行代码

CU_set_output_filename("link_list_test_result");
CU_automated_run_tests();

生成完XML文件之后,然后再将CUnit-List.dtd、CUnit-List.xsl、CUnit-Run.dtd、CUnit-Run.xsl(这几个文件在CUnit的源码包可以找到)和XML文件放到同一级目录,再用IE浏览器打开,就可以看到像上面的UI界面了。