Googletest


下载地址

https://github.com/google/googletest


整合到CMake项目中:

  • 将googletext放入当前项目,目录改名为"gtest"
  • 在项目根目录的CMakeLists.txt中加入:
# GTest
set(gtest_dir ./gtest)
include_directories(${gtest_dir}/include)
add_subdirectory(${gtest_dir})
  • 列表进入gtext目录,在CMakelists.txt的头部添加(将生成的库放置在项目根目录的lib目录中):
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
  • 列表在链接时添加gtest库
target_link_libraries(demp  gtest)

函数介绍

  • 断言:分为ASSERT 和 EXPECT,ASSERT在失败后会退出程序,而EXPECT会继续向下执行,如果作为单元测试的话我选择使用ASSERT,这样发现问题后可以先把这个问题处理掉。

bool断言

ASSERT EXPECT 验证
ASSERT_TRUE(x): EXPECT_TRUE(x); x是否为true
ASSERT_FALSE(x): EXPECT_FALSE(x); x是否为fase

数值断言

ASSERT EXPECT 验证
ASSERT_EQ(v1, v2); EXPECT_EQ(v1, v2); v1 == v2
ASSERT_NE(v1, v2); EXPECT_NE(v1, v2); v1 != v2
ASSERT_LT(v1, v2); EXPECT_LT(v1, v2); v1 < v2
ASSERT_LE(v1, v2); EXPECT_LE(v1, v2); v1 <= v2
ASSERT_GT(v1, v2); EXPECT_GT(v1, v2); v1 > v2
ASSERT_GE(v1, v2); EXPECT_GE(v1, v2); v1 >= v2

字符串比较

ASSERT EXPECT 验证
ASSERT_STREQ(s1, s2); EXPECT_STREQ(s1, s2); 两个字符串相等
ASSERT_STRNE(s1, s2); EXPECT_STRNE(s1, s2); 两个字符串不等
ASSERT_STRCASEEQ(s1, s2); EXPECT_STRCASEEQ(s1, s2); 两个字符串相等(忽略大小写)
ASSERT_STRCASENE(s1, s2); EXPECT_STRCASENE(s1, s2); 两个字符串不等(忽略大小写)

用例

可以将单元测试都写入头文件中,然后全部导入到同一个cpp中。

TestLogger.h

#include "../gtest/include/gtest/gtest.h"
#include "../logger.h"

// 循环10次获取Logger实例
// 通过条件:第一次获取实例会初始化静态变量,
//         循环10次获取的实例与初始化时的变量地址相同
TEST(Logger, TestGetInstance) {
    Logger &log = Logger::Instance();
    for (int i = 0; i< 10; i++){
        ASSERT_EQ((void*)&log, (void*)&Logger::Instance());
    }
}

// 测试日志初始化
// 通过条件:第一个执行Init()无异常
//         第二次执行Init()会调用assert()所以会触发死亡测试
TEST(Logger, TestInit) {
    ASSERT_NO_THROW(Logger::Instance().Init());
    ASSERT_DEATH(Logger::Instance().Init(), "");
}

// 测试获取日志实例,通过条件:获取的日志实例不等于nullptr
TEST(Logger, TestGetLogger) {
    ASSERT_NE(&Logger::Instance().GetLogger(), nullptr);
}

// 测试日志输出,通过条件:没有任何异常
TEST(Logger, TestOutput) {
    ASSERT_NO_THROW(GKE2DLogDebug("1"));
}

Test.cpp

#include "../gtest/include/gtest/gtest.h"
#include "./TestLogger.h"

int main(int argc, char *argv[]){
    // 进行单元测试
    ::testing::FLAGS_gtest_death_test_style="threadsafe";
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

测试通过
QQ20190901-112602@2x.png