我所了解的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
在下面一节我将深入分析这个测试框架的内部实现
APR中的单元测试框架:初步分析及使用
最新推荐文章于 2023-10-17 09:37:29 发布