一篇教会你玩转Linux下gtest单元测试

一、下载gtest 

下载链接为 https://github.com/google/googletest 

目前最新的版本是v1.8.x,本文以这个为例子

 

二、认识文件夹

将源码解压,进入gtest目录,可看到文件结构如下图所示:

一篇教会你玩转Linux下gtest单元测试_第1张图片

GTEST提供了对于多个不同平台的支持,例如msvc文件夹是用在微软Visual Studio中,xcode文件夹是用于Mac Xcode,codegrear文件夹是用于Borland C++ Builder,在Linux环境中,我们用的内容就是make文件夹了

三、清除不需要的文件

前一步我们讲到,很多文件是为了支持不同平台的,为了保持程序的简洁,我们需要删除不必要的文件,以防止混淆视听。删除之后,只剩下了4个文件夹,清爽多了。

一篇教会你玩转Linux下gtest单元测试_第2张图片

打开sample文件夹,可看到一堆用于示范gtest用法的demo。

四、改写makefile文件

进入make文件夹,执行命令“make && ./sample1_unittest”,可看到执行结果:

root@smp-desktop:/mnt/share/Projects/googletest/make# make && ./sample1_unittest
g++ -isystem ../include -I.. -g -Wall -Wextra -pthread -std=c++11 -c \
            ../src/gtest-all.cc
ar rv libgtest.a gtest-all.o
ar: creating libgtest.a
a - gtest-all.o
g++ -isystem ../include -I.. -g -Wall -Wextra -pthread -std=c++11 -c \
            ../src/gtest_main.cc
ar rv libgtest_main.a gtest-all.o gtest_main.o
ar: creating libgtest_main.a
a - gtest-all.o
a - gtest_main.o
g++ -isystem ../include -g -Wall -Wextra -pthread -std=c++11 -c ../samples/sample1.cc
g++ -isystem ../include -g -Wall -Wextra -pthread -std=c++11 -c ../samples/sample1_unittest.cc
g++ -isystem ../include -g -Wall -Wextra -pthread -std=c++11 -L. -lgtest_main -lpthread sample1.o sample1_unittest.o libgtest.a libgtest_main.a -o sample1_unittest
Running main() from ../src/gtest_main.cc
[==========] Running 6 tests from 2 test suites.
[----------] Global test environment set-up.
[----------] 3 tests from FactorialTest
[ RUN      ] FactorialTest.Negative
[       OK ] FactorialTest.Negative (0 ms)
[ RUN      ] FactorialTest.Zero
[       OK ] FactorialTest.Zero (0 ms)
[ RUN      ] FactorialTest.Positive
[       OK ] FactorialTest.Positive (0 ms)
[----------] 3 tests from FactorialTest (0 ms total)

[----------] 3 tests from IsPrimeTest
[ RUN      ] IsPrimeTest.Negative
[       OK ] IsPrimeTest.Negative (0 ms)
[ RUN      ] IsPrimeTest.Trivial
[       OK ] IsPrimeTest.Trivial (0 ms)
[ RUN      ] IsPrimeTest.Positive
[       OK ] IsPrimeTest.Positive (0 ms)
[----------] 3 tests from IsPrimeTest (0 ms total)

[----------] Global test environment tear-down
[==========] 6 tests from 2 test suites ran. (0 ms total)
[  PASSED  ] 6 tests.

查看Makefile文件,可发现该文件只适用于编译第一个sample文件夹下的第一个sample,于是我们需要根据需要重写Makefile,为方便编写测试用例和执行编译的过程,我们把make文件夹删掉,在sample目录下创建Makefile文件,并重新编写Makefile。

埋彩蛋:以下Makefile文件中,包含了-fprofile-arcs 和-ftest-coverage这两个参数,是用于后一篇文章中的覆盖率统计。

GTEST_DIR = ..
USER_DIR = .
CPPFLAGS += -isystem $(GTEST_DIR)/include -std=c++11 
CXXFLAGS += -g -Wall -Wextra -pthread -fprofile-arcs -ftest-coverage
TESTS = run_test
GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \
				$(GTEST_DIR)/include/gtest/internal/*.h

FILES = $(foreach d, $(USER_DIR), $(wildcard $(d)/*.cpp))
OBJS = $(patsubst %.cpp, %.o, $(FILES))

all : $(TESTS)

clean :
	rm -f $(TESTS) gtest_main.a *.o

.PHONY : clean

GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS)
gtest-all.o : $(GTEST_SRCS_)
	$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CPPFLAGS) -c \
	       $(GTEST_DIR)/src/gtest-all.cc

gtest_main.o : $(GTEST_SRCS_)
	$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
			$(GTEST_DIR)/src/gtest_main.cc

gtest_main.a : gtest-all.o gtest_main.o
	 $(AR) $(ARFLAGS) $@ $^

%.o : %.cpp
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@

$(TESTS) : $(OBJS) gtest_main.a
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@

如上所示,我们可编译的源文件为.cpp结尾的,如果依然以sample测试为例子,则需要把sample1.cc的文件名改为sample1.cpp,把sample1_unittest.cc的文件名改为sample1_unittest.cpp,就大功告成了。

执行命令:make && ./run_test就能看到结果了。

五、编写自己的测试案例

将需要测试的.cpp、.h放入文件夹sample,编写测试文件的测试用例,建议以  被测源码_unitest.cpp为名字,如下图,需测试类pinyinfromutf8。

一篇教会你玩转Linux下gtest单元测试_第3张图片

测试用例中,得包含头文件“gtest.h”才能调用单元测试需要的接口。

 

六、参考文档

https://www.cnblogs.com/Jessica-jie/p/6705067.html   Linux下Google Test (GTest)测试环境搭建步骤

 

 

 

你可能感兴趣的:(C++)