当前位置:   article > 正文

CPPTest设计分析

CPPTest设计分析

1 概述

  CppTest是一个可移植、功能强大但简单的单元测试框架,用于处理C++中的自动化测试。重点在于可用性和可扩展性。支持多种输出格式,并且可以轻松添加新的输出格式。

CppTest下载地址Sourceforge Github地址
下面对其设计进行分析,以更好对其使用。

2 设计

其类图如下:
类图
说明:

  • 从类图看其类型主要是Suite类型和Output类型
  • Suite其析构函数纯虚函数,明显是用来派生使用的。
    • 保护类型虚函数setup和tear_down是在运行Suite中每个测试函数之前和之后调用的接口,可以重载这两个接口,做测试之前的准备和收尾工作,这两个函数默认什么都不做。
  • Output类型是过程中所有输出类型的基类,其构造函数是保护类型的,不能直接使用,需要派生使用。需要实现接口如下:
    • initialize 初始化接口
    • finished 完成接口
    • suite_start suite开始接口
    • suite_end suite结束接口
    • test_start 测试开接口
    • test_end 测试结束接口
    • assertment 断言接口
  • 从Output派生的类型:
    • CompilerOutput 类似编译器输出类型,支持格式如下:
      • Generic - file:line: text
      • BCC - Error cpptest file line: text
      • GCC - file:line: text
      • MSVC - file(line) : text
    • TextOutput 文本个数输出,支持格数如下:
      • Terse 其仅显示正确测试的数量。
        RingQueueSuite: 2/2, 50% correct in 0.002901 seconds
        Total: 2 tests, 50% correct in 0.002901 seconds
        
        • 1
        • 2
      • Verbose 显示正确测试的数量基础上,其还示出了针对每个失败的测试的扩展断言信息。
        RingQueueSuite: 2/2, 50% correct in 0.002377 seconds
        Test:    one_to_multi
        Suite:   RingQueueSuite
        File:    cpp/test/concurrent/concurrent/ring_queue_test.cpp
        Line:    90
        Message: Got 5, expected 6
        
        Total: 2 tests, 50% correct in 0.002377 seconds
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
    • CollectorOutput 收集型输出类型,不同于上面实时输出类型,收集输出类型先收集信息,在整个测试完毕后统一输出。
      • HtmlOutput Html格式输出属于收集型输出

3 扩展Output

如果是实时输出直接从Output派生,如果是收集型输出,需要从CollectorOutput派生。

3.1 扩展实例

cpptest默认输出都是英文信息,假如我们想输出中文信息及报告。我们需要:

  • 派生我们自己Output,在我们自己的Output实现中需要输出时按中文输出即可。
  • 不使用TEST_ASSERT_EQUALS/TEST_ASSERT_EQUALS_OBJ/TEST_ASSERT_EQUALS_MSG/TEST_ASSERT_DELTA,这4个宏中会有英文错误信息。
    #define TEST_ASSERT_EQUALS_MSG(expected, got, msg)						\
        {																	\
            if (!((got) == (expected)))										\
            {																\
                std::stringstream tmpstream;								\
                tmpstream << (msg) << ": ";									\
                tmpstream << "Got " << (got) << ", expected " << (expected);\
                assertment(::Test::Source(__FILE__, __LINE__,				\
                            tmpstream.str().c_str()));						\
                if (!continue_after_failure()) return;						\
            }																\
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 上面4个宏如果需要,可以重新定义,将其中英文信息修改为中文信息。
    #define TEST_ASSERT_EQUALS_MSG(expected, got, msg)						\
        {																	\
            if (!((got) == (expected)))										\
            {																\
                std::stringstream tmpstream;								\
                tmpstream << (msg) << ": ";									\
                tmpstream << "期望 " << (expected) << ", 实际是 " << (got); \
                assertment(::Test::Source(__FILE__, __LINE__,				\
                            tmpstream.str().c_str()));						\
                if (!continue_after_failure()) return;						\
            }																\
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/781526
推荐阅读
相关标签
  

闽ICP备14008679号