单元测试作为程序的质量保证之一在现在程序开发中非常常见,C++中知名的单元测试工具非gtest莫属。而作为C++常见的开发工具,CMake似乎正在慢慢成为主流的构建工具,相比于Makefile,CMake有更好的跨平台性。下文将使用CMake管理项目同时集成Gtest作为C++单元测试的例子。
在实际的测试中我们希望:
测试代码和主代码分割开来,单独执行
测试代码分隔开来。(你可以使用多个测试代码测试一个函数的功能,但是不应该在一个测试代码中测试多个模块的功能)
项目代码和住调代码分隔,以动态库形式调用
项目结构:
.├──CMakeLists.txt├──include│└──add.h├──main.cpp├──src│├──add.cpp│└──CMakeLists.txt└──test├──CMakeLists.txt├──main.cc└──test_add.cc
顶层CMakeLists.txt文件的内容如下:
cmake_minimum_required(VERSION3.14)project(gtest)#项目的入口函数add_executable(${CMAKE_PROJECT_NAME}main.cpp)#因为头文件和源文件分别放置,使用头文件的时候需要包含头文件的目录include_directories(include)#需要使用src下的函数实现编译动态库,添加src源文件方便其通过CMakeLists规则编译add_subdirectory(src)#添加测试代码所在的路径(所有add_subdiretoires均需要CMakeLists.txt文件)add_subdirectory(test)#开启单元测试enable_testing()#主调函数通过动态库使用函数target_link_libraries(${CMAKE_PROJECT_NAME}add)
include/add.h头文件实现内容如下:
#ifndefADD_HPP_#defineADD_HPP_intadd(inta,intb);#endif
主函数:main.cpp功能简单,用来计算两个数的和:
#include"add.h"#includeiostreamusingnamespacestd;intmain(){inta=3;intb=4;coutadd(a,b)endl;}
src/add.cpp中的函数实现:
#include"add.h"intadd(inta,intb){returna+b;}
src/CMakeLists.txt文件内容:
#编译动态库需要头文件,这里包含头文件include_directories(${CMAKE_SOURCE_PATH}/include)add_library(addSHAREDadd.cpp)
test/test_add.cc中实现功能测试:
#include"add.h"#includegtest/gtest.hTEST(testAdd,test_1){EXPECT_EQ(add(2,3),5);}
test/main.cc主函数内容:
#include"add.h"#includegtest/gtest.hintmain(intargc,char**argv){testing::InitGoogleTest(argc,argv);returnRUN_ALL_TESTS();}
test/CMakeLists.txt中
enable_testing()#查找gtest库find_package(GTestREQUIRED)#因为测试add功能,需要包含其头文件include_directories(${CMAKE_SOURCE_DIR}/include)#方便使用,设置变量TestName(Test)set(TestNameTest)#创建可执行文件add_executable(${TestName}test_add.cc)#链接需要的动态库target_link_libraries(${TestName}GTest:testGTest:test_mainpthreadadd)#开启单元测试add_test(NAME${TestName}COMMAND${TestName})
编译:
mkdirbuildcdbuildcmake..make-j8
make编译过程如下:
-生成动态库
-生成主函数
-扫描测试文件,生成测试二进制代码Test
[14%]BuildingCXXobjectsrc/CMakeFiles/add.dir/add.cpp.o[28%]LinkingCXXsharedlibrarylibadd.so[28%]BuilttargetaddScanningdependenciesoftargetgtest[42%]BuildingCXXobjectCMakeFiles/gtest.dir/main.cpp.o[57%]LinkingCXXexecutablegtest[57%]BuilttargetgtestScanningdependenciesoftargetTest[71%]BuildingCXXobjecttest/CMakeFiles/Test.dir/test_add.cc.o[85%]BuildingCXXobjecttest/CMakeFiles/Test.dir/test_add1.cc.o[%]LinkingCXXexecutableTest[%]BuilttargetTest
验证测试:
maketest
输出:
Runningtests...Testproject/tmp/test/buildStart1est1/1Test#1est.............................Passed0.00sec%testspassed,0testsfailedoutof1TotalTesttime(real)=0.00sec
如果你想加入更多的测试,比如:
#include"add.h"#includegtest/gtest.hTEST(testAssert,test_1){EXPECT_NE(add(1,3),5);EXPECT_NE(add(3,3),5);}
你需要在CMakeLists.txt中添加新加的测试代码:
add_executable(${TestName}test_add.cctest_add1.cc)预览时标签不可点收录于话题#个上一篇下一篇