[软件测试]-gtest在win下环境搭建与gtest基本测试结构

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)

文章使用软件包与示例代码:

gtest_demo/0.env at main · BqFang/gtest_demo (github.com)

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值