本文使用googletest進行單元測試,這裏先簡要介紹一下googletest。googletest(簡稱gtest)是一個跨平臺的而且開源的(Linux、Mac OS X、Windows、Cygwin、Windows CE and Symbian)C++單元測試框架,由google公司發佈。gtest是爲在不一樣平臺上爲編寫C++測試而生成的。它提供了豐富的斷言、致命和非致命判斷、參數化、「死亡測試」等。ios
本文的內容基於win10+vs2015使用googletest框架進行C++單元測試,那麼咱們要作的第一個工做就是去下載和配置googletest,以便於咱們接下來進行使用。git
到https://github.com/google/googletest這個地址去下載googletest的源碼爲咱們下一步進行編譯作準備。github
下載完成以後咱們獲得的是一個zip格式的壓縮文件,咱們將其解壓到合適的目錄(以方便本身查找爲原則)。這裏咱們須要注意兩個文件夾,待會須要使用。express
使用vs2015打開msvc/2010裏面的gtest.sln,會提示升級VC++編譯器和庫,點擊肯定便可。多線程
等待升級完成後,打開gtest項目屬性對話框(能夠右鍵單擊項目名,打開屬性),配置工程屬性。按圖中兩種方式修改都是能夠的(注意和後面測試項目的屬性設置比較)。框架
Debug、Release兩個模式都要編譯。函數
在編譯時會出現「沒法啓動程序」字樣,這是正常的,由於咱們只是生成了相關的庫文件,並非可執行文件。單元測試
編譯後,在msvc/2010/gtest/下有Win32-Debug、Win32-Release兩個文件夾,而且每一個文件夾裏面有一個gtestd.lib文件,以下圖所示。學習
至此,準備階段完成。測試
斷言:gtest中採用了大量的宏來包裝斷言,這裏的斷言不一樣於C語言當中的斷言(assert)。
按照其使用方法能夠分爲兩類:
按照經常使用功能能夠依次分爲12類,日常主要用到的如下這幾類:
布爾值比較 |
||
ASSERT_TRUE(condition) |
EXPECT_TRUE(condition) |
condition == true |
ASSERT_FALSE(condition) |
EXPECT_FALSE(condition) |
condition == false |
數值型數據比較 |
||
ASSERT_EQ (expected, actual) |
EXPECT_EQ (expected, actual) |
expected == actual |
ASSERT_NE (val1, val2) |
EXPECT_NE (val1, val2) |
val1 != val2 |
ASSERT_LT (val1, val2) |
EXPECT_LT (val1, val2) |
val1 < val2 |
ASSERT_LE (val1, val2) |
EXPECT_LE (val1, val2) |
val1 <= val2 |
ASSERT_GT (val1, val2) |
EXPECT_GT (val1, val2) |
val1 > val2 |
ASSERT_GE (val1, val2) |
EXPECT_GE (val1, val2) |
val2 >= val2 |
字符串比較 |
||
ASSERT_STREQ (str1, str2) |
EXPECT_STREQ (str1, str2) |
兩個C字符串內容相同(同時支持char *和wchar_t *類型) |
ASSERT_STRNE (str1, str2) |
EXPECT_STRNE (str1, str2) |
兩個C字符串內容不一樣(同時支持char *和wchar_t *類型) |
ASSERT_STRCASEEQ (str1, str2) |
EXPECT_STRCASEEQ (str1, str2) |
兩個C字符串內容相同,忽略大小寫(只支持char *類型) |
ASSERT_STRCASENE (str1, str2) |
EXPECT_STRCASENE (str1, str2) |
兩個C字符串內容不一樣,忽略大小寫(只支持char *類型) |
浮點數比較 |
||
ASSERT_FLOAT_EQ (val1, val2) |
EXPECT_FLOAT_EQ (val1, val2) |
the two float values are almost equal |
ASSERT_DOUBLE_EQ (val1, val2) |
EXPECT_DOUBLE_EQ (val1, val2) |
the two double values are almost equal |
近似數比較 |
||
ASSERT_NEAR (val1, val2, abs_error) |
EXPECT_NEAR (val1, val2, abs_error) |
兩個數值val1和val2的絕對值差不超過abs_error |
|
|
|
|
||
異常檢查 |
||
ASSERT_THROW (statement, exception_type) |
EXPECT_THROW (statement, exception_type) |
拋出指定類型異常 |
ASSERT_THROW(statement) |
EXPECT_THROW(statement) |
拋出任意類型異常 |
ASSERT_NO_THROW(statement) |
EXPECT_NO_THROW(statement) |
不拋異常 |
|
||
函數值與參數檢查(目前最多隻支持5個參數) |
||
ASSERT_PRED1(pred1, val1) |
EXPECT_PRED1(pred1, val1) |
pred1(val1) returns true |
ASSERT_PRED2(pred2, val1, val2) |
EXPECT_PRED2(pred2, val1, val2) |
pred2(val1, val2) returns true |
|
||
Windows HRESULT |
||
ASSERT_HRESULT_SUCCEEDED(expression) |
EXPECT_HRESULT_SUCCEEDED(expression) |
expression is a success HRESULT |
ASSERT_HRESULT_FAILED(expression) |
EXPECT_HRESULT_FAILED(expression) |
expression is a failure HRESULT |
|
||
自定義格式函數與參數檢查(目前最多支持5個參數) |
||
ASSERT_PRED_FORMAT1(pred1, val1) |
EXPECT_PRED_FORMAT1(pred1, val1) |
pred1(val1) is successful |
ASSERT_PRED_FORMAT1(pred1, val1, val2) |
EXPECT_PRED_FORMAT1(pred1, val1, val2) |
pred2(val1, val2) is successful |
在vs2015中,建立Win32控制檯應用程序MyTest。
打開項目屬性對話框,配置工程屬性。展開「配置屬性 -> C/C++ -> 常規」,在【附加包含目錄】中添加「.\include」(這裏省略了include的相關母目錄,在以前有過關於include的說明,若是忘記在哪找,能夠在前邊的內容中複習一下);展開「C/C++ -> 代碼生成」,在【運行庫】中修改成多線程調試DLL(/MDd),以下圖所示。
展開「連接器 -> 輸入」,在【附加依賴項】添加剛剛生成的lib文件路徑,注意這裏是配置Debug,要輸入Win32-Debug裏面的gtestd.lib文件路徑(這裏須要注意文件名後面有個d)。
以上就是配置Debug的方式,配置Release只須要把前邊相對應的位置改成Release的相關內容便可。
這裏測試代碼主要分爲3個文件,主文件FirstGtest.cpp,以及Box類的兩個相關文件CBox.h和CBox.cpp
1 // CBox.h 2 #pragma once 3 #include <string.h> 4 5 //Box類的定義 6 class CBox 7 { 8 public: 9 //構造函數 10 CBox(double length_value, double width_value, double height_value); 11 //默認構造函數 12 CBox(); 13 //volume函數用於計算Box的體積 14 double volume(); 15 16 private: 17 //Box的3個特性:長、寬、高 18 double Length_of_box; 19 double Width_of_box; 20 double Height_of_box; 21 };
1 //FirstGtest.cpp 2 #include"stdafx.h" 3 #include"gtest\gtest.h" 4 #include"CBox.h" 5 6 //CBox測試類,繼承Test對Box進行測試使用 7 class CBox_test : public testing::Test 8 { 9 protected: 10 CBox* c; 11 virtual void SetUp() 12 { 13 c = new CBox(2, 3, 4); 14 } 15 16 virtual void TearDown() 17 { 18 delete this->c; 19 } 20 }; 21 22 TEST(CBox, case1) 23 { 24 CBox box1{ 78.0, 24.0, 18.0 }; 25 CBox box2; 26 EXPECT_LT(23.0, box1.volume()); 27 } 28 29 TEST_F(CBox_test, case2) 30 { 31 EXPECT_EQ(4, c->volume()); 32 } 33 34 int main(int argc, char* argv[]) 35 { 36 testing::InitGoogleTest(&argc, argv); 37 return RUN_ALL_TESTS(); 38 }
1 //CBox.cpp 2 #include "stdafx.h" 3 #include<iostream> 4 #include"CBox.h" 5 6 using namespace std; 7 8 //構造函數定義,包含3個參數: 9 CBox::CBox(double length_value, double width_value, double height_value) 10 { 11 cout << "Constructor called." << endl; 12 Length_of_box = length_value; 13 Width_of_box = width_value; 14 Height_of_box = height_value; 15 } 16 17 //默認構造函數 18 CBox::CBox() 19 { 20 cout << "Default constructor is called." << endl; 21 } 22 23 24 // 計算Box體積函數 25 double CBox::volume() 26 { 27 return Length_of_box * Width_of_box * Height_of_box; 28 }
做者:耑新新,發佈於 博客園
轉載請註明出處,歡迎郵件交流:zhuanxinxin@foxmail.com