Google Test 一站式总结

发布于 2021-08-11  83 次阅读


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

通过 Git submodule 引入

Google Test 本身是一个比较小巧的框架,代码量不大,可以直接引入一个 shallow git submodule 以避免像官方文档的 cmake 配置一样将链接硬编码。

git submodule add --depth 1 https://github.com/google/googletest.git <gtest_path>
git config -f .gitmodules submodule.<path>.shallow true

上述两条命令引入了 Google Test 作为 git submodule,并且设定它是浅的,避免在 clone 的时候把所有历史都拉取到本地。

接下来通过这条命令初始化 submodule。(在第一次 add 的时候可能已经自动地 clone 了,不过如果是从远端 clone 仓库的话还是不会自动初始化 submodule 的,总是手动执行一下没有坏处)

git submodule update --init

配置 CMake

如果你的项目本身是通过 CMake 构建的,那么简单地添加几行就可以运行了。此处假定你需要运行测试的可执行项目名为 my_test,包含的文件有 a.h & b.cpp。

add_subdirectory(<gtest_path>)
include(GoogleTest)
add_executable(my_test a.h b.cpp)
target_link_libraries(my_test gtest_main)

把上边的 <gtest_path> 替换成实际的目录即可。这样配置之后在 IDE 中刷新,就可以得到 GTest 的启动项了(至少 CLion 可以了)。

基本的测试写法

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

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());
}

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


终有一日, 仰望星空