googletest/gtest入门简易教程(配置、windows、cmake、visual studio、qt)

1、引言

本人在编写c++代码时,随着代码结构的复杂,对代码的稳定性要求越来越高,因此单元测试是必要的。googletest是一个开源的测试框架,可以利用它很方便的开展测试。在学习使用的过程中,我将会把一些经验分享出来,由于刚刚接触,不合理的地方在所难免,欢迎指正。
本篇博文重在介绍如何引入、配置googletest,从而完成最简单的测试,将详细介绍相关步骤,完成入门,googletest的具体使用,如语法、技巧等,将在后续的学习中陆续总结。

2、准备

本教程在windows上完成,虽然理论上也适用于Linux,但请依据不同情况进行适当调整。
现代c++一般采用cmake进行项目管理,在最新的qt、visual studio 2022中均提供了对cmake的支持。本教程基于cmake进行,同时在 qt 、visual studio 2022中进行了测试,并贴出了教程的源码。

gitee仓库

3、本文结构

首先介绍本教程的代码结构、各个部分的作用,随后依据不同的IDE,介绍如何运行教程的代码。

不同的IDE:

  • Qt:我采用的新版本,需要其支持cmake.
  • visual studio:我使用的是visual studio 2022,并通过cmake管理项目,而不是sln.
  • vscode: 需要自行下载cmake并配置开发环境等,较为麻烦,本文没有给出示例.
  • linux等平台:请自行测试调整.

4、正文

代码的总体机构如下所示

gtest_test
│  .gitattributes
│  .gitignore
│  CMakeLists.txt
│  LICENSE.txt
│  README.md
│                         
├─mytest
│      CMakeLists.txt
│      test_add.cpp
│      test_multiply.cpp                                   
├─src
│  ├─add
│  │      add.cpp
│  │      add.h
│  │      CMakeLists.txt
│  │      
│  ├─app
│  │      app.cpp
│  │      CMakeLists.txt
│  │      
│  └─multiply
│          CMakeLists.txt
│          multiply.cpp
│          multiply.h
│          
└─thirdparty
    └─googletest

首先根目录有一个主CMakeLists.txt,对下面三个模块mytest、src、thirdparty进行管理。

  1. src : 即模拟实际工作中源代码所在的文件夹,本教程中,该文件夹包括一个add库、一个multiply库,和一个引用了这两个库的可执行文件app.
  2. thirdparty : 即模拟包含了第三方库与代码的文件夹,后续的googletest库将放到这里面。
  3. mytest : 及测试所在文件夹,对add库、multiply库的接口进行测试。

以下为从零构建的步骤,直接下载代码仓库中的代码更加方便

4.0 准备

准备好根目录,并在根目录中创建mytest、src、thirdparty三个文件夹
根目录创建CMakeLists,并在其中输入基本内容

#根目录CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(GtestTest VERSION 0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

4.1 引入googletest

通过git clone从GitHub中克隆googletest源代码.

git clone https://github.com/google/googletest.git

将clone的文件夹放到thirdparty文件中.
在根目录CMakeLists.txt将googletest作为子模块引入

#根目录CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(GtestTest VERSION 0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

#使能测试
enable_testing()
#该选项对于msvc编译器很重要
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
#引入googletest子模块
add_subdirectory(thirdparty/googletest)
#引入googletest子模块的头文件,方便其他模块include
include_directories(thirdparty/googletest/googletest/include)

4.2 编写实际代码(即后续用于测试的代码)

本教程中,有加法、乘法两个静态库,和一个链接两个库的可执行文件。均用于简单演示。

src文件中添加如下:

4.2.1 加法库

