目錄
2.使用OpenCppCoverage +vs 2015(企業版,社區版都可以)
三、使用cmake生成項目,構建+gtest進行單元測試+使用命令行執行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模式爲例
- 在VS2015中,創建WIN32控制檯應用
- 右擊工程名,點擊“屬性”,配置工程屬性; 展開“配置屬性——C/C++——常規”,在“附加包含目錄”中添加gtest的include文件
比如:
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
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