ShakeProof

「工具箱」Simple Test Model

简单分享一个小型的测试模型。

说是「简单分享」,其实是过于简陋,都不太好意思拿出手。尤其是对于熟悉某个单元测试框架(譬如 Python 的 pyUnit 框架)的同学,这个模型过于粗糙,而且目前来讲,只具备很初级的功能,不能和诸如 CMockery 这样的框架相提并论。

尽管如此,今天看到张沈鹏同学写的《金山卫士开源》一文,意识到了一些我从前并没有意识到的问题,譬如社区文化等等,也看到了一些成熟的社区里,堪称楷模式的人物,譬如 Zoom.Quiet 等等。鉴于此,不管多么幼稚,粗糙,用心分享自己的体验就好了。毕竟,谁不是从幼稚的阶段,逐步成长起来的呢?

言归正传。

两个宏定义,assertTrue(expr)assertEqual(expr, what) 用于断言的目的,然而并不会类似 C 语言的断言那样出错退出。run(test_func) 宏用于运行某个测试用例,有些测试套件的味道,然而并没有那么强大。TestResult() 宏,则是统计测试结果。

run 宏的 test_func 参数,是一个函数指针,由 typedef int (*test_func)(void); 定义。根据运行成功与否返回布尔值 1 或者 0 。不过,由于是宏定义,所以其实也无所谓,毕竟只是预处理器的文本替换。在使用时,只要各个测试子函数,都是诸如上述 test_func 类型就可以了。

用户在包含此测试头文件的同时,需要自定义一个拥有文件链接范畴的 static int errorCount 变量,选择文件链接范畴,是避免名字空间污染。断言宏,以及测试结果宏,都会用到这个变量。

额,罗嗦讲了这么多。不知道讲清楚没有。还是看例子吧。这个例子,来源于上一篇博客《工具箱之哈希表》(博客文章之间,不仅仅是时间轴的递进关系,还存在彼此关联的指向关系,奇妙呀),文章结尾提供了测试文件,就是采用了这里的模型。

最后,将实现列于此。

typedef int (*test_func)(void); // 中文字体放这里,看看显示效果 :P
enum _bool {
False, True
};

enum _verbosity {
Dot_Only = 1, With_Function_Name
};

static int verbosity = With_Function_Name;

#define assertTrue(expr) \
do { \
if ((expr) == 0) { \
fprintf(stderr, "Failed: file `%s', line %d - `%s'.\n", \
__FILE__, __LINE__, #expr); \
errorCount += 1; \
} \
} while(0)

#define assertEqual(expr, what) \
do { \
if ((expr) != (what)) { \
fprintf(stderr, "Failed: file `%s', line %d - `%s'.\n", \
__FILE__, __LINE__, #expr); \
errorCount += 1; \
} \
} while (0)

// test_func : int (*test_func)(void);
#define run(test_func) \
do { \
int result = (test_func)(); \
if (result && verbosity == With_Function_Name) \
printf("Passed: %s\n", #test_func); \
else if (result) \
printf("."); \
} while (0)

#define TestResult() \
do { \
if (errorCount == 0) \
printf("\n--------------\n" \
"All tests OK!\n"); \
else \
printf("\n--------------\n" \
"Testing Failed: %d failed.\n", errorCount); \
} while (0)

 

 

补记:
不知道这么长的代码,粘贴在这里,会不会对 RSS 输出造成影响(如果 RSS 上出现这么长一段代码,肯定美感尽失了)。毕竟在页面上可以通过设置最大高度,压缩到一定范围内,RSS 怎么控制呢?

- EOF -

posted on 2010-12-03 23:35  mirrorwheel  阅读(195)  评论(0编辑  收藏  举报

导航