「工具箱」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) 编辑 收藏 举报