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(34);
  cout<<"str="<<str<<endl;
  int num = StringUtil::str_to_int("100");
  cout<<"num="<<num<<endl;
  return 0;
}

然后编写一个简单的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 0;
}

然后写测试程序代码: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(34);
    EXPECT_STREQ("34", str.c_str());
}
TEST_F(test_string_util, str_to_int)
{
  int num = StringUtil::str_to_int("100");
  EXPECT_EQ(num, 100);
}

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

image

测试的提示信息很清晰,因此我们去修改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;
}

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

image

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

image

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

原文地址:https://www.cnblogs.com/luhouxiang/p/7572199.html