1.常用的C++單元測試架構
測試驅動開發(TDD)已經是一種非常流行的開發方式了,在Java和.Net中都提供了非常好的單元測試架構,最近研究C++下面的單元測試,發現其實在C++中還是有很多選擇:
CPPUnit:著名的XUnit系列產品之一,熟悉JUnit、NUnit的開發人員可以很快上手。
CXXTest:需要進行預先處理,需要安裝Perl或Python。
Boost Test:功能強大,提供了自動註冊和手動註冊兩種方式,更重要的是來自千錘百鍊的Boost庫。
Google Test:Google在去年開源的測試架構,據說其內部上千個項目均採用該架構進行單元測試。
2.Boost Test起步
先來看一個簡單的Boost Test樣本(來自Boost文檔):
測試初步
1#define BOOST_TEST_MODULE example
2
3#include <boost/test/unit_test.hpp>
4
5
6
7int add(int i, int j);
8
9
10
11BOOST_AUTO_TEST_SUITE(minimal_test)
12
13
14
15BOOST_AUTO_TEST_CASE(my_test)
16
17{
18
19 BOOST_CHECK(add(2, 2) == 5);
20
21 BOOST_REQUIRE(add(2, 2) == 4);
22
23 if(add(2, 2) != 4)
24
25 BOOST_ERROR("oops!");
26
27 if(add(2, 2) != 4)
28
29 BOOST_FAIL("oops!");
30
31 if(add(2, 2) != 4)
32
33 throw "oops!";
34
35 BOOST_CHECK_MESSAGE(add(2, 2) == 4, "add(..) result: " << add(2, 2));
36
37 BOOST_CHECK_EQUAL(add(2, 2), 4);
38
39}
40
41
42
43BOOST_AUTO_TEST_SUITE_END()
44
45
首先,需要定義#define BOOST_TEST_MODULE example或者#define BOOST_AUTO_TEST_MAIN,否則測試模組初始化函數需要手動實現;然後宏“BOOST_AUTO_TEST_SUITE(minimal_test)”將建立一個名為minimal_test的測試套件,並將其加入到測試模組中。宏“BOOST_AUTO_TEST_CASE(my_test)”將建立一個名為“my_test”的測試案例,並將其加入到測試套件minimal_test中。
關於測試模組常犯的一個錯誤是在不同的測試檔案中定義不同的“#define BOOST_TEST_MODULE example”,最後將導致“multiple definition of ‘init_unit_test_suite(int, char**)’”錯誤,原因是在一個測試程式中只允許存在一個定義一個測試模組。測試模組中存在一個主測試套件,所有未明確包含到測試套件中的測試案例將被包含到主測試套件中。
下面是具體的測試過程了,在程式中展示了七種不同的方式來對函數add進行測試:
BOOST_CHECK:這種方法將檢查到的錯誤儲存起來,測試結束時由測試架構自動顯示;
BOOST_REQUIRE:同樣是檢查錯誤,與BOOST_CHECK不同之處在於如果發生錯誤時將拋出一個異常,因此後續的測試將不會繼續進行;
BOOST_ERROR:可以用來對錯誤進行獨立描述,測試結束時由測試架構自動顯示;
BOOST_FAIL:同樣可以用來對錯誤進行獨立描述,調用時將拋出一個異常;
拋出異常方式:測試架構將捕獲該異常並列印出錯誤資訊;
BOOST_CHECK_MESSAGE:與BOOST_CHECK類似,可以在第二個參數中加入錯誤描述資訊;
BOOST_CHECK_EQUAL:與BOOST_CHECKL類似,用來檢查兩個參數是否相等。