目錄
- 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 6Total: 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; \} \}