Test庫提供了強有力的單元測試框架(UTF),它為軟件開發的基本領域一單元測試提供了簡單而富有彈性的解決方案,可以滿足開發人員從高到低的各種需求,它的優點包括
- 易於理解,任何人都可以很容易地構建單元測試模塊
- 提供測試用例、測試套件的概念,並能夠以任意的復雜度組織它們
- 提供豐富的測試斷言,能夠處理各種情況,包括C++異常
- 可以很容易地初始化測試用例、測試套件或者整個測試程序
- 可以顯示測試進度,這對於大型測試是非常有用的
- 測試信息可以顯示為多種格式,如平文件或者XMI格式;
- 支持命令行,可以指定運行任意一個測試套件或測試用例
- 還有許多更高級的用法
這是一個非常不錯的測試框架
這個框架包含的部分:
- 測試斷言
- 測試用例和套件
- 測試夾具
- 測試日志
- 運行參數
- 函數執行監視器
- 程序執行監視器
- 高級議題
測試斷言
在Test庫中,測試斷言是一組命名清楚的宏,它們的用法類似 BOOST_ ASSERT,斷言測試通過。如果測試失敗,則會記錄出錯的文件名和行號以及錯誤信息。
Test庫中一個典型的測試斷言是 BOOST CHECK EQUAL,形式是 BOOST_XXX_YYY,具體
命名規則如下:
- BOOST_:遵循 Boost庫的命名規則,宏一律以大寫的 BOOST開頭
- XXX:斷言的級別。WARN是警告級,不影響程序運行,也不增加錯誤數量; CHECK是檢查級別,如果斷言失敗增加錯誤數量,但不影響程序運行; REQUIRE是最高的級別
- YYY:各種具體的測試斷言,如斷言相等/不等、拋出/不拋出異常、大於或小於等等
很多的測試斷言,見文檔,我這里就舉例兩個:
BOOST_TEST_MESSAGE(message) :僅僅輸出通知信息,默認不會顯示
BOOST_XXX_EQUAL(l,r) :測試l=r,否則輸出錯誤信息
測試用例和套件
測試用例是一個包含多個測試斷言的函數,它是可以被執行的最小單元,各個測試用例之間是無關的,一個測試用例的執行失敗,並不會影響其他的測試用例
測試套件是測試用例的容器,就是把一組用例放在一起的一個東西
測試用例是在:
BOOST_AUTO_TEST_CASE( t_case1 )
{
BOOST_CHECK_EQUAL(1,1);
//.........還有很多的其他的斷言
}
測試套件:
BOOST_AUTO_TEST_SUITE( s_suit )
BOOST_AUTO_TEST_SUITE_END()
一個最簡單的測試
#define BOOST_TEST_MODULE example
#include"boost/test/unit_test.hpp"
BOOST_AUTO_TEST_SUITE( s_suit )
BOOST_AUTO_TEST_CASE( t_case1 )
{
BOOST_CHECK_EQUAL(1,1);
}
BOOST_AUTO_TEST_SUITE_END()
注意:這里的
#define BOOST_TEST_MODULE example
不可去掉,不然的話,會發生一個鏈接錯誤

測試夾具
測試用例和測試套件構成了單元測試的主體,可以滿足大部分單元測試的功能需求,但有的
時候這些還不夠,因為它們不能完成測試安裝和測試清理的任務。就像是Junit里的tearup和teardown一樣,是啟動和結束的函數:這個也是一個准備和清理函數
時候這些還不夠,因為它們不能完成測試安裝和測試清理的任務。就像是Junit里的tearup和teardown一樣,是啟動和結束的函數:這個也是一個准備和清理函數
測試安裝執行測試前的准備工作,初始化測試用例或測試套件所需的數據。試清理是試
安裝的反向操作,執行必要的清理工作。
安裝的反向操作,執行必要的清理工作。
測試安裝和測試清理的動作很像C++中的構造函數和析構函數,Test要求定義一個輔助類,
它的構造函數和析構函數分別執行測試安裝和測試清理,之后我們就可以在每個測試用例最開始聲明一個對象,它將自動完成測試安裝和測試清理
它的構造函數和析構函數分別執行測試安裝和測試清理,之后我們就可以在每個測試用例最開始聲明一個對象,它將自動完成測試安裝和測試清理
基於這個基本原理,UTF中定義了“測試夾具”的概念,它實現了自動的測試安裝和測試清理
#define BOOST_TEST_MODULE example1
#include<iostream>
#include"boost/test/unit_test.hpp"
//全局測試夾具
struct global_fixture
{
global_fixture()
{
std::cout<<"3開始准備測試數據------->"<<std::endl;
}
virtual~global_fixture(){
std::cout<<"3清理測試環境<---------"<<std::endl;
}
};
//定義全局夾具
BOOST_GLOBAL_FIXTURE(global_fixture);
BOOST_AUTO_TEST_SUITE( s_suit )
BOOST_AUTO_TEST_CASE( t_case1 )
{
BOOST_CHECK_EQUAL(1,1);
}
BOOST_AUTO_TEST_CASE( t_case2 )
{
BOOST_CHECK_EQUAL(3,1);
}
BOOST_AUTO_TEST_SUITE_END()
測試日志
測試日志是單元測試在運行過程中產生的各種文本信息,包括警告、錯誤和基本信息息,默認情況下這些測試日志都被定向到標准輸出( stdout)。測試日志不同於測試報告,后者是對測試日志的總結
測試日志,一般情況下,是在當前的項目工程的IDE里看的
每條測試日志都有一個級別,只有超過允許級別的日志才能被輸出。UTF的日志的級別從低
到高,高級別禁止了低級別的許可,但比它更高級別的日志則不受限制。
這些日志級別如下:
all:
輸出所有的測試日志;
success:相當於all
.....
默認情況下,UTF的日志級別是 warning,會輸出大部分單元測試相關的診斷信息,但BOOST TEST MESSAGE宏由於是 message級別,它的信息不會輸出
運行參數
命令:
--arg_name=arg_value
run_test:可以指定任意的要運行的測試用例或者是測試套件,用斜杠(/)來訪問任意測試樹的任意節點
還有很多其他的一些測試命令,可以非常方便的讓運行按照你想要的方式來
后面這兩個算不上是測試的東西
函數執行監視器:監視函數運行,函數發生意外時,調用這個函數