一个简单好用的C++语言单元测试框架-GoogleTest

GoogleTest 简介:

GoogleTest 是由 Google 开发的一个用于编写 C++ 单元测试的框架。单元测试中单元的含义,单元就是人为规定的最小的被测功能模块,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。在实际项目中,单元测试往往由开发人员完成。GoogleTest 是一个开源项目,广泛应用于 C++ 代码的单元测试。

GoogleTest 简单应用:

1、下载 googletest 框架

去 GitHub下载,或者gti clone到本地,链接地址:googletest

googletest 中有两个目录 googletest 和 googlemock,都是 Google 开发的两个C++测试框架,分别用于进行单元测试和模拟对象。

2、使用 googletest 框架

进入 googletest 目录,将 googletest /CMakeLists.txt 中option(BUILD_GMOCK "Builds the googlemock subproject" ON) 改为OFF,ON 是编译 googlemock。

然后将 googletest /googletest /CMakeLists.txt 中 option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF) 改为 ON,OFF 为编译成静态库。

在外层 googletest 目录下创建 build 目录

进入 build 目录输入 cmake .. && make

在 build/lib 目录下会有生成的共享库文件。

3、配置运行环境

在任意地方创建一个 TestCase 目录。

项目结构如下:

bash 复制代码
|-- CMakeLists.txt
|-- main.cpp
|-- test
|   `-- StringUtilTest.cpp
`-- utils
    |-- StringUtil.cpp
    |-- StringUtil.h
    |-- TestUtil.cpp
    `-- TestUtil.h

CMakeLists.txt

复制代码
#basic setting  
PROJECT(TestCpp)  
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)  
#SET(CMAKE_BUILD_TYPE Debug)  
 
#header files  
SET(HEADER_FILES_PATH  
./utils  
./test  
./include
)  
INCLUDE_DIRECTORIES(${HEADER_FILES_PATH})  
 
#src files  
AUX_SOURCE_DIRECTORY(. SRC_LIST)  
AUX_SOURCE_DIRECTORY(./utils SRC_LIST_1)  
LIST(APPEND SRC_LIST ${SRC_LIST_1})  
AUX_SOURCE_DIRECTORY(./test SRC_LIST_2)  
LIST(APPEND SRC_LIST ${SRC_LIST_2})  

set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
 
#build setting  
LINK_DIRECTORIES(/home/huangjiaxin/workspace/googletest/testcase/lib/gtest)  
ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_LIST})  
TARGET_LINK_LIBRARIES(${PROJECT_NAME} libgtest.so) 

main.cpp

C++ 复制代码
#include "TestUtil.h"  
 
int main(int argc, char** argv)  
{  
   TestUtil::runTests(argc, argv);  
   return 0;  
}

StringUtilTest.cpp

C++ 复制代码
#include "StringUtil.h"  
#include "gtest/gtest.h"
#include <string>  
 
using namespace std;  
 
TEST(StringUtilTest, getTestString)  
{  
    StringUtil* str = new StringUtil();  
    EXPECT_EQ("Hello,world!", str->getTestString());  
    delete str;  
}  

StringUtil.cpp

C++ 复制代码
#include "StringUtil.h"  
 
using namespace std;  
StringUtil::StringUtil()  
{  
}  
 
std::string StringUtil::getTestString()  
{  
    return string("Hello,world!");  
}  

StringUtil.h

C++ 复制代码
#ifndef STRINGUTIL_H  
#define STRINGUTIL_H  
#include <string>  
 
class StringUtil  
{  
public:  
    StringUtil();  
 
    std::string getTestString();  
};  
 
#endif // STRINGUTIL_H

TestUtil.cpp

C++ 复制代码
#include "TestUtil.h"  
# include <gtest/gtest.h>  
 
int TestUtil::runTests(int argc, char **argv)  
{  
    testing::InitGoogleTest(&argc, argv);  
    return RUN_ALL_TESTS();  
}  

TestUtil.h

C++ 复制代码
#ifndef TESTUTIL_H  
#define TESTUTIL_H  
#include <string>  
 
class TestUtil  
{  
public:  
    static int runTests(int argc, char **argv);  
 
private:  
    TestUtil(){}  
};  
 
#endif // TESTUTIL_H

构建好以上目录结构后,配置编译好的头文件和动态库文件,将 googletest/googletest/build/lib 目录下的共享库文件全部复制到 /usr/lib/gtest 目录下。sudo cp googletest/googletest/build/lib/* /usr/lib/gtest

将 googletest/googletest/include/ 目录下的头文件复制到 /usr/include/gtest 目录下。sudo cp googletest/googletest/include/gtest /usr/include/gtest -R

上述方法需要管理员权限,而将共享库和头文件复制到 TestCase 目录下就不需要管理员权限,不过需要在 CMakeLists.txt 中指明路径。在 TestCase 目录下创建 lib/gtest 和 include/gtest 目录,和上面一样将 googletest/googletest/ 下的共享库文件和头文件复制过来。

4、运行测试程序

在 TestCase 下创建 build 目录,进入 build 目录,输入cmake .. && make,就会在 TestCase/bin 下生成可执行文件 TestCpp。

运行可执行文件 ./TestCpp ,会有以下输出信息。

C++ 复制代码
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from StringUtilTest
[ RUN      ] StringUtilTest.getTestString
[       OK ] StringUtilTest.getTestString (0 ms)
[----------] 1 test from StringUtilTest (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[  PASSED  ] 1 test.

总结:

googletest特点是跨平台参数化测试丰富的输出支持测试断言等。其中还有许多测试断言和高级用法需要多了解多使用。

好了以上就是googletest单元测试框架的简易使用方法,有什么疑问和建议欢迎在评论区中提出,想要了解更多的googletest知识可以去官网上查看,官网上也有详细的教程和实例。

相关推荐
虾球xz16 分钟前
CppCon 2018 学习:THE MOST VALUABLE VALUES
开发语言·c++·学习
奇文怪式2 小时前
VSCode+arm-none-eabi-gcc交叉编译+CMake构建+OpenOCD(基于Raspberry Pico RP2040)
arm开发·ide·vscode·rp2040
Imagine Miracle2 小时前
Ubuntu for ARM 更换为阿里云镜像源
arm开发·ubuntu·阿里云
wwwlyj1233212 小时前
arm 精准总线错误与非精准总线错误
arm开发
2401_881244402 小时前
牛客周赛99
c++
山登绝顶我为峰 3(^v^)35 小时前
如何录制带备注的演示文稿(LaTex Beamer + Pympress)
c++·线性代数·算法·计算机·密码学·音视频·latex
十五年专注C++开发8 小时前
CMake基础:条件判断详解
c++·跨平台·cmake·自动化编译
QuantumStack10 小时前
【C++ 真题】P1104 生日
开发语言·c++·算法
天若有情67310 小时前
01_软件卓越之道:功能性与需求满足
c++·软件工程·软件
whoarethenext10 小时前
使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
开发语言·c++·opencv·mfcc