gtest單元測試配置+vs 2015+OpenCppCoverage輸出測試覆蓋率 || cmake命令構建項目以及編譯以及命令行測試

目錄

一、僅使用gtest+vs2015

1.下載和編譯gtest

2.創建具體的項目 

 3.gtest自帶十個例子

二、使用gtest+vs2015,並且輸出測試覆蓋率

1.使用vs 2015企業版

2.使用OpenCppCoverage +vs 2015(企業版,社區版都可以)

三、使用cmake生成項目,構建+gtest進行單元測試+使用命令行執行opencppcoverage輸出測試覆蓋率

1.基本的構建和介紹,請看下面這篇文章

2.構建引入gtest的項目

 3.使用opencppcoverage輸出測試覆蓋率

補充 

Cmakelists配置多級目錄的gtest項目(項目代碼和測試代碼分離)


 

 

 

 

 

 

 

 

 

 

 


前言

首先,關於c++的單元測試的方法偏少(相比java)

其次,在windows環境下的部署方法更少

最後,如果還要輸出測試覆蓋率,搜索之後發現,幾乎沒有教程,有也是零星幾句,也沒有更詳細的配置

因此,走過一遍之後打算記錄一下過程,方便以後配置也方便有這方面需求的人的查看

聲明,文章中涉及到的工具用的是vs2015 enterprise/community+gtest-release-1.7.0+Opencppcoverage+cmake

如何搭配使用見文章詳情

一、僅使用gtest+vs2015

1.下載和編譯gtest

  • 首先下載vs 2015,網上有社區版(免費)+企業版(收費/破解) 如果只需要vs+gtest,並且不使用cmake命令,而且不需要覆蓋率用的話,社區版就夠了,如果需求不滿足前面的條件,就去下載企業版enterprise

我沒放c盤,因爲太大了,動不動就10g了

  • 接着下載gtest

https://github.com/google/googletest/tree/release-1.7.0

下載這個版本就夠了,解壓之後要進行編譯

  • 對gtest.sln進行編譯

Gtest源碼下載之後,在vs中打開msvc文件夾的gtest.sln

打開之後有4個工程

然後重新編譯,debug、release兩個模式都要編譯。編譯後,在msvc/gtest/下有debug、release兩個文件夾。

  msvc\gtest\Debug - Debug方案下的二進制文件:gtestd.lib、gtest_maind.lib(注意主文件名的d後綴)
  msvc\gtest\Release - Release方案下的二進制文件:gtest.lib、gtest_main.lib

說明   編譯就是右鍵-生成/重新生成 

2.創建具體的項目 

創建具體的測試項目,以debug模式爲例

  1. 在VS2015中,創建WIN32控制檯應用
  2. 右擊工程名,點擊屬性,配置工程屬性; 展開配置屬性——C/C++——常規,在附加包含目錄中添加gtestinclude文件

比如:

D:\Test-my\googletest-release-1.7.0\googletest-release-1.7.0\include;

 

3.展開“C/C++——代碼生成,在運行庫中修改爲多線程調試(/MTd)”

 

4.展開鏈接器——輸入,在附加依賴項中添加第二步生成的gtestd.lib,附加上正確的路徑;在這裏有個小技巧,.lib是靜態庫文件,你可以把它們放到一個專門的lib文件夾下

比如

D:\Test-my\googletest-release-1.7.0\googletest-release-1.7.0\lib\gtestd.lib;

 5.測試實例

  • 頭文件

 

  • 源文件

  • 測試文件

  •  結果

 

說明,具體語法的斷言寫法,網上到處都有。主要是配置過程很容易出錯。

如果沒有main函數,會調用gtest_main.cc ,配置好gtest_maind.lib

https://www.cnblogs.com/qinwanlin/p/6574573.html

 3.gtest自帶十個例子

但是需要編譯,因爲他沒有lsn文件是不能打開執行的

但是這個網上有教程,我就不贅述了

附上鍊接

 

https://www.cnblogs.com/duxiuxing/p/4272343.html              如何編譯gtest自帶的十個samples例子,當然不能放在同一個項目裏,有些可以放在一個項目裏有些不能。我編譯的時候分成了兩個或者三個項目,一個是自帶main函數不需要配置gtest_main,一個是沒有main函數,需要配置,放在一起回出錯。

並且要注意引入的頭文件。

 

 

https://blog.csdn.net/yansmile1/article/details/70256911  gtest的samples的解釋說明

 

二、使用gtest+vs2015,並且輸出測試覆蓋率

1.使用vs 2015企業版

因爲企業版功能是比較完善的

所以如果下載的是企業版的話,可以構建項目+測試項目,企業版會展示出你寫的所有測試類,並且執行之後會告訴你通過情況,並且給出覆蓋率情況

  • 這個需要先新建一個項目(我是控制檯32項目),也需要下載一個插件Unit Test Generator

先給出官網給的說明

再給出已經有人寫的教程,可能有的是c#,有的是c++,但操作是一樣的,選擇對應的語言就可以,我覺得他已經寫得非常詳細了,我就是參考這樣配置的

編譯之後,點擊測試-運行-測試項目

然後測試-分析代碼覆蓋率

 

 

2.使用OpenCppCoverage +vs 2015(企業版,社區版都可以)

下面這篇文章雖然介紹的很簡單,但是至少提供了方向

如果不使用命令行的話,第二種做法就夠了,直接通過插件安裝

 

 然後選擇工具,run opencpp就可以了

