目录
- 1 概述
- 2 设计
- 3 扩展Output
- 3.1 扩展实例
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
- 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
- Terse 其仅显示正确测试的数量。
- CollectorOutput 收集型输出类型,不同于上面实时输出类型,收集输出类型先收集信息,在整个测试完毕后统一输出。
- HtmlOutput Html格式输出属于收集型输出
- CompilerOutput 类似编译器输出类型,支持格式如下:
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; \ } \ }
- 上面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; \ } \ }