天天看點

gtest使用入門(6)-win下使用vscode和cmake建構

文章目錄

    • 概述
    • 一、環境準備
    • 二、源碼準備
    • 三、準備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目錄為環境變量
gtest使用入門(6)-win下使用vscode和cmake建構
  • 2、cmake程式,并配置cmake.exe所在的目錄為環境變量
gtest使用入門(6)-win下使用vscode和cmake建構
  • 3、LLVM,并配置其bin目錄為環境變量
gtest使用入門(6)-win下使用vscode和cmake建構
  • 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目錄,用于存放建構的産物,這樣就不會在源碼中輸出亂七八糟的東西讓目錄變得很亂。

最後目錄結構如下:

gtest使用入門(6)-win下使用vscode和cmake建構

VSCODE下右鍵build檔案夾,在內建終端中打開

gtest使用入門(6)-win下使用vscode和cmake建構

輸入如下指令進行建構并編譯,確定我們準備的待測源碼可以正常編譯和執行:

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>
           
gtest使用入門(6)-win下使用vscode和cmake建構

三、準備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最終的目錄結構如下:

gtest使用入門(6)-win下使用vscode和cmake建構

這樣測試代碼就準備好了,下面我們開始建構和編譯測試代碼。

四、建構并編譯源碼和測試代碼

在此我們将把測試代碼作為源碼的子工程添加到源碼中,測試代碼的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>
           
gtest使用入門(6)-win下使用vscode和cmake建構

六、總結

到此,在windows下使用gtest和cmake進行建構和編譯執行測試的工程完成了,跟linxu下的差不多,如果使用VS建構,需要CMAKE建構生成MSCV工程,然後使用VS打開進行編譯,本篇使用VSCODE,可以參考。

七、源碼擷取

本例程的源碼可到此下載下傳:https://github.com/TonsenWei/gtest_win

繼續閱讀