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上集成,需要做如下 ...
随机推荐
- [Windows Azure] Manage the Availability of Virtual Machines
Manage the Availability of Virtual Machines You can ensure the availability of your application by u ...
- (原)docker安装
2018直接看这里: https://docs.docker.com/cs-engine/1.12/#install-on-ubuntu-1404-lts-or-1604-lts 以下为原文: 网上的 ...
- Android中XML文件的序列化生成与解析
xml文件是非常常用的,在android中json和xml是非常常用的两种封装数据的形式,从服务器中获取数据也经常是这两种形式的,所以学会生成和解析xml和json是非常有用的,json相对来说是比较 ...
- 理解Netty中的零拷贝(Zero-Copy)机制【转】
理解零拷贝 零拷贝是Netty的重要特性之一,而究竟什么是零拷贝呢? WIKI中对其有如下定义: “Zero-copy” describes computer operations in which ...
- 如何在一张ppt中插入多张图片并能依次播放
我们在做ppt的过程中,有时遇到在一张ppt中插入多张图片还想让其能依次播放的情况,针对上述情况我们可以根据下列步骤进行设置.(新手必看) 1.首先,用鼠标点击桌面Microsoft PowerPo ...
- Lintcode:Longest Common Subsequence 解题报告
Longest Common Subsequence 原题链接:http://lintcode.com/zh-cn/problem/longest-common-subsequence/ Given ...
- poj1182(种类并查集好题)
不得不说,我得感谢@驱动幽灵百鬼夜行小肆,正是因为看明白了他给出的解析,我才完全弄懂种类并查集的,这里,我也不想去改其他的,就直接引用他的解题报告吧 转载:http://blog.csdn.net/c ...
- 01-老马jQuery教程-jQuery入口函数及选择器
前言 这套jQuery教程是老马专门为寒门子弟而录制,希望大家看到后能转发给更多的寒门子弟.视频都是免费,请参考课程地址:https://chuanke.baidu.com/s5508922.html ...
- Redis 密码设置
如果不加密码,默认只能本机访问,加密码也是为了安全考虑 1.进入Redis 的安装目录,找到redis.conf文件.用vi命令打开文件 输入 / requirepass 进行查找,输入n查找下一个 ...
- Wince/VC高效PNG贴图,自定义Alpha算法
工作中,做一些炫点的界面都需要用到PNG图片,Wince里面微软也提供了PNG图片的支持,不过Alpha的混合速度比较慢,所以自己实现了一个Alpha的混合运算接口,经过测试,要比微软AlphaBle ...