VS2015搭建GoogleTest框架--配置第一個項目

1、googletest簡介

本文使用googletest進行單元測試,這裏先簡要介紹一下googletest。googletest(簡稱gtest)是一個跨平臺的而且開源的(Linux、Mac OS X、Windows、Cygwin、Windows CE and Symbian)C++單元測試框架,由google公司發佈。gtest是爲在不一樣平臺上爲編寫C++測試而生成的。它提供了豐富的斷言、致命和非致命判斷、參數化、「死亡測試」等。ios

2、相關的準備工做

本文的內容基於win10+vs2015使用googletest框架進行C++單元測試,那麼咱們要作的第一個工做就是去下載和配置googletest,以便於咱們接下來進行使用。git

2.1下載源碼

https://github.com/google/googletest這個地址去下載googletest的源碼爲咱們下一步進行編譯作準備。github

2.2編譯googletest源碼生成咱們須要的庫文件

下載完成以後咱們獲得的是一個zip格式的壓縮文件,咱們將其解壓到合適的目錄(以方便本身查找爲原則)。這裏咱們須要注意兩個文件夾,待會須要使用。express

 

 

使用vs2015打開msvc/2010裏面的gtest.sln,會提示升級VC++編譯器和庫,點擊肯定便可。多線程

等待升級完成後,打開gtest項目屬性對話框(能夠右鍵單擊項目名,打開屬性),配置工程屬性。按圖中兩種方式修改都是能夠的(注意和後面測試項目的屬性設置比較)。框架

Debug、Release兩個模式都要編譯。函數

在編譯時會出現「沒法啓動程序」字樣,這是正常的,由於咱們只是生成了相關的庫文件,並非可執行文件。單元測試

 

編譯後,在msvc/2010/gtest/下有Win32-Debug、Win32-Release兩個文件夾,而且每一個文件夾裏面有一個gtestd.lib文件,以下圖所示。學習

至此,準備階段完成。測試

2.3必要知識學習

斷言:gtest中採用了大量的宏來包裝斷言,這裏的斷言不一樣於C語言當中的斷言(assert)。

按照其使用方法能夠分爲兩類:

  1. ASSERT系列(ASSERT_&系列,當檢查點失敗時,退出當前函數,並不是推出當前案例);
  2. EXPECT系列(EXPECT_*系列的斷言,當檢查點失敗時,繼續往下執行)。

按照經常使用功能能夠依次分爲12類,日常主要用到的如下這幾類:

  1. 布爾值比較
  2. 數值型數據比較
  3. 字符串比較
  4. 浮點數比較
  5. 近似數比較
  6. 異常檢測
  7. 自定義格式函數與參數檢查

布爾值比較

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

 

2.4建立測試項目並配置屬性

在vs2015中,建立Win32控制檯應用程序MyTest。

打開項目屬性對話框,配置工程屬性。展開「配置屬性 -> C/C++ -> 常規」,在【附加包含目錄】中添加「.\include」(這裏省略了include的相關母目錄,在以前有過關於include的說明,若是忘記在哪找,能夠在前邊的內容中複習一下);展開「C/C++ -> 代碼生成」,在【運行庫】中修改成多線程調試DLL(/MDd),以下圖所示。

 

展開「連接器 -> 輸入」,在【附加依賴項】添加剛剛生成的lib文件路徑,注意這裏是配置Debug,要輸入Win32-Debug裏面的gtestd.lib文件路徑(這裏須要注意文件名後面有個d)。

 

以上就是配置Debug的方式,配置Release只須要把前邊相對應的位置改成Release的相關內容便可。

2.5編寫測試代碼

這裏測試代碼主要分爲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 }

 

3、遇到的問題及解決辦法

  1. 在生成兩個gtestd.lib文件時,編譯器報「不是有效的Win32應用程序」,由於以前寫的程序都是生成可執行程序,而沒有作過只生成庫文件的程序,本能地覺得程序出錯了,以後通過查閱資料和以及進一步地深刻研究,發現這裏只是生成了依賴庫文件(咱們也只須要這個庫),並無生成可執行文件,因此那是正常的。
  2. 配置googletest依賴庫時,「配置屬性 -> C/C++ -> 代碼生成」中的【運行庫】,先後沒有設置相同的模式,從而致使找不到對應的庫的狀況。
  3. 在配置googletest時,修改「配置屬性 -> 連接器 -> 輸入」中的【附加依賴項】時,只填到了咱們所生成的庫文件的目錄,可是沒有添加文件名,報找不到*.obj文件的錯誤,只須要把路徑填寫到庫文件就能夠解決這個問題。

 

做者:耑新新,發佈於  博客園

轉載請註明出處,歡迎郵件交流:zhuanxinxin@foxmail.com

相關文章
相關標籤/搜索