#c #gcov
Вопрос:
Я хотел бы получить покрытие для каждого теста для каждого тестового случая в моей программе на c .
Что я понимаю, так это то, что GoogleTest позволяет выполнять некоторые действия до и после каждого теста
#pragma once
#include <gtest/gtest.h>
#include <gcov.h>
class CodeCoverageListener : public ::testing::TestEventListener
{
public:
virtual void OnTestProgramStart(const ::testing::UnitTestamp;) {}
virtual void OnTestIterationStart(const ::testing::UnitTestamp;, int) {}
virtual void OnEnvironmentsSetUpStart(const ::testing::UnitTestamp;) {}
virtual void OnEnvironmentsSetUpEnd(const ::testing::UnitTestamp;) {}
virtual void OnTestCaseStart(const ::testing::TestCaseamp;) {}
virtual void OnTestPartResult(const ::testing::TestPartResultamp;) {}
virtual void OnTestCaseEnd(const ::testing::TestCaseamp;) {}
virtual void OnEnvironmentsTearDownStart(const ::testing::UnitTestamp;) {}
virtual void OnEnvironmentsTearDownEnd(const ::testing::UnitTestamp;) {}
virtual void OnTestIterationEnd(const ::testing::UnitTestamp;, int) {}
virtual void OnTestProgramEnd(const ::testing::UnitTestamp;) {}
virtual void OnTestStart(const ::testing::TestInfoamp; test_info)
{
__gcov_reset();
}
virtual void OnTestEnd(const ::testing::TestInfoamp; test_info)
{
__gcov_dump();
}
};
А потом вы расскажете об этом GoogleTest
::testing::UnitTest::GetInstance()->listeners()
.Append(new CodeCoverageListener);
Но во время компиляции с gcc4.8.5 я получаю ошибку:
fatal error: gcov.h: No such file or directory
#include <gcov.h>
Как сообщить gcc, где искать это в том числе?
Во время компиляции с gcc8.4.1 я получаю ошибку компоновщика:
g -lgcov gcov.cpp
/tmp/ccK7o95R.o: In function `main':
gcov.cpp:(.text 0x5): undefined reference to `__gcov_reset()'
collect2: error: ld returned 1 exit status
Как связать gcov с программой на c ?
Ответ №1:
gcov.h
Заголовок является внутренним для GCC, поэтому он не установлен ни в одном пути включения. Если вы хотите самостоятельно вызывать функции gcov (что я не рекомендую), вам придется объявить их самостоятельно.
extern void __gcov_reset (void);
extern void __gcov_dump (void);
Связь с libgcov
должна работать, с оговоркой, что это статическая библиотека.
Комментарии:
1. почему вы не рекомендуете это делать? Я нашел это в онлайн-руководстве gcc.gnu.org/onlinedocs/gcc/…
2. @dobrowol Эти функции документированы и стабильны, но не будут напрямую выполнять то, что вы от них ожидаете. Важно отметить, что вы должны переименовать/переместить полученные файлы gcda, так как функция дампа перезапишет существующие файлы данных. Инструментируя отдельные тесты, вы также упустите данные о покрытии из статической инициализации и уничтожения, что может быть весьма актуально в программах на C .