我所了解的C的单元测试框架很少,至少我google了一把没有发现一个比较成熟的。我以前也写过一个C的单元测试框架,但是不够灵活,也不太好用。今天
在看APR的源文件时发现了APR内部使用的测试框架。所谓内部使用,就是APR
库不提供接口给外部使用。不过这个框架很简单,也非常实用,分析分析拿来自己用还是相当划算的。
框架的名字叫abts,我真不知道这个名字的含义,可能由于APR内部使用,所以在代码中对这个名字也毫无注释(整个测试框架的注释都很少)
框架代码主要在abts.h和abts.c中。先从入口函数开始分析。
1. 入口函数
1. 首先进行命令行参数的解析。根据命令行参数设置相应的全局变量。
-v :是否以冗长方式打印测试结果。打印出错的行号,期望值以及实际值;
-x:这个参数是表示只测试除了指定文件之外的测试用例。如test -x test1 test3 表示测试除了test1、test3文件之外的测试用例;
-l:表示仅仅只列出包含测试用例的文件名,而不执行测试用例(去掉后缀);
-q:是否显示每个suite的测试进度(进度条用spinning bar表示);
2. 执行每一个测试用例,代码很简洁
for (i = 0; i < (sizeof(alltests) / sizeof(struct testlist *)); i++) {
suite = alltests[i].func(suite);
}
alltests中包含全部的测试用例,alltests在abts_tests.h文件中,如下所示。
const struct testlist {
abts_suite *(*func)(abts_suite *suite);
} alltests[] = {
{testatomic},
{testdir},
{testdso},
//...
testlist结构体只包含一个函数指针,这个函数指针指向的就是每一个测试用例函数。
3. 调用report函数生成测试用例报告。
2. 如何使用
在深入分析框架代码之前,先看看APR是如何使用这个单元测试框架的。
首先看看测试框架中的一些关系,搞懂这些关系是很重要的。
一个测试,包括很多test suite,每个test suite又包含很多test case。每个test
suite是独立的,他们之间没有任何耦合关系,也就是说每个test suite的测试结果都不会影响到另一test suite。可以把test
suite看作是对某一模块的测试,而test case可以看作是对模块中某一功能的测试。
我来举例说明如何使用这个测试框架。
对文件模块进行测试,测试的功能包括打开文件、关闭文件、读文件和写文件。
第一步:定义函数:abts_suite *testfile(abts_suite *suite)。这个函数表示测试文件模块
第二步:在第一步定义的函数中添加test case。如test_open、test_write、test_read、test_close。
如:
abts_suite *testfile(abts_suite *suite)
{
suite = ADD_SUITE(suite)
abts_run_test(suite, test_open, NULL);
abts_run_test(suite, test_write, NULL);
abts_run_test(suite, test_read, NULL);
abts_run_test(suite, test_close, NULL);
return suite;
}
第三步:分别实现test_open、test_write、test_read、test_close测试用例。
第四步:将testfile天骄到alltests中。
这几个步骤清楚、简洁、使用方便。另外一个我个人认为比较好的风格就是:将每一个test suite放在独立的文件中,这对测试框架打印测试报告会更具易读性,这一点在具体的深入分析测试框架的内部实现时会介绍到。
衡量一个测试框架优劣的很重要的一个因素就是其提供给客户使用的断言集是否丰富。APR的这个测试框架中也提供了一个比较丰富断言集。列举如下:
1. 判断整形相等或不等
abts_int_equal、abts_int_nequal
2. 判断字符串相等或不等
abts_str_equal、abts_str_nequal
3. 判断指针相等或不等
abts_ptr_equal、abts_ptr_nequal
4. 条件是否为真
abts_true
5. 出错及断言
abts_fail、abts_assert
6. size相等(比较size_t类型)
abts_size_equal
在下面一节我将深入分析这个测试框架的内部实现
分享到:
相关推荐
这是 Apache 的 APR1 MD5 散列算法在纯 PHP 中的测试、引用、记录和打包实现。安装作曲家.json: { " require " : { " whitehat101/apr1-md5 " : " ~1.0 " }}用 use WhiteHat101 \ Crypt \ APR1_MD5 ;// Check ...
编译 apr 1.7.0 需要的头文件 apr_escape_test_char.h --------------------- /* this file is automatically generated by gen_test_char, do not edit. "make include/private/apr_escape_test_char.h" to ...
apr_escape_test_char.h apr项目中缺失的apr_escape_test_char.h文件,把它放到apr\include,并在项目中添加这个头文件
安装linux编译时报apr错误的解决方法 httpd-2.4.3.tar.gz, apr-util-1.3.10.tar.gz, apr-1.4.2.tar.gz,
apr: ./configure --prefix=/usr/local/apr apr-util: ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/ httpd: ./configure --prefix=/usr/local/apache --with-apr=/usr/local/apr/ --with-...
apr: ./configure --prefix=/usr/local/apr apr-util: ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/ httpd: ./configure --prefix=/usr/local/apache --with-apr=/usr/local/apr/ --with-...
linux和windows版本:apr,apr-iconv和apr-util安装包
linux:apr安装包apr和apr-util安装包:apr-1.4.6.tar.gz
士研电机保护继电器APR-3/APR-3L说明书pdf,士研电机保护继电器APR-3/APR-3L说明书:可确认三相电源之相序,防止马达逆转,按图面接线,在缺相时可防止电磁接触器动作,本保护继电器,采用电压输出方式与负载电流无关,...
Apr组播小程序:Apr下实现组播发送与接收的功能!
同事好久之前整理写的apr库方面的技术文档
APR库需要用到三个:apr、apr-iconv、apr-util对应的动态链接库。
MAC环境下编译apr所需要用的configure文件。我写的blog中提及的configure文件。
本专辑为您列举一些apr-1.6.5方面的下载的内容,apr-1.6.5.tar.gz、apr-1.6.5.tar等资源。把最新最全的apr-1.6.5.tar推荐给您,让您轻松找到相关应用信息,并提供apr-1.6.5.tar下载等功能。本站致力于为用户提供更好的...
需要三个包: 1. apache-log4cxx-0.10.0.zip 2. apr-1.2.11-win32-src.zip ...我用过的日志框架比较少,所以在这里不做与其它日志框架的比较,类似的日志框架还有GLog、boost log,如果有兴趣可以去研究一下。
apr1.5.2 apr-util1.5.2 亲测有效,apr1.5.2 apr-util1.5.2 亲测有效,apr1.5.2 apr-util1.5.2 亲测有效,apr1.5.2 apr-util1.5.2 亲测有效,
APR所需 博文链接:https://cats-tiger.iteye.com/blog/135782
包含 apr-util-1.3.4-win32-src.zip apr-1.3.3-win32-src.zip apr-iconv-1.2.1-win32-src.zip 源地址http://apr.apache.org/download.cgi ...
Thu Apr 30 2015 11:45:50 Thu Apr 30 2015 11:45:51 Thu Apr 30 2015 11:45:52 Thu Apr 30 2015 11:45:53 Thu Apr 30 2015 11:45:54 Thu Apr 30 2015 11:45:55 Thu Apr 30 2015 11:45:56 Thu Apr 30 2015 11:45:57 ...
安装apache和php等的一些linux软件的依赖包,安装apr的使用需要注意,在make时可能会出现, rm: cannot remove `libtoolT': No such file or directory 这时你需要vi configure,编辑打开这个文件,查找 $RM "$cfgfile...