测试与代码隔离
我使用的是QT、Linux系统。下面主要是关于CMakeLists.txt的修改。
纯小白自己写一个CMakeLists.txt,首先可以参考以前写好,将QT和C++需要的设置复制过来;然后主要的就是三步:
- 添加需要用到的库所在的目录(include_directories(目录绝对路径),一般到include)
- 链接目录(link_directories(目录绝对路径),一般到lib所在目录)
- 链接库(target_link_libraries (库名字))这三个操作
测试与代码隔离
测试代码与功能代码写在同一个cpp,这样对于编写测试代码是很方便的,因为测试需 要调用函数进行测试,但二者分开就得引用被测函数所在头文件才能调用,这样实现起来就有点麻烦。
测试代码与功能代码隔离对于日后的维护和功能代码打包发布就很方便。所以我这里就研究了测试代码与功能代码隔离。
首先需要创建一个专门的测试代码文件夹,然后就是测试代码与功能代码之间的调用问题,实现隔离的方法有两种:
方法一:与项目同一级目录
目录结构如下
.
|——project
| |__ main.cpp
| |__ main.h
| |__ CMakeLists.txt
|——test
| |__ main.cpp
| |__CMakeLists.txt
|__CMakeLists.txt
方法一和方法二实现过程差不多,主要就是完成开头说的三步。方法一的实现过程等实操后再补充。
方法二: 在项目目录之下
目录结构如下
.
|__ project
|__ main.cpp
|__ main.h
|__ CMakeLists.txt
|__ test
|__ main.cpp
|__CMakeLists.txt
在project的CMakeLists.txt通过增加开关,使编译时可以选择是否编译测试代码。增加内容如下
#gtest 增加开关,默认开关状态为OFF关闭
option(RUN_UNITTEST "Run unittest" OFF)
#给project生成库,这样测试模块才能调用project中的函数
add_library(project
main.cpp
${SOURCCE}
${MOCS}
)
target_link_libraries(project
#project生成库记得链接其用到的外部库!!!add_*和target_link_libraries一般是成对出现的
)
#开关打开就会进入里面设置测试模块需要的参数
if(RUN_UNITTEST)
message(STATUS "Run unittest")
#gcov和lcov需要另外安装,这一部分不在CMakeLists.txt中设置则编译时命令设置
#配置gcov和lcov,生成生成代码覆盖率报告所需的测试文件
SET(GCC_COVERAGE_COMPILE_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage")
SET(GCC_COVERAGE_LINK_FLAGS "-lgcov")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")
#GTEST,gtest的库的位置。
set(GTEST_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/test/include/gtest/)
set(GTEST_LINK_DIR ${CMAKE_SOURCE_DIR}/test/lib/gtest/)
set(GTEST_LIBS gtest gtest_main)
add_subdirectory(./test)#在build中会生成test文件夹存放test生成的文件
endif()
测试模块的CMakeLists.txt内容
cmake_minimum_required(VERSION 3.5)
PROJECT(test)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
#### GoogleTest requires at least C++14
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set (QT_USE_QTNETWORK TRUE)
find_package (Qt4 REQUIRED)
include ( ${QT_USE_FILE} )
#测试代码文件
set(utsrc
main.cpp
main.h
)
include_directories(
#QT需要的库目录
${QT_QTCORE_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR}
${QT_QTXML_INCLUDE_DIR}
${QT_QTNETWORK_INCLUDE_DIR}
#gtest的库目录
${GTEST_INCLUDE_DIR}
${CMAKE_SOURCE_DIR} #cmake时所在源目录层,目的是指明功能代码的位置
)
link_directories(
${GTEST_LINK_DIR}
${CMAKE_SOURCE_DIR} #cmake时所在源目录层,目的是指明功能代码生成链接的位置
)
# add_executabl前一定要有include_directories和link_directories
add_executable(utRemote
${utsrc}
)
target_link_libraries (test
${GTEST_LIBS}
project ##工程的动态库名
${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTXML_LIBRARY} -lQtSql -lQtNetwork
-lpthread -lm ##pthread库(Google Test使用了这个库所以需要)
)
CMakeLists.txt写完后,在project目录下进行编译验证
mkdir build
cd build
ccmake .. 或 cmake .. ////使用ccamke 会进入窗口界面,在界面下方会有文字提示编译步骤,一般按两次“C”后按“G”就能完成。当然报错了就得跟着报错去修改和检查CMakeLists.txt
make
编译通过后就可以写测试代码和功能代码。