网上有各种gtest的入门教学,这里就不一一重复了。本文的目的是讲解如何将gtest应用于工程应用中。利用测试驱动开发这样的理论,来先写测试代码,当自动化测试跑通以后,主工程的代码也就编写完了。

这里假设你已经在linux上成功编译gtest,并且将静态文件放置于某地。

头文件置于:~/build-env/build-system/3rd-soft/include/googletest1.8.0/include

静态库置于:~/build-env/build-system/3rd-soft/lib

首先我们做一个测试工程gtest-demo,其中生成src目录,用于演示一个字符串转数字,数字转字符串的简单代码

代码如下:main.cpp

#include "string_util.h"
#include <iostream>
int main(int argc, char* argv[])
{
string str = StringUtil::int_to_str();
cout<<"str="<<str<<endl;
int num = StringUtil::str_to_int("");
cout<<"num="<<num<<endl;
return ;
}

然后编写一个简单的Makefile文件

.PHONY: default force
SYSNAME=$(shell uname -s)
ifeq ($(SYSNAME),Darwin)
ECHO=echo
else
ECHO=echo -e
endif
CXX = g++
CFLAGS = -pg -Wall -std=c++0x
PROGRAM_NAME=AS
PROGRAM_NAME_CN=gtest测试模块
# TODO: 这里加入所有默认需要编译的目标
TARGETS=main
default: $(TARGETS)
# 全局的编译和链接选项都放在这儿
# 编译过程
%.o : %.cpp
$(CXX) -c $(CFLAGS) $< -o $@
# 下面是每个目标的生成过程
force:
# 程序的生成过程 {{{
SOURCES = $(wildcard *.cpp )
OBJECTS = $(patsubst %.cpp,%.o,$(SOURCES))
$(TARGETS): $(OBJECTS)
$(CXX) $(OBJECTS) -o $(TARGETS)
# }}}
install:
clean:
rm -f *.o
rm -f $(TARGETS)

运行make后生成可执行程序,

这样一个简单的c++的主工程框架便完成了。

根据测试驱动开发的理论,最好在写主工程代码时有一个自动测试框架的用例可以先跑一下。一旦这个测试用例跑完后没有报错,则主工程的代码也就编写完了,并且确保编写的代码是正确的。

以当前主工程代码来看,需要先验证

StringUtil::int_to_str(34)==”34”

StringUtil::str_to_int("100")==100

我们可以先实现接口,然后运行gtest单元测试

接口程序如下: string_util.h

#ifndef _COMMON_STRING_UTILITY_H_
#define _COMMON_STRING_UTILITY_H_
#include <string>
using namespace std;
class StringUtil
{
public:
StringUtil(void);
~StringUtil(void);
static string int_to_str(int num);
static int str_to_int(const string& str);
};
#endif

string_util.cpp

#include "string_util.h"
#include <iostream>
#include <sstream>
StringUtil::StringUtil(void)
{
}
StringUtil::~StringUtil(void)
{
}
string StringUtil::int_to_str(int num)
{
return "";
}
int StringUtil::str_to_int(const string& str)
{
return ;
}

然后写测试程序代码:test_string_util.cpp

#include <string>
#include "gtest/gtest.h"
#include "../src/string_util.h"
using namespace std;
class test_string_util : public ::testing::Test
{
};
TEST_F(test_string_util, int_to_str)
{
string str = StringUtil::int_to_str();
EXPECT_STREQ("", str.c_str());
}
TEST_F(test_string_util, str_to_int)
{
int num = StringUtil::str_to_int("");
EXPECT_EQ(num, );
}

编译后一运行:截图如下:

测试的提示信息很清晰,因此我们去修改int_to_str和str_to_int两个接口

如下代码所示:

string StringUtil::int_to_str(int num)
{
std::stringstream stream;
stream << num;
return stream.str();
}
int StringUtil::str_to_int(const string& str)
{
int num = atol(str.c_str());
return num;
}

然后再跑测试用例,截图如下:

至此,测试通过。回到主工程编译运行,发现已得到我们要的打印结果:

具体代码已上传到github上:https://github.com/luhouxiang/gtest-demo

gtest日志在工程项目中的应用的更多相关文章

  1. 解决tomcat下面部署多个项目log4j的日志输出会集中输出到一个项目中的问题

    在一次项目上线后,发现了一个奇怪的问题,经过对源码的阅读调试终于解决,具体经过是这样的: 问题描述:tomcat7下面部署多个项目,log4j的日志输出会集中输出到一个项目中,就算配置了日志文件的绝对 ...

  2. Log4Net的应用教程之保存日志到数据库中

    关于Log4Net的应用,网上有很多教程,但大多数都是拷贝复制,有些按照他的代码来,运行起来发现也出不来效果,但是Log4net的作用实在是非常大的,或者这里说的不对,应该说系统的日志功能是很重要的也 ...

  3. filebeat收集日志到elsticsearch中并使用ingest node的pipeline处理

    filebeat收集日志到elsticsearch中 一.需求 二.实现 1.filebeat.yml 配置文件的编写 2.创建自定义的索引模板 3.加密连接到es用户的密码 1.创建keystore ...

  4. kettle作业(job)调用转换,设置变量,写日志到数据库中【转】

    首先建立转换:从数据库表到日志 表输入的设置:   日志设置:   新建job:     转换选择刚才建好的输出日志转换.变量设置如下: 此ID就是转换中的${ID},执行job,可以看到控制台输出日 ...

  5. log4j输出日志到数据库中

    1.log4j配置 ###----------------- appender:DATABASE_LOG -----------------#指定输出日志的等级和日志输出范围log4j.logger. ...

  6. 修改testng源码,添加beforeMethod和afterMethod中的日志到test中(可以不改源码,废弃)

    在使用testng生成报告的时候,只会记录test方法中的日志,但是一般会在beforeMethod.beforeTest.afterMethod.afterTest中做一下数据的处理,这里面的日志没 ...

  7. Tomcat日志、项目中的log4j日志、e.printStackTrace()——我的日志最后到底跑哪去了?

    1.Tomcat自带日志功能,即时你的项目中有log4j也不会影响到Tomcat自己记录日志. 2.你的项目中的log4j中的日志指定打印到什么地方(控制台或者文件),便会打印到什么地方,和Tomat ...

  8. Tomcat日志、项目中的log4j日志、控制台——我的日志最后到底跑哪去了?

    1.Tomcat自带日志功能,即时你的项目中有log4j也不会影响到Tomcat自己记录日志. 2.你的项目中的log4j中的日志指定打印到什么地方(控制台或者文件),便会打印到什么地方,和Tomat ...

  9. Java日志框架-Spring中使用Logback(Spring/Spring MVC)

    继上一篇文章http://www.cnblogs.com/EasonJim/p/7800880.html中所集成的是基于Java的普通项目,如果要在Spring和Spring MVC上集成,需要做如下 ...

随机推荐

  1. (原创)c++11改进我们的模式之改进单例模式

    我会写关于c++11的一个系列的文章,会讲到如何使用c++11改进我们的程序,本次讲如何改进我们的模式,会讲到如何改进单例模式.观察者模式.访问者模式.工厂模式.命令模式等模式.通过c++11的改进, ...

  2. 苹果电脑快速安装双系统 Winclone镜像包 Winclone安装Win7/Win8.1/Win10镜像

    原文:https://bbs.feng.com/read-htm-tid-9940193.html by:旋律 2015年及以后的安装win8.1及win10(不支持win7) 请根据自己的机型安装合 ...

  3. 遍历目录下的所有文件-os.walk

    #coding:utf-8 import os for root,dirs,files in os.walk("D:"): for fileItem in files: print ...

  4. iOS 设置导航栏全透明

    - (void)viewWillAppear:(BOOL)animated{ //设置导航栏背景图片为一个空的image,这样就透明了 [self.navigationController.navig ...

  5. C#中的volatile关键字

    volatile 关键字指示一个字段可以由多个同时执行的线程修改. 声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制. 这样可以确保该字段在任何时间呈现的都是最新的值. vo ...

  6. Knockout开发中文API系列4–监控属性数组

    PS:这个翻译系列好久都没有更新了,实在是不应该,一方面是由于时间不多,另一方面也由于自身惰性太大,从今天起接着更新,会在最近的一月内把这个系列中文API文档翻译完整. 如果你想侦测并响应一个对象的变 ...

  7. exec和sp_executesql

    sqlserver中的exec和sp_executesql都能执行动态的sql语句和存储过程,但exec用法较为简单,不能带参数,也没有返回参数. sp_executesql则显得功能更加完善,可以用 ...

  8. springboot项目访问不到controller方法。

    访问不到方法首先要从你的controller能否被扫描到出发, 图中显示创建springboot项目自带的这两个的文件要注意把他俩拿出来放到父包下面也就是图中这个位置.如果你的这两个文件在子包里或者说 ...

  9. VS2017安装PCL1.8.1

    很多使用在windows环境下编译和使用PCL,这样让我想试试,所以就迫不得已的放弃使用Ubuntu环境,但是我还是建议使用Ubuntu系统,毕竟在Ubuntu下几条命令就搞定了,为了迎合在windo ...

  10. m2e-wtp error: <path>/target/m2e-wtp/web-resources/META-INF/MANIFEST.MF (No such file or directory)

    错误信息: D:\workspace\eclipse\xinfubao\xfb-mgr\target\m2e-wtp\web-resources\META-INF\MANIFEST.MF (系统找不到 ...