как получить покрытие за тест для Google тестов c с помощью gcov (или другого бесплатного инструмента)

#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 .