gtest日志在工程项目中的应用
网上有各种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日志在工程项目中的应用的更多相关文章
- 解决tomcat下面部署多个项目log4j的日志输出会集中输出到一个项目中的问题
在一次项目上线后,发现了一个奇怪的问题,经过对源码的阅读调试终于解决,具体经过是这样的: 问题描述:tomcat7下面部署多个项目,log4j的日志输出会集中输出到一个项目中,就算配置了日志文件的绝对 ...
- Log4Net的应用教程之保存日志到数据库中
关于Log4Net的应用,网上有很多教程,但大多数都是拷贝复制,有些按照他的代码来,运行起来发现也出不来效果,但是Log4net的作用实在是非常大的,或者这里说的不对,应该说系统的日志功能是很重要的也 ...
- filebeat收集日志到elsticsearch中并使用ingest node的pipeline处理
filebeat收集日志到elsticsearch中 一.需求 二.实现 1.filebeat.yml 配置文件的编写 2.创建自定义的索引模板 3.加密连接到es用户的密码 1.创建keystore ...
- kettle作业(job)调用转换,设置变量,写日志到数据库中【转】
首先建立转换:从数据库表到日志 表输入的设置: 日志设置: 新建job: 转换选择刚才建好的输出日志转换.变量设置如下: 此ID就是转换中的${ID},执行job,可以看到控制台输出日 ...
- log4j输出日志到数据库中
1.log4j配置 ###----------------- appender:DATABASE_LOG -----------------#指定输出日志的等级和日志输出范围log4j.logger. ...
- 修改testng源码,添加beforeMethod和afterMethod中的日志到test中(可以不改源码,废弃)
在使用testng生成报告的时候,只会记录test方法中的日志,但是一般会在beforeMethod.beforeTest.afterMethod.afterTest中做一下数据的处理,这里面的日志没 ...
- Tomcat日志、项目中的log4j日志、e.printStackTrace()——我的日志最后到底跑哪去了?
1.Tomcat自带日志功能,即时你的项目中有log4j也不会影响到Tomcat自己记录日志. 2.你的项目中的log4j中的日志指定打印到什么地方(控制台或者文件),便会打印到什么地方,和Tomat ...
- Tomcat日志、项目中的log4j日志、控制台——我的日志最后到底跑哪去了?
1.Tomcat自带日志功能,即时你的项目中有log4j也不会影响到Tomcat自己记录日志. 2.你的项目中的log4j中的日志指定打印到什么地方(控制台或者文件),便会打印到什么地方,和Tomat ...
- Java日志框架-Spring中使用Logback(Spring/Spring MVC)
继上一篇文章http://www.cnblogs.com/EasonJim/p/7800880.html中所集成的是基于Java的普通项目,如果要在Spring和Spring MVC上集成,需要做如下 ...
随机推荐
- jQuery中 index() 方法的使用
假设一个集合中有10个元素,源生js在添加事件的时候,会使用for循环,里面的i的值,就是当前点击元素是集合中的第i个元素.在jquery中,获得i的值的方法如下: <ul id="a ...
- (原创)C++11改进我们的程序之简化我们的程序(七)
这次要讲的内容是:c++11中的tuple(元组).tuple看似简单,其实它是简约而不简单,可以说它是c++11中一个既简单又复杂的东东,关于它简单的一面是它很容易使用,复杂的一面是它内部隐藏了太多 ...
- C++11 构造函数的改动
一.继承构造函数 继承构造函数的引入原因:如果基类的构造函数很多,那么子类的构造函数想要实现同样多的构造接口,必须一一调用基类的构造函数,有点麻烦. 于是乎:C++11引入继承构造函数,子类可以通过使 ...
- (转)go语言nsq源码解读二 nsqlookupd、nsqd与nsqadmin
转自:http://www.baiyuxiong.com/?p=886 ---------------------------------------------------------------- ...
- diocp3-服务器的连接上限是到底是多少?diocp3的一个装13测试(8W连接数)
服务器的连接上限是到底是多少?diocp3开源项目的一个装13测试(8W连接数) 测试DEMO路径 diocp3\samples\ECHO 之前群里说一台服务器最多是High(Word)的连接数655 ...
- OpenCV探索之路(十七):Mat和IplImage访问像素的方法总结
在opencv的编程中,遍历访问图像元素是经常遇到的操作,掌握其方法非常重要,无论是Mat类的像素访问,还是IplImage结构体的访问的方法,都必须扎实掌握,毕竟,图像处理本质上就是对像素的各种操作 ...
- SQLite 入门教程一 基本控制台(终端)命令
一.基本简介 SQLite 是一个自持的(self-contained).无服务器的.零配置的.事务型的关系型数据库引擎.因为他很小,所以也可以作为嵌入式数据库内建在你的应用程序中.SQLite 被应 ...
- linux ad7606 iio
https://wiki.analog.com/resources/tools-software/linux-drivers/iio-adc/ad7606
- Vagrant (3) —— 复制/备份Vagrant Box
Vagrant (3) -- 复制/备份Vagrant Box 摘要 介绍复制/备份Vagrant Box基本方法 版本 Vagrant版本: 1.8.1 内容 复制vagrant box并压缩 关闭 ...
- Knockout开发中文API系列3–使用计算属性
计算属性 如果你已经有了一个监控属性 firstName和lastName,如果你想显示全名该怎么做呢?这个时候你就可以通过计算属性来实现,这个方法依赖于一个或多个监控属性,如果任何依赖对象发生改变他 ...