APR单元测试框架实现的实在简单,除了断言集之外ABTS只向外部暴露了两个接口:
abts_suite *abts_add_suite(abts_suite *suite, const char *suite_name_full);
void abts_run_test(abts_suite *ts, test_func f, void *value);
#define ADD_SUITE(suite) abts_add_suite(suite, __FILE__);
我们暂时不看函数的实现,先看看几个核心的数据结构。
struct sub_suite {
const char *name;
int num_test;
int failed;
int not_run;
int not_impl;
struct sub_suite *next;
};
sub_suite对应于对一个模块测试的的测试用例集合,他包含测试的一些统计信息,方便以后生成测试报告。
struct abts_suite {
sub_suite *head;
sub_suite *tail;
};
这算是所有sub_suite的根了,我们是在它的基础上构建sub_suite链表的。根据它我们可以找到我们最关心的两个suite。head指向第
一个suite,可以方便我们定位整个链表、tail指向最后一个suite,其实定位的是我们当前正在测试的suite。
struct abts_case {
int failed;
sub_suite *suite;
};
表示一个测试用例,它不会保存在链表中。被断言集使用,记录断言是否失败。
令人惊叹的是,你在使用这个框架是我们几乎不用关心这3个数据结构,只需要机械的使用ADD_SUITE和abts_run_test
就好了。
下面我们来看看两个主要函数。
1. abts_add_suite
/* Only end the suite if we actually ran it */
if (suite && suite->tail &&!suite->tail->not_run) {
end_suite(suite);
}
怎么函数刚一开始就要结束掉suite?(end_suite其实是打印suite是否通过测试)仔细分析后才知道,这一句不是要结束自己,而是要结束上一个suite。再回过头来看看主函数中的代码就会明白了。
abts_suite* suite = NULL;
for (i = 0; i < (sizeof(alltests) / sizeof(struct testlist *)); i++) {
suite = alltests[i].func(suite);
}
让我们一步步的分析:
1. 开始suite = NULL; 第一次当然就不会执行end_suite了,因为这时根本没有前一个suite可以结束掉。
2. 第二次进入循环时,就会调用end_suite了,因为这是suite是第一次执行测试后的返回值,suite != NULL。
3. 依次类推可以得出end_suite实际上是打印前一个测试的结果。这种设计比较的精巧。
再往下看代码,
创建一个subsuite,给这个suite一个名字,这个名字是suite所在的文件的文件名去掉后缀。然后再将其加入到链表中。
2. abts_run_test
这个函数就是调用具体的测试用例函数。测试用例函数是对一个基本功能的测试,它主要使用断言集。
首先取最后一个suite
ss = ts->tail;
即当前正在测试的suite。
然后初始化test_case。并将suite中的测试用例数递增。
tc.failed = 0;
tc.suite = ss;
ss->num_test++;
最后调用实际的测试用例函数,将用例是否失败的信息放入到tc中。更新suite的测试用例失败数。
f(&tc, value);
if (tc.failed) {
ss->failed++;
}
很简单,我在这里分析好像是没必要的了。我感叹写abts作者的智慧。
分享到:
相关推荐
3. **配置和编译apr-util**:接着,你需要配置并编译apr-util,同时指定apr的路径,因为apr-util依赖apr: ```bash cd ../apr-util-1.3.10 ./configure --with-apr=/usr/local/apr make sudo make install ``` 4. ...
这是 Apache 的 APR1 MD5 散列算法在纯 PHP 中的测试、引用、记录和打包实现。安装作曲家.json: { " require " : { " whitehat101/apr1-md5 " : " ~1.0 " }}用 use WhiteHat101 \ Crypt \ APR1_MD5 ;// Check ...
5. 测试安装:在开发环境中,尝试编译一个简单的程序,引用APR、APR-Iconv和APR-Util,如果编译成功,说明安装完成。 注意,安装过程中可能会遇到依赖问题,特别是Windows环境下,需要确保所有依赖项都已正确解决。...
编译 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的内部工作原理,包括源代码分析,这对于开发者理解和定制apr功能至关重要。而“工具”标签则暗示了apr不仅是一个库,还可能被当作开发中的辅助工具,用于构建其他软件或服务...
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系统中的APR(Apache Portable Runtime)是一个用于开发跨平台网络服务的库,而APR-Util则是其扩展库,提供了许多实用工具和数据库接口。本文将详细讲解如何在Linux上安装`apr-util-1.5.2.tar.gz`这个安装包,...
TeamViewerPortable官方便携版免安装 版本:14.7.48671日期:Apr 13 2021 13:52:14 默认内网,用ip远程, 可以设置连接官方服务器,用id连接
本文将深入探讨apr-iconv-1.2.1版本的具体内容和应用。 首先,让我们理解什么是apr-iconv。apr-iconv是APR库的一部分,提供了一个与系统iconv接口兼容的抽象层。iconv是一个广泛使用的函数库,用于在不同的字符编码...
标题中的"centos/redhat apr1.6.2 rpm包"指的是针对CentOS或Red Hat操作系统的一个软件包集合,这个集合包含的是APR(Apache Portable Runtime)库的1.6.2版本。APR是一个开源的C语言库,主要用于提供操作系统级别的...
本文将详细介绍如何在 Linux 系统中安装和使用 APR 1.3.2 版本,以便于配置和运行 Apache HTTPD。 首先,了解 APR 和 apr-util 的关系至关重要。APR 提供了操作系统的基本功能,如文件操作和线程管理,而 apr-util ...
- 源码:如果你正在对Tomcat进行深入研究或自定义构建,理解源码中的AprLifecycleListener类和其初始化过程有助于解决问题。 - 工具:解决问题可能需要使用一些工具,如编译器(如GCC)来编译APR库,或使用系统包...
标题中的"apr-1.6.2.tar"指的是Apache Portable Runtime (APR)库的1.6.2版本的源代码文件,它被压缩成一个tar格式的档案。APR是一个由Apache软件基金会开发的C语言库,它提供了一组低级别的系统接口,用于跨平台的...
在这个安装包中,包含了apr-1.6.3.tar.gz、apr-util以及apr-iconv-1.2.2.tar.gz,这些都是在Linux环境下部署Apache集群所必需的重要组件。 **apr-1.6.3.tar.gz**: 这是APR的主要库文件,包含了用于处理低级系统操作...
apr_escape_test_char.h apr项目中缺失的apr_escape_test_char.h文件,把它放到apr\include,并在项目中添加这个头文件
当我们遇到标题中提到的"编译 apr 1.6.5 需要的头文件 apr_escape_test_char.h"的情况,这意味着在使用Apache Portable Runtime (APR)库的版本1.6.5时,编译过程中缺少了一个特定的头文件。Apache Portable Runtime ...
5. **测试**:如果有的话,运行`make check`来执行单元测试,确保库的功能正常。 对于apr-util-1.5.2.tar.gz的处理过程与之类似,只是在配置时可能需要指定APR的安装位置,因为apr-util依赖于apr库。 在开发或维护...
标题中的"apr-util-1.5.4.tar.gz"是一个开源软件库的归档文件,它属于Apache Portable Runtime (APR)项目的一部分。APR是一个为各种操作系统提供统一API的库,主要用于处理底层系统功能,如文件I/O、网络通信、进程...
《Apache Portable Runtime (APR) 1.5.2与apr-util 1.5.2:深入理解与应用》 Apache Portable Runtime (APR) 是一个由Apache软件基金会开发的库,它为Apache HTTP服务器和其他基于Apache的项目提供底层系统接口和...
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-...