Contents

Google Test 一站式总结

最近开发的两个 C++ 项目都需要做单元测试,我见过的几个开源项目都是用 Google Test 当作单元测试框架的,所以就点亮了这个技能点。这里总结一下如何通过 git submodule 的形式在 CMake 中引入 Google Test,以及常见的测试该怎么写。

说明:本文的旧版本参考网上的一些教程,通过 Git Submodule 引入 GTest。但是在实际使用中发现 git 拉取过慢,因此重新修改为按照官方教程的方式来引入。

通过 CMake FetchContent 引入

配置 CMake 自动从 GitHub 链接下载引入 GTest 模块,这样可以固定版本,也不太需要额外操作。当然,此处的 GitHub 链接也可以替换成国内的镜像(如果有的话)。

include(FetchContent)
FetchContent_Declare(
  googletest
  URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
  DOWNLOAD_EXTRACT_TIMESTAMP TRUE
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)

enable_testing()
include(GoogleTest)

配置 CMake 测试项

此处假定你需要运行测试的可执行项目名为 my_test,包含的文件有 a.h & b.cpp。

add_executable(my_test a.h b.cpp)
target_link_libraries(my_test GTest::gtest_main)

基本的测试写法

#include <gtest>
TEST(SampleSuite, BabyArithmeticTest){
    EXPECT_EQ(1,0); // continue on error
    ASSERT_EQ(1,0); // stop on error
}</gtest>

TEST 宏的第一个位置写 suite name,第二个写 test name,自动会展开成为一个类并定义一个方法,测试的时候执行该方法。EXPECT 和 ASSERT 的区别就在于遇到错误是继续测试还是停止测试。除了 EQ 还有 LT,LE 等等谓词,可以随意使用。唯一需要注意的一点是,正如普通的算术运算一样,浮点运算不可以直接进行简单的相等判断,可以相减看差是否足够小,也可以用专门的浮点比较的宏(EXPECT_DOUBLE_EQ 这样子的)。

如何测试私有方法

私有方法只需要生命测试类是被测试类的友元即可。只需要在被测试的类中利用 FRIEND_TEST 这个宏,把 suite name & test name 写进去即可。参见这个例子。

// In sample.h
class RUA{
private:
    int get2(){return 2;}
    FRIEND_TEST(SampleTest, PrivateTest)
};


// In sample_test.cpp
TEST(SampleTest, PrivateTest){
    EXPECT_EQ(1,RUA().get2());
}

还需要注意的一点就是:如果你的类定义在某个名空间之下,那么测试类也应当定义在相同的名空间下,这样友元的访问才能正常。