现在的位置: 首页 > Linux > CentOS > Linux > 软件测试 > 测试工具 > 软件测试 > 正文

CentOS下CUnit安装及使用

2013年07月12日 CentOS, Linux, 测试工具, 软件测试 ⁄ 共 4207字 ⁄ 字号 暂无评论 ⁄ 阅读 3,184 次

本文主要介绍在CentOSC语言单元测试工具CUnit的部署,配置及简单使用方法。

1.     简介

继Junit CppUnit后, C语言环境下也出现了单元测试框架CUnit。CUnit以静态库的形式提供给用户使用,用户编写程序的时候直接链接此静态库就可以了。它提供了一个简单的单元测试框架,并且为常用的数据类型提供了丰富的断言语句支持。

2.      安装

CUnit官方网站为http://sourceforge.net/projects/cunit/,最新版本为CUnit-2.1-2。

CentOS安装部署命令如下:


#Wget http://downloads.sourceforge.net/project/cunit/CUnit/2.1-2/CUnit-2.1-2-src.tar.bz2?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fcunit%2F&ts=1372924694&use_mirror=nchc

#tar -xjf CUnit-2.1-2-src.tar.bz2

#cd CUnit-2.1-2

#aclocal (if necessary)

#autoconf (if necessary)

#automake (if necessary)

#./configure --prefix <Your choice of directory for installation>

#make

#make install

#加载CUnit的库(只需执行一次)

#cd /usr/local/lib

#ldconfig

3.      使用

3.1  框架

CUnit的测试是单线程启动,只能注册一个Test Registry, 一次测试(Test Registry)可以运行多个测试包(Test Suite),而每个测试包可以包括多个测试用例(Test Case),每个测试用例又包含一个或者多个断言类的语句。

具体到程序的结构上,一次测试下辖多个Test Suite,它对应于程序中各个独立模块;一个Suite管理多个Test Case,它对应于模块内部函数实现。每个Suite可以含有setup和teardown函数,分别在执行suite的前后调用。

3.2  流程

使用CUnit进行测试的基本流程如下所示:

  • 编写代测试的函数(如果必要,需要写suite的init/cleanup函数)
  • 初始化Test Registry - CU_initialize_registry()
  • 把测试包(Test Suites)加入到Test Registry ,如CU_add_suite()
  • 加入测试用例(Test Case)到测试包当中,如CU_add_test()
  • 使用适当的接口来运行测试测试程序,如CU_console_run_tests()
  • 清除Test Registry ,如CU_cleanup_registry()

3.3  构成

一个CUnit TestCase的由test.c、testcase.c、Main.c 与 Makefile构成,即一个测试范例包括被测函数,测试函数(定义测试用例和测试包),运行测试函数及Makefile四部分。

3.4  示例

以一个简单的testcase为例,如需测试的是整数求最大值的函数maxi,文件组织结构如下:

  • func.c:被测函数(定义maxi()函数)
  • test_func.c:测试函数(定义测试用例和测试包)
  • run_func.c:运行测试函数(调用CUnit的Automated接口运行测试)

测试程序代码如下:

  • 被测函数func.c

int maxi(int i,int j)

{

return i>j?i:j;

}

  • 测试函数(定义测试用例和测试包)test_func.c

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

#include <CUnit/CUnit.h>

#include <CUnit/Automated.h>

#include <CUnit/TestDB.h>

/**//*---- functions to be tested ------*/

extern int maxi(int i, int j);

/**//*---- test cases ------------------*/

void testIQJ()

{

CU_ASSERT_EQUAL(maxi(1,1),1);

CU_ASSERT_EQUAL(maxi(0,-0),0);

}

void testIGJ()

{

CU_ASSERT_EQUAL(maxi(2,1),2);

CU_ASSERT_EQUAL(maxi(0,-1),0);

CU_ASSERT_EQUAL(maxi(-1,-2),-1);

}

void testILJ()

{

CU_ASSERT_EQUAL(maxi(1,2),2);

CU_ASSERT_EQUAL(maxi(-1,0),0);

CU_ASSERT_EQUAL(maxi(-2,-1),-1);

}

CU_TestInfo testcases[] = {

{"Testing i equals j:", testIQJ},

{"Testing i greater than j:", testIGJ},

{"Testing i less than j:", testILJ},

CU_TEST_INFO_NULL

};

/**//*---- test suites ------------------*/

int suite_success_init(void) { return 0; }

int suite_success_clean(void) { return 0; }

CU_SuiteInfo suites[] = {

{"Testing the function maxi:", suite_success_init, suite_success_clean, testcases},

CU_SUITE_INFO_NULL

};

/**//*---- setting enviroment -----------*/

void AddTests(void)

{

assert(NULL != CU_get_registry());

assert(!CU_is_test_running());

/**//* shortcut regitry */

if(CUE_SUCCESS != CU_register_suites(suites)){

fprintf(stderr, "Register suites failed - %s ", CU_get_error_msg());

exit(EXIT_FAILURE);

}

}

  • 运行测试函数run_test.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <assert.h>

#include "Basic.h"

int main(int argc,char* argv[])

{

CU_BasicRunMode mode = CU_BRM_VERBOSE;

CU_ErrorAction error_action = CUEA_IGNORE;

int i;

setvbuf(stdout,NULL,_IONBF,0);

for (i=1 ;i<argc ;i++) {

if (!strcmp("-i",argv[i])) {

error_action = CUEA_IGNORE;

}

else if (!strcmp("-f",argv[i])) {

error_action = CUEA_FAIL;

}

else if (!strcmp("-A",argv[i])) {

error_action = CUEA_ABORT;

}

else if (!strcmp("-s",argv[i])) {

mode = CU_BRM_SILENT;

}

else if (!strcmp("-n",argv[i])) {

mode = CU_BRM_NORMAL;

}

else if (!strcmp("-v",argv[i])) {

mode = CU_BRM_VERBOSE;

}

else if (!strcmp("-e",argv[i])) {

return 0;

}

else {

printf("\nUsage:  BasicTest [options]\n\n"

"Options:   -i   ignore framework errors [default].\n"

"           -f   fail on framework error.\n"

"           -A   abort on framework error.\n\n"

"           -s   silent mode - no output to screen.\n"

"           -n   normal mode - standard output to screen.\n"

"           -v   verbose mode - max output to screen [default].\n\n"

"           -e   print expected test results and exit.\n"

"           -h   print this message and exit.\n\n");

return 0;

}

}

if (CU_initialize_registry()) {

printf("\nInitialization of Test Registry failed.");

}

else {

AddTests();

CU_basic_set_mode(mode);

CU_set_error_action(error_action);

printf("\nTests completed with return value %d.\n",CU_basic_run_tests());

CU_cleanup_registry();

}

return 0;

}

3.5  运行

将func.c,test_func.c及run_test.c拷贝至测试(如test)目录下,执行如下命令:


#cd test

#gcc -o test -I/usr/local/include/CUnit -L/usr/local/lib/ -lcunit run_test.c test_func.c func.c

#./test

执行测试结果如下: