包虫病

注册

 

发新话题 回复该主题

C单元测试 [复制链接]

1#

单元测试作为程序的质量保证之一在现在程序开发中非常常见,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)预览时标签不可点收录于话题#个上一篇下一篇

分享 转发
TOP
发新话题 回复该主题