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); }
编译后一运行:截图如下:
测试的提示信息很清晰,因此我们去修改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