zoukankan      html  css  js  c++  java
  • 「工具箱」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 -

  • 相关阅读:
    算法笔记_035:寻找最小的k个数(Java)
    (中级篇 NettyNIO编解码开发)第六章-编解码技术
    (入门篇 NettyNIO开发指南)第五章-分隔符和定长解码器使用
    (入门篇 NettyNIO开发指南)第四章-TIP黏包/拆包问题解决之道
    (入门篇 NettyNIO开发指南)第三章-Netty入门应用
    (基础篇 走进javaNIO)第二章-NIO入门
    (基础篇 走进javaNIO)第一章-java的i/o演进之路
    Apache Commons 工具类介绍及简单使用
    SimpleDateFormat使用和线程安全问题
    Calendar使用
  • 原文地址:https://www.cnblogs.com/jtuki/p/toolbox_test_common.html
Copyright © 2011-2022 走看看