`
yangzb
  • 浏览: 3502996 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

APR中的单元测试框架:深入分析内部实现

    博客分类:
  • C++
阅读更多

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作者的智慧。

分享到:
评论

相关推荐

    安装linux编译时报apr错误的解决方法

    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. ...

    apr1-md5:Apache 在纯 PHP 中的 APR1-MD5 算法

    这是 Apache 的 APR1 MD5 散列算法在纯 PHP 中的测试、引用、记录和打包实现。安装作曲家.json: { " require " : { " whitehat101/apr1-md5 " : " ~1.0 " }}用 use WhiteHat101 \ Crypt \ APR1_MD5 ;// Check ...

    linux和windows:apr,apr-iconv和apr-util安装包

    5. 测试安装:在开发环境中,尝试编译一个简单的程序,引用APR、APR-Iconv和APR-Util,如果编译成功,说明安装完成。 注意,安装过程中可能会遇到依赖问题,特别是Windows环境下,需要确保所有依赖项都已正确解决。...

    apr-1.7.0-apr_escape_test_char.h.zip

    编译 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不仅是一个库,还可能被当作开发中的辅助工具,用于构建其他软件或服务...

    apr-1.7.0.zip

    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-util安装包 apr-util-1.5.2.tar.gz

    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

    TeamViewerPortable官方便携版免安装 版本:14.7.48671日期:Apr 13 2021 13:52:14 默认内网,用ip远程, 可以设置连接官方服务器,用id连接

    apr-iconv-1.2.1.tar.gz

    本文将深入探讨apr-iconv-1.2.1版本的具体内容和应用。 首先,让我们理解什么是apr-iconv。apr-iconv是APR库的一部分,提供了一个与系统iconv接口兼容的抽象层。iconv是一个广泛使用的函数库,用于在不同的字符编码...

    centos/redhat apr1.6.2 rpm包

    标题中的"centos/redhat apr1.6.2 rpm包"指的是针对CentOS或Red Hat操作系统的一个软件包集合,这个集合包含的是APR(Apache Portable Runtime)库的1.6.2版本。APR是一个开源的C语言库,主要用于提供操作系统级别的...

    apr1.3.2

    本文将详细介绍如何在 Linux 系统中安装和使用 APR 1.3.2 版本,以便于配置和运行 Apache HTTPD。 首先,了解 APR 和 apr-util 的关系至关重要。APR 提供了操作系统的基本功能,如文件操作和线程管理,而 apr-util ...

    tomcat 启动报APR based Apache Tomcat Native library not found

    - 源码:如果你正在对Tomcat进行深入研究或自定义构建,理解源码中的AprLifecycleListener类和其初始化过程有助于解决问题。 - 工具:解决问题可能需要使用一些工具,如编译器(如GCC)来编译APR库,或使用系统包...

    apr-1.6.2.tar

    标题中的"apr-1.6.2.tar"指的是Apache Portable Runtime (APR)库的1.6.2版本的源代码文件,它被压缩成一个tar格式的档案。APR是一个由Apache软件基金会开发的C语言库,它提供了一组低级别的系统接口,用于跨平台的...

    apr安装包以及两个依赖包

    在这个安装包中,包含了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_escape_test_char.h apr项目中缺失的apr_escape_test_char.h文件,把它放到apr\include,并在项目中添加这个头文件

    编译 apr 1.6.5 需要的头文件 apr_escape_test_char.h

    当我们遇到标题中提到的"编译 apr 1.6.5 需要的头文件 apr_escape_test_char.h"的情况,这意味着在使用Apache Portable Runtime (APR)库的版本1.6.5时,编译过程中缺少了一个特定的头文件。Apache Portable Runtime ...

    apr-util-1.5.2.tar和apr-1.5.2.tar

    5. **测试**:如果有的话,运行`make check`来执行单元测试,确保库的功能正常。 对于apr-util-1.5.2.tar.gz的处理过程与之类似,只是在配置时可能需要指定APR的安装位置,因为apr-util依赖于apr库。 在开发或维护...

    apr-util-1.5.4.tar.gz

    标题中的"apr-util-1.5.4.tar.gz"是一个开源软件库的归档文件,它属于Apache Portable Runtime (APR)项目的一部分。APR是一个为各种操作系统提供统一API的库,主要用于处理底层系统功能,如文件I/O、网络通信、进程...

    apr-1.5.2和apr-util-1.5.2.tar.gz-CSDN下载

    《Apache Portable Runtime (APR) 1.5.2与apr-util 1.5.2:深入理解与应用》 Apache Portable Runtime (APR) 是一个由Apache软件基金会开发的库,它为Apache HTTP服务器和其他基于Apache的项目提供底层系统接口和...

    apr-util-1.6.1.zip

    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-...

Global site tag (gtag.js) - Google Analytics