1、引言

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

目录

1、引言2、准备3、本文结构4、正文4.0 准备4.1 引入googletest4.2 编写实际代码(即后续用于测试的代码)4.2.1 加法库4.2.2 乘法库4.2.3 可执行文件4.2.4 将各部分作为子模块引入到项目中

4.3 编写测试代码4.3.1 加法库测试4.3.2 乘法库测试4.3.3 mytest文件夹中添加CMakeLists.txt4.3.4 根目录CMakeLists.txt引入测试

4.4 运行测试4.4.1 vs 20224.2.2 Qt

5 总结

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进行管理。

src : 即模拟实际工作中源代码所在的文件夹,本教程中,该文件夹包括一个add库、一个multiply库,和一个引用了这两个库的可执行文件app.thirdparty : 即模拟包含了第三方库与代码的文件夹,后续的googletest库将放到这里面。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

#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

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

运行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的具体用法

相关文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。