2013-12-26 3 views
8

Я хочу получить информацию о покрытии из моих тестов googletest, но у меня проблемы с поиском хороших инструкций.Компиляция googletest для gcov

Предполагаю, что я должен скомпилировать мой битовый файл gtest таким образом, чтобы он выплескивал файлы .gcno и .gcna. Однако никакая комбинация флагов компилятора, похоже, не может произойти.

Я пробовал использовать --coverage и -fprofile-arcs -ftest-coverage, как на сборнике, так и на компоновке, но безрезультатно.

Я просто ошибаюсь во всем подходе? Будут ли тесты googletest когда-либо компилироваться так?

Для полноты здесь есть вся Makefile:

# -*- 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)/[email protected] 

## 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)/[email protected] 

## Tests 
%_unittest.o: %_unittest.cc $(OBJDIR) 
    g++ $(COVERAGE) -isystem ${GTEST_DIR}/include $(OBDD_INCLUDE) -pthread -DTESTDATA=\"$(CURDIR)/data/\" -c $< -o $(OBJDIR)/[email protected] 

## Housekeeping 
$(LIBDIR): 
    $(MKDIR) $(LIBDIR) 

$(OBJDIR): 
    $(MKDIR) $(OBJDIR) 

$(BINDIR): 
    $(MKDIR) $(BINDIR) 

clean: 
    $(RM) $(LIBDIR) $(OBJDIR) $(BINDIR) 
+0

Добавить CFLAGS = -fprofile-arcs -ftest-coverage. или однажды попробуйте файл с одним источником, например 'g ++ -fprofile-arcs -ftest-coverage unittest.cc -o unittest.o'. После компиляции проверьте наличие .gcno файлов presenet. –

+0

@jsj Вы еще нашли ответы? – user2148571

ответ

1

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

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

+0

В моем случае, .gcno и .gcna были размещены там, где находятся исходные файлы. Это может быть трудно найти. – martin

Смежные вопросы