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 -

  • 相关阅读:
    升级windows 11小工具
    windows 10更新升级方法
    您需要了解的有关 Oracle 数据库修补的所有信息
    Step by Step Apply Rolling PSU Patch In Oracle Database 12c RAC Environment
    Upgrade Oracle Database Manually from 12.2.0.1 to 19c
    如何应用版本更新 12.2.0.1.210420(补丁 32507738 – 2021 年 4 月 RU)
    xtrabackup 安装、备份和恢复
    Centos_Lvm expand capacity without restarting CentOS
    Centos_Lvm_Create pv vg lv and mount
    通过全备+relaylog同步恢复被drop的库或表
  • 原文地址:https://www.cnblogs.com/jtuki/p/toolbox_test_common.html
Copyright © 2011-2022 走看看