文章目錄
-
- 概述
- 一、環境準備
- 二、源碼準備
- 三、準備googletest源碼和測試代碼
- 四、建構并編譯源碼和測試代碼
- 五、執行測試
- 六、總結
- 七、源碼擷取
概述
最近嘗試在windows下使用googletest, 并使用CMake進行建構,把學習的過程記錄下來。
建構環境和工具:
1、win10 64位
2、visual studio code
3、CMake for windows
4、mingw64 for window
5、LLVM for windows
一、環境準備
需要準備如下環境:
- 1、mingw64,并配置mingw64下的bin目錄為環境變量
- 2、cmake程式,并配置cmake.exe所在的目錄為環境變量
- 3、LLVM,并配置其bin目錄為環境變量
- 4、Visual Studio code安裝,并安裝C/C++插件。
二、源碼準備
建立一個待測的源碼,為了更貼合項目工程,這裡直接使用CMake工程的方式建構源碼,以一個兩個數交換值的例程舉例。
先建立一個gtest_win目錄,然後使用vscode打開這個檔案夾,
使用vscode在gtest_win裡面建立一個src檔案夾,用來放源碼,
src檔案夾下面建立include檔案夾,用于存放頭檔案,建立swap檔案夾,然後建立swap.h頭檔案
swap.h檔案内容如下:
#ifndef __SWAP_H_
#define __SWAP_H_
void swap(int &a, int &b);
#endif // !__SWAP_H_
再建立src檔案夾用于存放源檔案,在gtest_win/src/src下建立swap.cpp檔案,檔案内容如下:
#include "swap/swap.h"
/**
* @description: 兩個數交換
* @param : 傳入兩個值
* @return {*}
*/
void swap(int &a, int &b) {
int temp;
temp = a;
a = b;
b = temp;
}
在gtest_win/src下建立main.cpp檔案,檔案内容如下:
#include <iostream>
#include "swap/swap.h"
using namespace std;
int main(int argc, char **argv) {
int val1 = 10;
int val2 = 20;
cout << "before swap: val1=" << val1 << ", val2=" << val2 << endl;
swap(val1, val2);
cout << "after swap: val1=" << val1 << ", val2=" << val2 << endl;
return 0;
}
最後在gtest_win目錄下建立CMakeLists.txt檔案,檔案内容如下:
cmake_minimum_required(VERSION 3.0) # cmake -G "MinGW Makefiles" ..
project(GTESTWIN)
# 頭檔案目錄
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src/include")
# 源檔案目錄
AUX_SOURCE_DIRECTORY("${CMAKE_CURRENT_SOURCE_DIR}/src/src" DIR_SRCS)
# 生成可執行檔案
add_executable(gtest_win ./src/main.cpp ${DIR_SRCS})
建立在gtest_win下建立build目錄,用于存放建構的産物,這樣就不會在源碼中輸出亂七八糟的東西讓目錄變得很亂。
最後目錄結構如下:
VSCODE下右鍵build檔案夾,在內建終端中打開
輸入如下指令進行建構并編譯,確定我們準備的待測源碼可以正常編譯和執行:
cmake -G "MinGW Makefiles" ..
make
gtest_win.exe
這裡cmake加上-G “MinGW Makefiles” 參數是在win下cmake會預設建構mscv工程,加上這個參數會預設使用gnu建構。
一切正常将會輸出如下内容,這樣我們的待測源碼就準備好了:
D:\Projects\gtest181\gtest_win\build>cmake -G "MinGW Makefiles" ..
-- The C compiler identification is GNU 8.1.0
-- The CXX compiler identification is GNU 8.1.0
-- Check for working C compiler: D:/Program Files/mingw64/bin/gcc.exe
-- Check for working C compiler: D:/Program Files/mingw64/bin/gcc.exe - works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: D:/Program Files/mingw64/bin/g++.exe
-- Check for working CXX compiler: D:/Program Files/mingw64/bin/g++.exe - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: D:/Projects/gtest181/gtest_win/build
D:\Projects\gtest181\gtest_win\build>make
Scanning dependencies of target gtest_win
[ 33%] Building CXX object CMakeFiles/gtest_win.dir/src/main.cpp.obj
[ 66%] Building CXX object CMakeFiles/gtest_win.dir/src/src/swap.cpp.obj
[100%] Linking CXX executable gtest_win.exe
[100%] Built target gtest_win
D:\Projects\gtest181\gtest_win\build>gtest_win.exe
before swap: val1=10, val2=20
after swap: val1=20, val2=10
D:\Projects\gtest181\gtest_win\build>
三、準備googletest源碼和測試代碼
1、在gtest_win目錄下建立test檔案夾,用于存放googletest源碼和我們的測試代碼。
把下載下傳下來的googletest-release-1.8.1檔案夾放到test檔案夾下。
googletest-release-1.8.1下載下傳方法可參考:https://blog.csdn.net/wdcyf15/article/details/108855960
2、在test檔案夾下建立test_swap.cpp檔案,檔案内容如下:
#include <limits.h>
#include "gtest/gtest.h"
#include "gmock/gmock.h"
#include <cstdlib>
#include <iostream>
#include <string>
#include "swap/swap.h"
using ::testing::_;
using ::testing::Return;
using ::testing::AtLeast;
using ::testing::Exactly;
using namespace testing;
using namespace std;
TEST(SWAP_TEST, SWAP_TWO_INT) {
int val1 = 10;
int val2 = 20;
swap(val1, val2);
EXPECT_EQ(20, val1);
EXPECT_EQ(10, val2);
}
3、在test檔案夾下建立CMakeLists.txt檔案,用于建構測試程式,檔案内容如下:
cmake_minimum_required(VERSION 3.0) # cmake -G "MinGW Makefiles" ..
project(GTESTWIN_TEST)
# gtest庫相關
# 如果把gtest放到test目錄下,則使用如下包含關系:
add_subdirectory(./googletest-release-1.8.1) # 編譯gtest
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/googletest-release-1.8.1/googletest/include) # 包含gtest等頭檔案
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/googletest-release-1.8.1/googlemock/include) # 包含gmock等頭檔案
# 頭檔案目錄
include_directories("../src/include")
# 源檔案目錄
AUX_SOURCE_DIRECTORY("../src/src" SRCS)
# 測試代碼目錄
AUX_SOURCE_DIRECTORY("${CMAKE_CURRENT_SOURCE_DIR}" TEST_SRCS)
# 生成測試可執行程式
add_executable(gtest_win_test ${DIR_SRCS} ${TEST_SRCS})
# 連結測試庫,pthread 庫一定要寫在 ${GTEST_BOTH_LIBRARIES} 的後面, 否則編譯時會報錯,
# GTEST_BOTH_LIBRARIES表示連結google test的兩個庫
target_link_libraries( gtest_win_test
PRIVATE
gtest
gtest_main # 使用gtest帶的main函數,如果檢測到外部有main函數,則使用外部main函數,外部main函數要配置gtest初始化。
gmock
gmock_main # 使用gmock帶的main函數,如果檢測到外部有main函數,則使用外部main函數,與gtest_main同時存在則自動配置。
pthread )
test最終的目錄結構如下:
這樣測試代碼就準備好了,下面我們開始建構和編譯測試代碼。
四、建構并編譯源碼和測試代碼
在此我們将把測試代碼作為源碼的子工程添加到源碼中,測試代碼的CMake工程為test檔案夾,
所有我們修改gtest_win目錄下的CMakeLists.txt,在最後一行添加:
add_subdirectory(test)
檔案所有内容如下:
cmake_minimum_required(VERSION 3.0) # cmake -G "MinGW Makefiles" ..
project(GTESTWIN)
# 頭檔案目錄
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src/include")
# 源檔案目錄
AUX_SOURCE_DIRECTORY("${CMAKE_CURRENT_SOURCE_DIR}/src/src" DIR_SRCS)
# 生成可執行檔案
add_executable(gtest_win ./src/main.cpp ${DIR_SRCS})
# 增加測試工程
add_subdirectory(test)
再次打開build目錄終端,輸入如下指令進行建構和編譯:
cmake -G "MinGW Makefiles" ..
make
如果順利,将會輸出如下内容:
D:\Projects\gtest181\gtest_win\build>cmake -G "MinGW Makefiles" ..
-- The C compiler identification is GNU 8.1.0
-- The CXX compiler identification is GNU 8.1.0
-- Check for working C compiler: D:/Program Files/mingw64/bin/gcc.exe
-- Check for working C compiler: D:/Program Files/mingw64/bin/gcc.exe - works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: D:/Program Files/mingw64/bin/g++.exe
-- Check for working CXX compiler: D:/Program Files/mingw64/bin/g++.exe - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found PythonInterp: C:/Users/uidq0460.V01/AppData/Local/Programs/Python/Python37/python.exe (found version "3.7.3")
-- Configuring done
-- Generating done
-- Build files have been written to: D:/Projects/gtest181/gtest_win/build
D:\Projects\gtest181\gtest_win\build>make
Scanning dependencies of target gtest_win
[ 7%] Building CXX object CMakeFiles/gtest_win.dir/src/main.cpp.obj
[ 14%] Building CXX object CMakeFiles/gtest_win.dir/src/src/swap.cpp.obj
[ 21%] Linking CXX executable gtest_win.exe
[ 21%] Built target gtest_win
Scanning dependencies of target gtest
[ 28%] Building CXX object test/googletest-release-1.8.1/googlemock/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.obj
[ 35%] Linking CXX static library libgtest.a
[ 35%] Built target gtest
Scanning dependencies of target gtest_main
[ 42%] Building CXX object test/googletest-release-1.8.1/googlemock/gtest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.obj
[ 50%] Linking CXX static library libgtest_main.a
[ 50%] Built target gtest_main
Scanning dependencies of target gmock
[ 57%] Building CXX object test/googletest-release-1.8.1/googlemock/CMakeFiles/gmock.dir/src/gmock-all.cc.obj
[ 64%] Linking CXX static library libgmock.a
[ 64%] Built target gmock
Scanning dependencies of target gmock_main
[ 71%] Building CXX object test/googletest-release-1.8.1/googlemock/CMakeFiles/gmock_main.dir/src/gmock_main.cc.obj
[ 78%] Linking CXX static library libgmock_main.a
[ 78%] Built target gmock_main
Scanning dependencies of target gtest_win_test
[ 85%] Building CXX object test/CMakeFiles/gtest_win_test.dir/__/src/src/swap.cpp.obj
[ 92%] Building CXX object test/CMakeFiles/gtest_win_test.dir/test_swap.cpp.obj
[100%] Linking CXX executable gtest_win_test.exe
[100%] Built target gtest_win_test
D:\Projects\gtest181\gtest_win\build>
可以看到
[ 21%] Built target gtest_win 表示生成了gtest_win.exe可執行程式
[100%] Built target gtest_win_test 表示生成了gtest_win_test.exe可執行程式
五、執行測試
因為我們的測試程式是測試程式的子工程,是以編譯之後,在build目錄下隻看到gtest_win.exe,
并沒有看到gtest_win_test.exe,我們需要cd test進入test目錄,才看到gtest_win_test.exe程式,
輸入gtest_win_test.exe執行該測試程式,就可以開始測試了:
D:\Projects\gtest181\gtest_win\build>cd test
D:\Projects\gtest181\gtest_win\build\test>gtest_win_test.exe
Running main() from D:\Projects\gtest181\gtest_win\test\googletest-release-1.8.1\googletest\src\gtest_main.cc
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from SWAP_TEST
[ RUN ] SWAP_TEST.SWAP_TWO_INT
[ OK ] SWAP_TEST.SWAP_TWO_INT (0 ms)
[----------] 1 test from SWAP_TEST (5 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (19 ms total)
[ PASSED ] 1 test.
D:\Projects\gtest181\gtest_win\build\test>
六、總結
到此,在windows下使用gtest和cmake進行建構和編譯執行測試的工程完成了,跟linxu下的差不多,如果使用VS建構,需要CMAKE建構生成MSCV工程,然後使用VS打開進行編譯,本篇使用VSCODE,可以參考。
七、源碼擷取
本例程的源碼可到此下載下傳:https://github.com/TonsenWei/gtest_win