我所了解的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
在下面一节我将深入分析这个测试框架的内部实现
分享到:
相关推荐
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. ...
4. 配置项目:如果你在Visual Studio或其他开发环境中使用这些库,确保在项目设置中指向正确的库文件路径。 5. 测试安装:在开发环境中,尝试编译一个简单的程序,引用APR、APR-Iconv和APR-Util,如果编译成功,...
这是 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 ...
标题中的"centos/redhat apr1.6.2 rpm包"指的是针对CentOS或Red Hat操作系统的一个软件包集合,这个集合包含的是APR(Apache Portable Runtime)库的1.6.2版本。APR是一个开源的C语言库,主要用于提供操作系统级别的...
7. **错误处理**:在配置和使用apr过程中可能出现的问题,如依赖库缺失、版本不兼容等,以及相应的解决策略。 8. **apr与Apache服务器的集成**:如何配置Apache服务器以使用apr,这通常涉及到修改httpd.conf配置...
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-...
以下是这个问题的详细分析及解决方案: **1. APR库的作用** APR库是Apache软件基金会开发的一个跨平台的库,它提供了与操作系统底层交互的功能,包括文件操作、网络I/O、线程管理等。Tomcat使用APR库可以提高性能,...
你可以通过测试程序或直接在Apache等项目中使用它来验证安装是否成功。 在Apache服务器的上下文中,APR-Util负责处理数据库连接、认证机制以及其他底层操作。例如,它支持各种身份验证方法,如Digest和NTLM,使得...
本文将详细介绍如何在 Linux 系统中安装和使用 APR 1.3.2 版本,以便于配置和运行 Apache HTTPD。 首先,了解 APR 和 apr-util 的关系至关重要。APR 提供了操作系统的基本功能,如文件操作和线程管理,而 apr-util ...
在这个安装包中,包含了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-1.6.2.tar"指的是Apache Portable Runtime (APR)库的1.6.2版本的源代码文件,它被压缩成一个tar格式的档案。APR是一个由Apache软件基金会开发的C语言库,它提供了一组低级别的系统接口,用于跨平台的...
TeamViewerPortable官方便携版免安装 版本:14.7.48671日期:Apr 13 2021 13:52:14 默认内网,用ip远程, 可以设置连接官方服务器,用id连接
在分析测试结果时,关注以下几个关键指标: 1. 响应时间:平均响应时间、最小和最大响应时间,可以反映服务器处理请求的速度。 2. 吞吐量:每秒完成的请求数,体现了服务器的处理能力。 3. 错误率:测试过程中出现...
5. **测试**:如果有的话,运行`make check`来执行单元测试,确保库的功能正常。 对于apr-util-1.5.2.tar.gz的处理过程与之类似,只是在配置时可能需要指定APR的安装位置,因为apr-util依赖于apr库。 在开发或维护...
在"apr-tutorial"这个示例教程中,你可能会学到如何初始化APR库,创建和使用内存池,执行文件操作,创建和管理线程,以及如何进行网络通信。这些实例代码将帮助你更好地理解和运用APR库,以便在实际项目中实现跨平台...
这通常涉及到在编译选项中包含APR的`include`目录,或者在源代码中使用适当的`#include`语句。 4. **重新编译**:完成上述步骤后,重新运行编译过程,看看是否还有其他错误或警告。如果头文件正确地被引入,编译...
例如,如果在 C 语言项目中使用 APR,可能需要以下步骤: 1. 引入头文件: ```c #include <apr.h> #include <apr_pools.h> // 例如,要使用内存池功能 ``` 2. 在编译命令行中指定头文件目录: ``` gcc -I"path\to\...
3. 需要添加--cache=arm-linux.cache选项,并在arm-linux.cache文件中添加apr_cv_process_shared_works=yes和apr_cv_mutex_robus=yes选项。 八、总结 Arm板Apache+PHP环境搭建需要编译多个源码,包括pcre、apr、...
标题中的"apr-util-1.5.4.tar.gz"是一个开源软件库的归档文件,它属于Apache Portable Runtime (APR)项目的一部分。APR是一个为各种操作系统提供统一API的库,主要用于处理底层系统功能,如文件I/O、网络通信、进程...