单元测试工具 CUnit 简介

发表于:2015-04-22来源:uml.org.cn作者:火龙果软件点击数: 标签:CUnit
1.CUnit简介 1.1 CUnit简要描述 CUnit是一个编写、管理及运行c语言单元测试的系统。它使用一个简单的框架来构建测试结构,并为普通数据结构的测试提供丰富的断言。此外,

  1.CUnit简介

  1.1 CUnit简要描述

  CUnit是一个编写、管理及运行c语言单元测试的系统。它使用一个简单的框架来构建测试结构,并为普通数据结构的测试提供丰富的断言。此外,CUnit为测试的运行和结果查看提供了许多不同的接口,包括自动测试模式和可交互的控制台模式。

  其常用的数据类型和函数在以下头文件中声明:

  头文件 内容描述

   包括测试用例中常用的宏定义和框架中其它头文件

   错误处理函数及错误编号

   测试注册簿、测试包和测试用例的操作及数据类型

   测试运行及结果检索的操作及数据类型

   输出Xml结果相关的自动模式接口

   非交互模式的基本模式接口

   交互模式的接口

  1.2 测试框架结构

  CUnit核心框架为测试注册簿、测试包和测试用例的管理提供了基本支持,它提供的接口可以使用户和测试框架交互,方便测试的运行和测试结果的查看。CUnit被组织成一个常见的单元测试框架,其结构如下:

  测试用例被打包成测试包,并被注册到当前活动的测试注册簿中。测试包的装载和卸载函数在测试执行前后被自动调用。所有的测试包和测试用例可以一键运行,也可以选择相应的测试包或测试用例来执行测试。

  1.3 基本使用方法

  使用CUnit框架的常用流程如下:

  编写测试用例,如果有必要须对测试包进行初始化或者清理

  初始化测试注册簿 CU_initialize_registry()

  向注册簿中注册测试包 CU_add_suite()

  向测试包中添加测试用例 CU_add_test()

  使用合适的测试模式执行测试CU_automated(basic/console/curses)_run_tests()

  清理测试注册簿 CU_cleanup_registry()

  1.4 Linux下CUnit的安装

The usual sequence of steps should succeed in building and installing CUnit:
aclocal  (if necessary)
autoconf (if necessary)
automake (if necessary)
chmod u+x configure (if necessary)
./configure --prefix <Your choice of directory for installation>
make
make install
What's installed:
libcunit.a (Library file)
CUnit Header files
DTD and XSL files supporting xml output files in share directory
Man Pages in relevant man directories under the installation path.
HTML users guide in the doc subdirectory of the installation path.
Example & test programs in the share subdirectory of the install path.

  2. 编写CUnit测试用例

  2.1 测试用例函数的命名

  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);
  }

  2.2 CUnit中的断言

  CUnit为逻辑条件测试提供了一系列的断言。测试框架会跟踪这些断言的通过或失败,当测试执行完成时便可看到结果。

  每一个断言测试一个逻辑条件,条件的值为CU_FALSE表示断言失败。对于测试失败,测试将会继续执行,除非用户选择“xxx_FATAL”类型的断言,这种情况下该测试函数将会失败并立即返回。FATAL类型的断言应该和警告一块使用!一旦FATAL类型的断言导致测试失败,测试函数将没有机会做清理工作,普通的清理函数不会起任何作用。

  另外一些特殊的断言被注册为“pass”或“fail”,它们不是用来做逻辑测试,而是用来测试流程控制或者其他条件测试的。例如:

void test_longjmp(void)
{
jmp_buf buf;
int i;
i = setjmp(buf);
if (i == 0) {
run_other_func();
CU_PASS("run_other_func() succeeded.");
}
else
CU_FAIL("run_other_func() issued longjmp.");
}

原文转自:http://www.uml.org.cn/Test/201404151.asp