gtest在win下环境搭建与gtest基本测试结构
环境搭建
gtest环境搭建共需要三步:
- MinGW
需要安装x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0版本,需注意安装posix后缀的,因为编译googletest时使用到posix标准。
下载完成后进行解压,将解压后文件夹中bin目录添加到环境变量中。
安装完成后可以在shell中使用 gcc -v来验证是否安装成功,安装成功log末尾显示内容如下:
gcc version 8.1.0 (x86_64-posix-sjlj-rev0, Built by MinGW-W64 project)
- CMake
直接在官网下载安装包;安装时勾选添加到环境变量;安装完成后shell中输入cmake --version验证安装是否成功,安装成功显示内容如下;
cmake version 3.27.0
CMake suite maintained and supported by Kitware (kitware.com/cmake).
- IDE
建议使用VSCode进行后续开发。
gtest基本测试结构
首先创建如下目录结构用来存放代码:
win_googletest_template
├─src
│ └─calculate
│ └─include
└─unittest
├─googletest
└─testcase
└─calculate_test
其中,src文件夹用来存放源代码,即被测代码。如calculate目录即为被测子程序。
unittest文件夹用来存放测试代码;googletest用来存放gtest源代码与编译文件;testcase用来存放实际测试代码。
创建被测代码
创建一个简单的被测文件add.c放在calcualte目录下:
//add.c
#include <stdio.h>
#include <../include/add.h>
int add(int a, int b)
{
return a + b;
}
其头文件放在include目录下:
#ifndef __ADD_H
#define __ADD_H
int add(int a, int b);
#endif
在src目录下创建main.c文件,用来调用被测函数add()
#include <stdio.h>
#include <add.h>
int main()
{
int a = 3;
int b = 4;
printf("a + b = %d\n\r", add(a, b));
return 0;
}
使用CMake来构建这个项目,在win_googletest_template目录下创建CMakeLists.txt文件;
cmake_minimum_required(VERSION 3.0)
project(GTEST_WIN)
# 头文件目录
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src/calculate/include")
# 源文件目录
# AUX_SOURCE_DIRECTORY 找到目录下的所有源文件,存在变量 DIR_SRCS 中,变量的引用 ${DIR_SRCS}
AUX_SOURCE_DIRECTORY("${CMAKE_CURRENT_SOURCE_DIR}/src/calculate" DIR_SRCS)
add_executable(calculate ./src/main.c ${DIR_SRCS})
对被测代码进行编译。在win_googletest_template目录下创建build目录用于存放生成文件。
win下,cmake优先使用msvc编译器。
若指定MinGW为编译器,则需添加参数-G “Makefiles”;make命令也需改为mingw32-make.
将shell目录移动到build目录下,输入"cmake -G “MinGW Makefiles” …"
PS E:\gtest_demo\win_googletest_template\build> cmake -G "MinGW Makefiles" ..
CMake Deprecation Warning at CMakeLists.txt:1 (cmake_minimum_required):
Compatibility with CMake < 3.5 will be removed from a future version of
CMake.
Update the VERSION argument <min> value or use a ...<max> suffix to tell
CMake that the project does not need compatibility with older versions.
-- The C compiler identification is GNU 8.1.0
-- The CXX compiler identification is GNU 8.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: D:/MinGW/x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0/mingw64/bin/gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/MinGW/x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0/mingw64/bin/c++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (3.7s)
-- Generating done (0.0s)
-- Build files have been written to: E:/gtest_demo/win_googletest_template/build
输入"mingw32-make "
PS E:\gtest_demo\win_googletest_template\build> mingw32-make
[ 33%] Building C object CMakeFiles/calculate.dir/src/main.c.obj
[ 66%] Building C object CMakeFiles/calculate.dir/src/calculate/add.c.obj
[100%] Linking C executable calculate.exe
[100%] Built target calculate
编译完成后调用生成的exe文件;
PS E:\gtest_demo\win_googletest_template\build> .\calculate.exe
a + b = 7
显示以上内容,表示编译工具链与被测源代码都正常;以上所使用的都是使用cmake管理c项目,下面介绍使用gtest进行测试。
使用gtest对被测代码进行测试
- 编译gtest库文件
首先在github上下载googletest,将文件解压后放在unittest目录下。
官网下载的gtest目录下已经放有CMakeLists.txt,对gtest进行编译;在googletest目录下创建build文件夹进行编译;编译过程同被测代码:
PS E:\gtest_demo\win_googletest_template\unittest\googletest\build> cmake -G "MinGW Makefiles" ..
-- The C compiler identification is GNU 8.1.0
-- The CXX compiler identification is GNU 8.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: D:/MinGW/x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0/mingw64/bin/gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/MinGW/x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0/mingw64/bin/c++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Python3: C:/Users/2023/AppData/Local/Programs/Python/Python311/python.exe (found version "3.11.7") found components: Interpreter
-- Configuring done (2.7s)
-- Generating done (0.1s)
-- Build files have been written to: E:/gtest_demo/win_googletest_template/unittest/googletest/build
PS E:\gtest_demo\win_googletest_template\unittest\googletest\build> mingw32-make
[ 12%] Building CXX object googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.obj
[ 25%] Linking CXX static library ..\lib\libgtest.a
[ 25%] Built target gtest
[ 37%] Building CXX object googlemock/CMakeFiles/gmock.dir/src/gmock-all.cc.obj
[ 50%] Linking CXX static library ..\lib\libgmock.a
[ 50%] Built target gmock
[ 62%] Building CXX object googlemock/CMakeFiles/gmock_main.dir/src/gmock_main.cc.obj
[ 75%] Linking CXX static library ..\lib\libgmock_main.a
[ 75%] Built target gmock_main
[ 87%] Building CXX object googletest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.obj
[100%] Linking CXX static library ..\lib\libgtest_main.a
[100%] Built target gtest_main
此时build目录下会新增lib文件夹,内有gtest四个库文件;
PS E:\gtest_demo\win_googletest_template\unittest\googletest\build\lib> ls
目录: E:\gtest_demo\win_googletest_template\unittest\googletest\build\lib
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2024-05-21 21:31 1196394 libgmock.a
-a---- 2024-05-21 21:31 3816 libgmock_main.a
-a---- 2024-05-21 21:31 4060948 libgtest.a
-a---- 2024-05-21 21:31 3990 libgtest_main.a
将lib文件夹复制到googletest文件夹下(与build同一层级),留给后续编译使用。
- 编写测试代码
在calculate_test目录下创建calculate_test.cpp测试文件:
#include "gtest/gtest.h"
#include "gmock/gmock.h"
extern "C" {
#include "add.h"
}
TEST(ARRAY_TEST, calculate_test)
{
int a = 3;
int b = 4;
EXPECT_EQ(7, add(a, b));
}
TEST(ARRAY_TEST, calculate_test_2)
{
int a = 8;
int b = 4;
EXPECT_EQ(11, add(a, b));
}
int main(int argc, char *argv[])
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
在calculate_test文件新建CMakeLists.txt,用于构建项目:
cmake_minimum_required(VERSION 3.0) # cmake -G "MinGW Makefiles" ..
project(ARRAY_TEST)
# gtest库相关
# 如果把gtest放到test目录下,则使用如下包含关系:
include_directories(../../googletest) # 编译gtest
include_directories(../../googletest/googletest/include) # 包含gtest等头文件
include_directories(../../googletest/googlemock/include) # 包含gmock等头文件
# include_directories(../../googletest/lib)
# 头文件目录
include_directories("../../../src/calculate/include")
# 源文件目录
AUX_SOURCE_DIRECTORY("../../../src/calculate" SRCS)
# 源代码文件
set(SRC_FILES
${CMAKE_CURRENT_SOURCE_DIR}/../../../src/calculate/add.c
)
# 测试代码目录
AUX_SOURCE_DIRECTORY("${CMAKE_CURRENT_SOURCE_DIR}" TEST_SRCS)
# 生成测试可执行程序
add_executable(calculate_test ${SRC_FILES} ${TEST_SRCS})
find_library(gtest libgtest.a ../../googletest/lib)
find_library(gtest_main libgtest_main.a ../../googletest/lib)
find_library(gmock libgmock.a ../../googletest/lib)
find_library(gmock_main libgmock_main.a ../../googletest/lib)
# 链接测试库,pthread 库一定要写在 ${GTEST_BOTH_LIBRARIES} 的后面, 否则编译时会报错,
# GTEST_BOTH_LIBRARIES表示链接google test的两个库
target_link_libraries( calculate_test
PRIVATE
${gtest}
${gtest_main} # 使用gtest带的main函数,如果检测到外部有main函数,则使用外部main函数,外部main函数要配置gtest初始化。
${gmock}
${gmock_main} # 使用gmock带的main函数,如果检测到外部有main函数,则使用外部main函数,与gtest_main同时存在则自动配置。
pthread
)
编译测试过程如下;
PS E:\gtest_demo\win_googletest_template\unittest\testcase\calculate_test\build> cmake -G "MinGW Makefiles" ..
CMake Deprecation Warning at CMakeLists.txt:1 (cmake_minimum_required):
Compatibility with CMake < 3.5 will be removed from a future version of
CMake.
Update the VERSION argument <min> value or use a ...<max> suffix to tell
CMake that the project does not need compatibility with older versions.
-- The C compiler identification is GNU 8.1.0
-- The CXX compiler identification is GNU 8.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: D:/MinGW/x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0/mingw64/bin/gcc.exe - skipped
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/MinGW/x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0/mingw64/bin/c++.exe - skipped
-- Detecting CXX compile features - done
-- Configuring done (1.8s)
-- Generating done (0.0s)
-- Build files have been written to: E:/gtest_demo/win_googletest_template/unittest/testcase/calculate_test/build
PS E:\gtest_demo\win_googletest_template\unittest\testcase\calculate_test\build> mingw32-make
[ 33%] Building C object CMakeFiles/calculate_test.dir/E_/gtest_demo/win_googletest_template/src/calculate/add.c.obj
[ 66%] Building CXX object CMakeFiles/calculate_test.dir/calculate_test.cpp.obj
[100%] Linking CXX executable calculate_test.exe
[100%] Built target calculate_test
PS E:\gtest_demo\win_googletest_template\unittest\testcase\calculate_test\build> .\calculate_test.exe
[==========] Running 2 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 2 tests from ARRAY_TEST
[ RUN ] ARRAY_TEST.calculate_test
[ OK ] ARRAY_TEST.calculate_test (0 ms)
[ RUN ] ARRAY_TEST.calculate_test_2
E:\gtest_demo\win_googletest_template\unittest\testcase\calculate_test\calculate_test.cpp:20: Failure
Expected equality of these values:
11
add(a, b)
Which is: 7
[ FAILED ] ARRAY_TEST.calculate_test_2 (7 ms)
[----------] 2 tests from ARRAY_TEST (16 ms total)
[----------] Global test environment tear-down
[==========] 2 tests from 1 test suite ran. (30 ms total)
[ PASSED ] 1 test.
[ FAILED ] 1 test, listed below:
[ FAILED ] ARRAY_TEST.calculate_test_2
1 FAILED TEST
参考链接:
Windows 下搭建 googletest 测试框架(C/C++) - 紫曜花 - 博客园 (cnblogs.com)
文章使用软件包与示例代码: