• 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

  • 相关阅读:
    java基础第十七篇之网络编程和装饰者模式
    垃圾回收的常见算法
    java基础第十六篇之多线程
    java基础第十五篇之IO流和递归算法
    JVM史上最全实践优化没有之一
    java基础第十三篇之Collection
    java基础第十四篇之Map
    CDN加速静态文件访问
    java基础第十二篇之集合、增强for循环、迭代器和泛型
    Linux--RPM卸载安装
  • 原文地址:https://www.cnblogs.com/luhouxiang/p/7572199.html
Copyright © 2020-2023  润新知