出現紅色綠色的陰影

紅色是未覆蓋,綠色是覆蓋

 

三、使用cmake生成項目,構建+gtest進行單元測試+使用命令行執行opencppcoverage輸出測試覆蓋率

 

CMake是一個工程構建工具,能夠自動生產makefile文件,方便構建編譯文件,鏈接庫,安裝文件等。

每個需要編譯的目錄(子目錄)都要有一個CMakeLists.txt文件

1.基本的構建和介紹,請看下面這篇文章

https://blog.csdn.net/yaoyuanyylyy/article/details/79024962

上面介紹了怎麼使用cmake構建一個項目並且執行

2.構建引入gtest的項目

下面這篇文章簡單的介紹了,但執行過程出現各種問題

http://www.sohu.com/a/251930931_216613

下面詳細介紹我的實現步驟

 

  • 首先建兩個文件(僅供參考)

文件內容如下 

test.cpp

#include <gtest/gtest.h>
#include <string>
#include <map>
using namespace std;
 
class TestMap :public testing::Test
{
public:
	//添加日誌
	static void SetUpTestCase()
	{
		cout << "SetUpTestCase" << endl;
	}
	static void TearDownTestCase()
	{
		cout << "TearDownTestCase" << endl;
	}
	virtual void SetUp()   //TEST跑之前會執行SetUp
	{
		cout << "SetUp" << endl;
		test_map.insert(make_pair(1, 0));
		test_map.insert(make_pair(2, 1));
		test_map.insert(make_pair(3, 2));
		test_map.insert(make_pair(4, 3));
		test_map.insert(make_pair(5, 4));
	}
	virtual void TearDown() //TEST跑完之後會執行TearDown
	{
		cout << "TearDown" << endl;
		test_map.clear();
	}
	map<int, int> test_map;
};
TEST_F(TestMap, Find)   //此時使用的是TEST_F宏
{
	map<int, int>::iterator it = test_map.find(1);
	ASSERT_NE(it, test_map.end());
}
TEST_F(TestMap, Size)
{
	ASSERT_EQ(test_map.size(), 5);
}
 

CMakelists.txt

 

cmake_minimum_required(VERSION 3.6)

include_directories(D:/Test-my/gtest/demo3/googletest-release-1.7.0/googletest-release-1.7.0/include)

#關閉gmock,根據您的情況打開
set(BUILD_GMOCK OFF)

#編譯庫的例子
add_subdirectory(D:/Test-my/gtest/demo3/googletest-release-1.7.0/googletest-release-1.7.0)

#新建一個測試工程
project(learnGoogleTest)
link_directories(D:/Test-my/gtest/demo3/googletest-release-1.7.0/googletest-release-1.7.0/lib)
add_executable(learnGoogleTest test.cpp)
target_link_libraries(learnGoogleTest gtest gtest_main)

#這個必須放在project的後面
IF(MSVC)
   message("run here")
   set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
   set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
endif()

具體設置不再描述,看一下就明白了,中間比如路徑設置什麼的,爲了簡單和整體性的話可以前面進行一個set,方便後面 進行使用,在這裏我全部用的是絕對路徑

  •  接下來通過cmake指令構建一個項目

如果沒有下載cmake和配置環境,需要先下載配置環境變量,下面這篇文章講的還是比較清晰的,他描述瞭如何使用cmake命令的gui去生成項目,使用vs打開項目進行編譯,或者使用vs自帶的命令行執行msbuild進行構建

https://blog.csdn.net/yaoyuanyylyy/article/details/79024962

 

但是如果全程都要用命令行呢(方便跨平臺)

通過當前目錄的cmd就可以直接進入命令行

或者使用cd /d d:進入盤

下面的指令寫的很清晰了 ,構建build目錄,然後cmake ..

然後執行cmake - build . 

發現在build目錄下面有.sln 這是你cmakelists.txt裏面寫的項目名稱,出現.sln說明項目生成成功

  • 接下來是編譯生成debug目錄,最最關鍵的一個步驟 

完了,此時我發現我生成項目可以用cmd命令行的cmake,也可以使用可視化界面

但是編譯項目,貌似只能用vs自帶的一個命令行工具(linux可以直接編譯)

執行msbuild命令

 

此時生成debug目錄,目錄裏面就有可執行文件

 

 雙擊執行

好了,使用cmakelists構建以及編譯項目到此結束了

默認是生成vs項目,可以使用命令行參數生成其他項目,也可以使用可視化界面選擇生成的項目類型 

 

 3.使用opencppcoverage輸出測試覆蓋率

下面這個網頁給出了簡單的命令

但是也是有一些問題的

所以給出對應的我的測試項目的命令

在debug目錄下面進入cmd命令窗口

D:\Test-my\gtest\demo3\build\Debug>OpenCppCoverage.exe --sources D:\Test-my\gtest\demo3 --export_type=html -- D:\Test-my\gtest\demo3\build\Debug\learnGoogleTest.exe

執行成功

需要注意的是,opencpp輸出的覆蓋率是代碼行覆蓋率

 而且opencpp的作者也說了是line coverage

目前也沒有找到windows下其他更好的測試覆蓋率的輸出了

以上,希望對大家能夠有所幫助。 

補充 

Cmakelists配置多級目錄的gtest項目(項目代碼和測試代碼分離)

另外,在我的另一篇博客裏補充了,多級目錄下gtest項目的配置

https://blog.csdn.net/yysave/article/details/96996123

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章