GoogleTest 是由 Google 开发的一个用于编写 C++ 单元测试的框架。单元测试中单元的含义,单元就是人为规定的最小的被测功能模块,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。在实际项目中,单元测试往往由开发人员完成。GoogleTest 是一个开源项目,广泛应用于 C++ 代码的单元测试。
去 GitHub下载,或者gti clone到本地,链接地址:googletest。
googletest 中有两个目录 googletest 和 googlemock,都是 Google 开发的两个C++测试框架,分别用于进行单元测试和模拟对象。
进入 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 目录下会有生成的共享库文件。
在任意地方创建一个 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/ 下的共享库文件和头文件复制过来。
在 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知识可以去官网上查看,官网上也有详细的教程和实例。