本文档介绍CUNIT工具的基本使用方法。
1. CUNIT简单介绍
C语言环境下开发源码的白盒测试用例CUnit。CUnit以静态库的形式提供给用户使用,用户编写程序的时候直接链接此静态库就可以了。它提供了一个简单的单元测试框架,并且为常用的数据类型提供了丰富的断言语句支持。
2. CUNIT的下载
CUNIT官网介绍:http://cunit.sourceforge.net/
CUNIT网络源码下载地址http://sourceforge.net/projects/cunit/
CUNIT的安装依赖curses/ncurses:
curses/ncurses下载地址:http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz
3. CUNIT安装
curses/ncurses的安装命令:
# tar -zxvf ncurses-5.9.tar.gz
# cd ncurses-5.9
# ./configure
# make
# make install
CUNIT的安装命令:
# tar -jxvf CUnit-2.1-2-src.tar.bz2
# cd CUnit-2.1-2
# ./configure
# make
# make install
修改配置文件:
#vi /etc/profile
文件尾增加一行:PATH=$PATH:/usr/local/include
#vi /etc/ld.so.conf
文件尾加一行:/usr/local/lib
最后执行命令:
#ldconfig
4.使用方法示例
示例代码:
文件列表:
exam.c exam.h :需要测试的单元模块
testcase.c testcase.h :测试用例
main.c :CUNIT main函数
Makefile :makefile文件
exam.h源文件:
#ifndef __EXAM__H__
#define __EXAM__H__
int fun1();
#endif
exam.c源文件:
#include <stdio.h>
#include "exam.h"
/***************************************************
Function:真正需要测试的单元模块
Remark:
***************************************************/
int fun1()
{
returna > b ? a : b;
}
testcase.h源文件:
#ifndef __TESTCASE__H__
#define __TESTCASE__H__
int InitSuite();
int EndSuite();
void test_fun1();
#endif
testcase.c源文件:
#include "testcase.h"
#include "exam.h"
/****************************************************************
Function:模块测试初始化工作,对模块内部Test函数需要用到的资源初始化
如当前里例子中则对fun1中使用的到的资源初始化
Input: None
Return: 0 if Succeed, or False
Remark: 如果成功才进测试函数的测试运行否则此Suite下挂载的Test均不运行
****************************************************************/
int InitSuite()
{
return0;
}
/*******************************************************************
Function:模块测试销毁工作,对模块内部Test函数需要用到的资源进行销毁
如当前里例子中则对fun1中使用的到的资源释放
Input: None
Return: 0 if Succeed, or False
Remark:不影响Test的运行,失败会报suite运行错误
******************************************************************/
int EndSuite()
{
return0;
}
/******************************************************************
Function: 单元测试例子也内部装载自己的函数过程
Input: ignore
Return: void
Remark: 失败会记录Test失败,内部可以使用CU_ASSERT检测最终会有检测结果
CU_ASSERT中检测到的才是真正意义上的用户函数
******************************************************************/
void test_fun1()
{
inta = 1, b = 2;
CU_ASSERT(fun1(a,b) == a);
}
main.c源文件:
#include <stdio.h>
#include "CUnit/Basic.h"
#include "CUnit/CUnit.h"
#include "CUnit/CUError.h"
#include "CUnit/TestDB.h"
#include "CUnit/TestRun.h"
#include "CUnit/Automated.h"
#include "CUnit/Console.h"
#include "testcase.h"
int main()
{
CU_pSuitepSuite = NULL;
//CU_initialize_registry 注册函数注册一个用例返回CUE_系列异常值
if(CUE_SUCCESS!= CU_initialize_registry())
{
returnCU_get_error();
}
//CU_add_suite增加一个Suite
//"mySuite": Suite名字
//InitSuite EndSuite:分别是测试单元初始和释放函数,如不需要则NULL传递
pSuite= CU_add_suite("mySuite", InitSuite, EndSuite);
if(NULL== pSuite)
{
CU_cleanup_registry();
returnCU_get_error();
}
//注册当前Suite下的测试用例
//pSuite:用例指针
//" test_fun1": 测试单元名称
// test_fun1:测试函数
if(NULL== CU_add_test(pSuite, "test_fun1", test_fun1))
{
CU_cleanup_registry();
returnCU_get_error();
}
//使用console控制交互界面的函数入口
CU_console_run_tests();
//调用完毕清除注册信息
CU_cleanup_registry();
return0;
}
Makefile文件:
all:
gcc-c exam.c
gcc-c testcase.c
gcc-c main.c
gcc-o out main.o exam.o testcase.o -lcunit
clean:
-rm *.o
-rm out
5. 运行
执行make之后,生成out可执行文件,运行可执行文件后的效果图:
各个命令:
(R)un :运行测试用例
(S)elect :选择测试包
(L)ist :显示初始化的测试包(Suite)
(A)ctivate :激活测试包
(F)ailures :失败的测试用例
(O)ption :
(H)elp :帮助
(Q)uit :退出
执行命令R:
可以看到显示的测试包(Suite)、测试用例(tests)、断言错误数目(asserts)等信息。
执行命令F:
可以看到测试用例失败所对应的代码信息。
其它命令则可以激活/不激活测试包等操作,这里不再详述。
参考:
http://iamsunjianming.blog.sohu.com/55842807.html
http://hi.baidu.com/benben_me/blog/item/b1f50d0cceb6ed276159f37d.html
http://blog.csdn.net/livelylittlefish/article/details/6361269