//add.h
#pragma once
int add(int x,int y);
//add.cpp
#include "add.h"
int add(int x,int y)
{
    return x + y;
}
//add文件夹中CMakeLists.txt
aux_source_directory(. ADD_SRC)
message("ADD_SRC: ${ADD_SRC}")
add_library(add STATIC ${ADD_SRC})
target_include_directories(add INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

4.2.2 乘法库

//multiply.h
#pragma once
int multiply(int x,int y);
//multiply.cpp
#include "multiply.h"
int multiply(int x,int y)
{
    return x*y;
}
//multiply文件夹中CMakeLists.txt
aux_source_directory(. MULTIPLY_SRC)
message("MULTIPLY_SRC: ${MULTIPLY_SRC}")
add_library(multiply STATIC ${MULTIPLY_SRC})
target_include_directories(multiply INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

4.2.3 可执行文件

//app.cpp
#include <iostream>
#include "add.h"
#include "multiply.h"

int main(int argc, char** argv)
{
    std::cout << "Begin" << std::endl;
    std::cout << "33 + 22 = " << add(33,22) << std::endl;
    std::cout << "33 * 22 = " << multiply(33,22) << std::endl;
    std::cout << "End" << std::endl;
}
//app文件夹中CMakeLists.txt
aux_source_directory(. APP_SRC)
message("APP_SRC: ${APP_SRC}")
add_executable(app ${APP_SRC})
target_link_libraries(app add multiply)

4.2.4 将各部分作为子模块引入到项目中

在根目录CMakeLists.txt添加内容

#根目录CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(GtestTest VERSION 0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

#引入各子模块
add_subdirectory(src/app)
add_subdirectory(src/add)
add_subdirectory(src/multiply)

#使能测试
enable_testing()
#该选项对于msvc编译器很重要
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
#引入googletest子模块
add_subdirectory(thirdparty/googletest)
#引入googletest子模块的头文件,方便其他模块include
include_directories(thirdparty/googletest/googletest/include)

此时,已经可以编译运行,可执行文件的输出如下:
运行结果

4.3 编写测试代码

mytest文件夹中添加如下

!!!官方文档中建议,测试的name不要有下划线_,因此该示例有瑕疵,将在以后更正

4.3.1 加法库测试

//test_add.cpp
#include "gtest/gtest.h"
#include "add.h"

TEST(TestAdd, test_add_1) {
	int result = add(22, 33);
	EXPECT_EQ(result, 55);
}

TEST(TestAdd, test_add_2) {
	int result = add(22, 11);
	EXPECT_EQ(result, 33);
}

4.3.2 乘法库测试

//test_multiply.cpp
#include "gtest/gtest.h"
#include "multiply.h"

TEST(TestMultiply, test_multiply_1) {
	int result = multiply(22, 33);
	EXPECT_EQ(result, 726);
}
TEST(TestMultiply, test_multiply_2) {
	int result = multiply(10, 33);
	EXPECT_EQ(result, 320);//330!=320,该例应测试失败
}

4.3.3 mytest文件夹中添加CMakeLists.txt

//mytest文件夹中CMakeLists.txt
add_executable(test_add test_add.cpp)
add_executable(test_multiply test_multiply.cpp)

target_link_libraries(test_add add gtest gtest_main)
target_link_libraries(test_multiply multiply gtest gtest_main)

add_test(NAME test_add COMMAND test_add)
add_test(NAME test_multiply COMMAND test_multiply)

4.3.4 根目录CMakeLists.txt引入测试

#根目录CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(GtestTest VERSION 0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

#引入各子模块
add_subdirectory(src/app)
add_subdirectory(src/add)
add_subdirectory(src/multiply)

#引入测试
add_subdirectory(mytest)

#使能测试
enable_testing()
#该选项对于msvc编译器很重要
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
#引入googletest子模块
add_subdirectory(thirdparty/googletest)
#引入googletest子模块的头文件,方便其他模块include
include_directories(thirdparty/googletest/googletest/include)

4.4 运行测试

4.4.1 vs 2022

打开vs2022->继续但无需代码->文件->打开->通过Cmake打开->点击根目录CMakeLists.txt

打开vs

打开项目

打开后,全部生成,并找到生成文件目录

生成目录

运行powershell,并输入

ctest -V

vs2022自带的cmake可能不在环境变量中,需要自行添加,或者找到ctest所在位置直接运行:

C:\Qt\Tools\CMake_64\bin\ctest.exe -V

测试如下,与预期一致,有一个未通过

测试输出

4.2.2 Qt

文件->打开文件或项目->点击根目录的CmakeList.txt打开项目->build

同样找到找到生成文件目录,运行powershell,并输入

ctest -V

Qt自带的cmake可能不在环境变量中,需要自行添加,或者找到ctest所在位置直接运行:

C:\Qt\Tools\CMake_64\bin\ctest.exe -V

5 总结

后续将介绍googletest的具体用法

  • 21
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值