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

  所有的断言被定义在<CUnit/CUnit.h>

  3. 测试注册簿

  3.1 常用相关函数

#include  <CUnit/TestDB.h>
typedef struct CU_TestRegistry
typedef CU_TestRegistry* CU_pTestRegistry
CU_ErrorCode CU_initialize_registry(void)
void CU_cleanup_registry(void)
CU_BOOL CU_registry_initialized(void)
CU_pTestRegistry CU_get_registry(void)
CU_pTestRegistry CU_set_registry(CU_pTestRegistry pTestRegistry)
CU_pTestRegistry CU_create_new_registry(void)
void CU_destroy_existing_registry(CU_pTestRegistry* ppRegistry)

  3.2 注册簿内部结构体

  测试注册簿是测试包和相关测试用例的仓库。当用户添加测试包或测试用例时,CUnit维护当前活动的测试注册簿的状态更新,当用户选择运行所有测试用例时,当前活动的注册簿中所有的测试包均被执行。

  测试注册簿结构在<CUnit_TestDB.h>中定义,它包括所有测试包的数量、所有测试用例的数量以及一个指向该注册簿中测试包链表的指针:

typedef struct CU_TestRegistry
{
unsigned int uiNumberOfSuites;
unsigned int uiNumberOfTests;
CU_pSuite    pSuite;
} CU_TestRegistry;
typedef CU_TestRegistry* CU_pTestRegistry;

  用户通常只需在使用前初始化测试注册簿,之后做清除工作即可。此外CUnit还提供了一些必要的注册簿操作函数。