我所了解的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函数生成测试用例报告。