Компиляция googletest для gcov

Я хочу получить информацию о покрытии из моих тестов 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)

9

Решение

Вы должны добавить —coverage как при компиляции, так и при компоновке, как вы уже правильно делаете. Это генерирует байт-код, который будет выводить информацию о покрытии при посещении. Чтобы сгенерировать все файлы, которые будет проверять gcov, вам просто нужно запустить программу (или тестовую программу, сгенерированную googletest). После его запуска один раз (и только один раз, потому что если вы запустите его несколько раз, это добавит к наблюдаемым данным), вы увидите сгенерированные файлы и теперь можете вызывать gcov.

Из вашего (правильного) make-файла кажется, что вы просто пропускаете шаг «запуск тестовой программы».

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]