Я хочу получить информацию о покрытии из моих тестов googletest, но у меня проблемы с поиском хороших инструкций.
Я предполагаю, что я должен скомпилировать мой двоичный файл gtest так, чтобы он выплевывал .gcno
а также .gcna
файлы. Однако никакая комбинация флагов компилятора, кажется, не делает это возможным.
Я пытался использовать --coverage
а также -fprofile-arcs -ftest-coverage
, как при компиляции, так и при компоновке, но безрезультатно.
Я просто ошибаюсь во всем подходе? Будут ли когда-нибудь компилироваться тесты googletest?
Для полноты здесь приведен весь make-файл:
# -*- indent-tabs-mode:t; -*-
## Vars
CXX=g++
BDDOBJ=../obj
OBDD_DIR=../src
OBDD_INCLUDE=-I$(OBDD_DIR)
#FLAGS=-Wfatal-errors -I./gtest-1.7.0/include -L./gtest-1.7.0/lib/.libs -lgtest -lgtest_main -lpthread
GTEST_DIR=./gtest-1.7.0
SRCDIR=./src
OBJDIR=./obj
BINDIR=./bin
LIBDIR=./lib
VPATH=$(SRCDIR) $(OBJDIR) $(LIBDIR) $(BINDIR)
COVERAGE=-O0 -g --coverage
MKDIR=mkdir -p
RM=rm -rf
.PHONY: clean
.INTERMEDIATE: default $(BINDIR) $(OBJDIR) $(LIBDIR)
default: obddtest
#Binary
obddtest: $(BINDIR) libgtest.a Vertex.o Vertex_unittest.o Edge.o Edge_unittest.o Graph.o Graph_unittest.o main.o
g++ $(COVERAGE) -isystem ${GTEST_DIR}/include $(OBDD_INCLUDE) -pthread \
$(OBJDIR)/Vertex.o \
$(OBJDIR)/Vertex_unittest.o \
$(OBJDIR)/Graph_unittest.o \
$(OBJDIR)/Edge.o \
$(OBJDIR)/Edge_unittest.o \
$(OBJDIR)/Graph.o \
$(OBJDIR)/main.o \
$(LIBDIR)/libgtest.a \
-o $(BINDIR)/obddtest
## Main
main.o: main.cc
g++ $(COVERAGE) -isystem ${GTEST_DIR}/include $(OBDD_INCLUDE) -pthread -c $< -o $(OBJDIR)/$@
## gtest library
gtest-all.o: $(OBJDIR)
g++ $(COVERAGE) -isystem ${GTEST_DIR}/include -I${GTEST_DIR} -pthread -c ${GTEST_DIR}/src/gtest-all.cc -o $(OBJDIR)/gtest-all.o
libgtest.a: $(LIBDIR) gtest-all.o
ar -rv $(LIBDIR)/libgtest.a $(OBJDIR)/gtest-all.o
## Source under test
%.o: $(OBDD_DIR)/%.cpp $(OBJDIR)
g++ $(COVERAGE) -fPIC -O0 $(OBDD_INCLUDE) -c $< -o $(OBJDIR)/$@
## Tests
%_unittest.o: %_unittest.cc $(OBJDIR)
g++ $(COVERAGE) -isystem ${GTEST_DIR}/include $(OBDD_INCLUDE) -pthread -DTESTDATA=\"$(CURDIR)/data/\" -c $< -o $(OBJDIR)/$@
## Housekeeping
$(LIBDIR):
$(MKDIR) $(LIBDIR)
$(OBJDIR):
$(MKDIR) $(OBJDIR)
$(BINDIR):
$(MKDIR) $(BINDIR)
clean:
$(RM) $(LIBDIR) $(OBJDIR) $(BINDIR)
Вы должны добавить —coverage как при компиляции, так и при компоновке, как вы уже правильно делаете. Это генерирует байт-код, который будет выводить информацию о покрытии при посещении. Чтобы сгенерировать все файлы, которые будет проверять gcov, вам просто нужно запустить программу (или тестовую программу, сгенерированную googletest). После его запуска один раз (и только один раз, потому что если вы запустите его несколько раз, это добавит к наблюдаемым данным), вы увидите сгенерированные файлы и теперь можете вызывать gcov.
Из вашего (правильного) make-файла кажется, что вы просто пропускаете шаг «запуск тестовой программы».
Других решений пока нет …