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

发布时间:2024年01月18日

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 目录。

项目结构如下:

|-- 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

#include "TestUtil.h"  
 
int main(int argc, char** argv)  
{  
   TestUtil::runTests(argc, argv);  
   return 0;  
}

StringUtilTest.cpp

#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

#include "StringUtil.h"  
 
using namespace std;  
StringUtil::StringUtil()  
{  
}  
 
std::string StringUtil::getTestString()  
{  
    return string("Hello,world!");  
}  

StringUtil.h

#ifndef STRINGUTIL_H  
#define STRINGUTIL_H  
#include <string>  
 
class StringUtil  
{  
public:  
    StringUtil();  
 
    std::string getTestString();  
};  
 
#endif // STRINGUTIL_H

TestUtil.cpp

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

TestUtil.h

#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 ,会有以下输出信息。

[==========] 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知识可以去官网上查看,官网上也有详细的教程和实例。

文章来源:https://blog.csdn.net/qq_53221728/article/details/135677069
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。