googletest进行单元测试(使用cmake编译)
一、前提:
1、假定你的系统为centos6系列
2、假定你已经安装了基本的编译环境,gcc,g++4.4.7
3、假定你已经设置了环境变量:KDS_MOBILE_STOCK_HOME
4、假定你已经安装了unzip解压缩软件,若未安装,请安装之:yum install zip unzip
5、假定你已经安装了vim,若未安装可用vi代替vim命令
二、安装cmake
1、下载源码:http://www.cmake.org/files/v2.8/cmake-2.8.12.tar.gz
2、解压源码目录:tar –xzvf cmake-2.8.12.tar.gz
3、进入cmake-2.8.12目录:cd cmake-2.8.12
4、编译:
./bootstrap
gmake
gmake install
三、安装googletest
1、下载源码:https://codeload.github.com/google/googletest/zip/release-1.8.0
2、解压源码:unzip googletest-release-1.8.0.zip
3、进入源码目录:cd googletest-release-1.8.0
4、创建并进入目录build:mkdir build && cd build
5、编译:cmake .. && make
6、将静态库拷贝至指定lib目录:
cp googlemock/gtest/libgtest.a $KDS_MOBILE_STOCK_HOME/3rd-soft/lib/
cp googlemock/gtest/libgtest_main.a $KDS_MOBILE_STOCK_HOME/3rd-soft/lib/
7、将头文件拷贝至指定include目录:
cp -ri ../googletest/ $KDS_MOBILE_STOCK_HOME/3rd-soft/include/ mv $KDS_MOBILE_STOCK_HOME/3rd-soft/include/googletest $KDS_MOBILE_STOCK_HOME/3rd-soft/include/googletest1.8.0
四、建立演示工程
建立工程目录:mkdir gtest_demo && cd gtest_demo
写最外层CMakeLists.txt:vim CMakeLists.txt
# 工程名 set (PROJECT_NAME my-gtest) PROJECT(${PROJECT_NAME}) SET(CMAKE_C_COMPILER "g++") #选择编译器,默认是gcc message("工程名: " ${PROJECT_NAME}) message("工程目录: " ${PROJECT_SOURCE_DIR}) message("KDS_MOBILE_STOCK_HOME目录: " $ENV{KDS_MOBILE_STOCK_HOME}) # 最低版本需求 cmake_minimum_required(VERSION 2.8) set (EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}) set (LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) message("编译后可执行程序目录: " ${EXECUTABLE_OUTPUT_PATH}) message("编译后库程序文件目录: " ${LIBRARY_OUTPUT_PATH}) ADD_SUBDIRECTORY(src) # ADD_SUBDIRECTORY(gtest) # 此处先注释,原因是一开始没有测试工程
一)、写源代码工程
1、建立并进入源代码目录:mkdir src && cd src
2、完成源代码文件编写:
测试文件我们写两个功能,一个为计算模块calc,实现Add功能,一个为字符串模块string_util,实现将字符串转为数字功能
1)、写calc模块头文件:vim calc.h
# ifndef __KDS_CAlC_H_ # define __KDS_CALC_H_ class Calc { public: static int Add(int a, int b); }; # endif
2)、写calc模块实现文件:vim calc.cpp
# include "calc.h" int Calc::Add(int a, int b) { return a+b; }
3)、写string工具模块头文件:vim string_util.h
# ifndef __KDS_STRING_UTIL_H_ # define __KDS_STRING_UTIL_H_ class StringUtil { public: static int ToInt(const char* str); }; # endif
4)、写string工具模块实现文件:vim string_util.cpp
# include "stdlib.h" # include "string_util.h" int StringUtil::ToInt(const char * str) { return atol(str); }
5)、写main函数:vim main.cpp
# include <iostream> # include "calc.h" # include "string_util.h" int main() { std::cout<<"3+5="<<Calc::Add(3, 5)<<std::endl; std::cout<<"ToInt(345)="<<StringUtil::ToInt("345")<<std::endl; return 0; }
最后我们需要将这5个文件编译
3、写编译文件:vim CMakeLists.txt
# 打印当前目录 message("源程序工程当前目录: " ${CMAKE_CURRENT_SOURCE_DIR}) # 头文件目录 INCLUDE_DIRECTORIES( $ENV{KDS_MOBILE_STOCK_HOME}/3rd-soft/include /usr/local/include/ /usr/include ) AUX_SOURCE_DIRECTORY(. DIR_SRCS) add_library(src ${DIR_SRCS}) add_executable(src_sult ${DIR_SRCS})
至此,源文件已经写完。
4、验证:
1)、返回上一层目录,建立并进入一个临时的build目录:cd ../ && mkdir build && cd build
2)、编译:cmake .. && make
此时可以看到当前目录下已经编译好了src_sult文件,运行之
3)、运行:./src_sult
截图如下:
二)、写测试工程
1、退出src目录:cd ..
2、建立并进入gtest测试工程目录:mkdir gtest && cd gtest
3、写测试calc代码:vim test_calc.cpp
# include <gtest/gtest.h> # include "src/calc.h" using namespace std; TEST(Test_Calc, Add) { EXPECT_TRUE(Calc::Add(3,5)==8); }
4、写测试string_util代码:vim test_string_util.cpp
# include <gtest/gtest.h> # include "src/string_util.h" using namespace std; TEST(Test_StringUtil, ToInt) { EXPECT_TRUE(StringUtil::ToInt("345")==345); }
5、最后写CMakeLists.txt文件:vim CMakeLists.txt
# 打印当前目录 message("测试工程当前目录: " ${CMAKE_CURRENT_SOURCE_DIR}) # 需包含的头文件 INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR} $ENV{KDS_MOBILE_STOCK_HOME}/3rd-soft/include/googletest1.8.0/include /usr/local/include /usr/include ) # 需包含的库文件 link_directories( ${PROJECT_BINARY_DIR}/lib $ENV{KDS_MOBILE_STOCK_HOME}/3rd-soft/lib /usr/local/lib /usr/lib ) find_package(Threads) AUX_SOURCE_DIRECTORY(. DIR_SRC_TESTS) add_executable(test_sult ${DIR_SRC_TESTS}) TARGET_LINK_LIBRARIES(test_sult uuid gtest gtest_main libsrc.a) TARGET_LINK_LIBRARIES(test_sult ${CMAKE_THREAD_LIBS_INIT})
三、改写最外层CMakeLists.txt文件
1、回到上一层目录:cd ..
记得前面最初的CMakeLists.txt中最后一行ADD_SUBDIRECTORY(gtest)被注释了,把那个#去掉
2、改写后最终的CMakeLists.txt文件:vim CMakeLists.txt
# 工程名 set (PROJECT_NAME my-gtest) PROJECT(${PROJECT_NAME}) SET(CMAKE_C_COMPILER "g++") #选择编译器,默认是gcc message("工程名: " ${PROJECT_NAME}) message("工程目录: " ${PROJECT_SOURCE_DIR}) message("KDS_MOBILE_STOCK_HOME目录: " $ENV{KDS_MOBILE_STOCK_HOME}) # 最低版本需求 cmake_minimum_required(VERSION 2.8) set (EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}) set (LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) message("编译后可执行程序目录: " ${EXECUTABLE_OUTPUT_PATH}) message("编译后库程序文件目录: " ${LIBRARY_OUTPUT_PATH}) ADD_SUBDIRECTORY(src) ADD_SUBDIRECTORY(gtest)
四)运行测试
1、进入build目录:cd build
2、编译:cmake .. && make
此时看到当前目录下已经生成了test_sult测试文件了
3、查看:ls
4、运行之:./test_sult
如下图所示: