最近开发的两个 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());
}
还需要注意的一点就是:如果你的类定义在某个名空间之下,那么测试类也应当定义在相同的名空间下,这样友元的访问才能正常。
Comments | 1 条评论
RUA!