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
如下图所示:

googletest进行单元测试(使用cmake编译)的更多相关文章
- linux 下cmake 编译 ,调用,调试 poco 1.6.0 小记
上篇文章 小记了: 关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记. http://www.cnblogs.com/bleachli/p/4352 ...
- [C] tcharall(让所有平台支持TCHAR)v1.1。源码托管到github、添加CMake编译配置文件、使用doxygen规范注释
作者:zyl910 v1.1版的改动如下—— 将源码上传到github. 调整目录结构. 添加CMake编译配置文件. 使用doxygen规范注释. 文件清单—— docs\ docs\images\ ...
- [C] c99int(让VC等编译器自动兼容C99的整数类型)V1.02。源码托管到github、添加CMake编译配置文件、使用doxygen规范注释
新版本—— http://www.cnblogs.com/zyl910/p/zlstdint_v100.html[C] zlstdint(让VC.TC等编译器自动兼容C99的整数类型)V1.0.支持T ...
- Mysql的cmake编译与安装
Mysql的cmake编译与安装 实验准备环境: 我的操作系统是centos6.6 编译安装MariaDB之前,我们需要准备一些需要的环境 1.开发包组套件 [root@node19 ~]# yum ...
- CentOS下使用cmake编译安装mysql
一.下载安装所必需的依赖包 1.因为高版本mysql都用cmake安装,所以下载cmake wget http://www.cmake.org/files/v3.0/cmake-3.0.1.tar.g ...
- CentOS_5.6下使用cmake编译MySQL_5.5.11
MySQL 最新的版本5.5.11需要cmake编译安装,估计以后的版本也会采用这种方式,网上找了一些安装方法有些地方是错的,自己整理一份 所以特地记录一下安装步骤及过程,以供参考!1 mysql 5 ...
- CentOS_5.6下使用cmake编译MySQL_5.5.11教程
注:资料来自网络 Centos 5.6编译安装mysql 5.5.11 2011年06月24日 星期五 05:33 MySQL 最新的版本5.5.11需要cmake编译安装,估计以后的版本也会采 ...
- cmake编译安装mysql 5.6.12
cmake安装mysql 5.6.12 从mysql 5.5 开始就要用cmake编译安装 下载mysql 下载地址:http://pan.baidu.com/s/1o68xxqE 一.安装mysql ...
- Win10 下Cmake编译配置 Opencv3.1 + Cuda7.5 + VS2013
折腾了三天终于配置成功了,在此写下编译配置的全部步骤和遇到的很多坑. 整体介绍: OpenCV 中 CUDA 实现的函数还不是太多,使用前要在OpenCV的官网上确认以下你想要的功能是否已经实现,否则 ...
- Android开发学习之路--Android Studio cmake编译ffmpeg
最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...
随机推荐
- 微信公众号抢现金红包活动的核心代码分析(asp.net C#)
今年春节微信抢红包,我想各位都还记得.最近很多商家也在使用公众号给粉丝发红包,做营销活动.吸粉活动或者是反馈老用户等. 我们作为第3方开发者,就义不容辞的来给这些商家服务了.首先我们得会使用程序来写抢 ...
- 【架构】MVC模式
架构模式 如何设计一个程序的结构,这是一门专门的学问,叫做"架构模式"(architectural pattern),属于编程的方法论. MVC模式就是架构模式的一种,它不仅适用于 ...
- 项目日志的管理和应用 log4js-Node.js中的日志管理模块使用与封装
开发过程中,日志记录是必不可少的事情,尤其是生产系统中经常无法调试,因此日志就成了重要的调试信息来源. Node.js,已经有现成的开源日志模块,就是log4js,源码地址:点击打开链接 项目引用方法 ...
- Python解码base64遇到Incorrect padding错误
Python解码base64遇到Incorrect padding错误 base64转码过程 先说一下转换过程,详细的可以参考阮一峰.廖雪峰博客: 所谓Base64,就是说选出64个字符----小写字 ...
- 【JDK】各个版本垃圾收集器
G1收集器(Garbage First)是Java虚拟机中垃圾收集器的一种. G1收集器是Java虚拟机的垃圾收集器理论进一步发展的产物,它与前面的CMS收集器相比有两个显著的改进:一是G1收集器是基 ...
- Linux命令之stty
用途说明 stty命令用于显示和修改终端行设置(change and print terminal line settings). 常用参数 stty命令不带参数可以打印终端行设置,加上-a参数可以打 ...
- maven invalid loc header
项目部署之后出现如题错误 清除maven资源库原有的jar,重新下载即可解决
- 从 shell 眼中看世界
(字符) 展开每一次你输入一个命令,然后按下 enter 键,在 bash 执行你的命令之前, bash 会对输入的字符完成几个步骤处理.我们已经知道两三个案例,怎样一个简单的字符序列,例如 “*”, ...
- Android 开发自己的网络收音机4——读取XML文件的电台数据
国内外的电台数据很多,起码有好几百,所以把这些数据都写到代码里面是不实际的.只能写成一个数据文件,程序启动的时候再去加载.保存这些简单数据,我们肯定会优先使用XML文件,今天讲讲如何读取XML里面的数 ...
- [转载]WPF控件拖动
这篇博文总结下WPF中的拖动,文章内容主要包括: 1.拖动窗口 2.拖动控件 Using Visual Studio 2.1thumb控件 2.2Drag.Drop(不连续,没有中间动画) 2.3拖动 ...