如何使用 gcov 获得 google 测试 c++ 的每个测试覆盖率
how to get per test coverage for google tests c++ with gcov
我想获取我的 C++ 程序中每个测试用例的每个测试覆盖率。
我得到的是 GoogleTest 允许在每次测试前后执行一些操作
#pragma once
#include <gtest/gtest.h>
#include <gcov.h>
class CodeCoverageListener : public ::testing::TestEventListener
{
public:
virtual void OnTestProgramStart(const ::testing::UnitTest&) {}
virtual void OnTestIterationStart(const ::testing::UnitTest&, int) {}
virtual void OnEnvironmentsSetUpStart(const ::testing::UnitTest&) {}
virtual void OnEnvironmentsSetUpEnd(const ::testing::UnitTest&) {}
virtual void OnTestCaseStart(const ::testing::TestCase&) {}
virtual void OnTestPartResult(const ::testing::TestPartResult&) {}
virtual void OnTestCaseEnd(const ::testing::TestCase&) {}
virtual void OnEnvironmentsTearDownStart(const ::testing::UnitTest&) {}
virtual void OnEnvironmentsTearDownEnd(const ::testing::UnitTest&) {}
virtual void OnTestIterationEnd(const ::testing::UnitTest&, int) {}
virtual void OnTestProgramEnd(const ::testing::UnitTest&) {}
virtual void OnTestStart(const ::testing::TestInfo& test_info)
{
__gcov_reset();
}
virtual void OnTestEnd(const ::testing::TestInfo& 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 编译期间,出现 linker 错误:
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
如何link将gcov转为c++程序?
gcov.h
header 是 GCC 内部的,所以它没有安装在任何包含路径中。如果您想自己调用 gcov 函数(我不推荐这样做),那么您必须自己声明它们。
extern void __gcov_reset (void);
extern void __gcov_dump (void);
与 libgcov
的链接应该可以工作,但需要注意的是它是一个静态库。
我想获取我的 C++ 程序中每个测试用例的每个测试覆盖率。
我得到的是 GoogleTest 允许在每次测试前后执行一些操作
#pragma once
#include <gtest/gtest.h>
#include <gcov.h>
class CodeCoverageListener : public ::testing::TestEventListener
{
public:
virtual void OnTestProgramStart(const ::testing::UnitTest&) {}
virtual void OnTestIterationStart(const ::testing::UnitTest&, int) {}
virtual void OnEnvironmentsSetUpStart(const ::testing::UnitTest&) {}
virtual void OnEnvironmentsSetUpEnd(const ::testing::UnitTest&) {}
virtual void OnTestCaseStart(const ::testing::TestCase&) {}
virtual void OnTestPartResult(const ::testing::TestPartResult&) {}
virtual void OnTestCaseEnd(const ::testing::TestCase&) {}
virtual void OnEnvironmentsTearDownStart(const ::testing::UnitTest&) {}
virtual void OnEnvironmentsTearDownEnd(const ::testing::UnitTest&) {}
virtual void OnTestIterationEnd(const ::testing::UnitTest&, int) {}
virtual void OnTestProgramEnd(const ::testing::UnitTest&) {}
virtual void OnTestStart(const ::testing::TestInfo& test_info)
{
__gcov_reset();
}
virtual void OnTestEnd(const ::testing::TestInfo& 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 编译期间,出现 linker 错误:
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
如何link将gcov转为c++程序?
gcov.h
header 是 GCC 内部的,所以它没有安装在任何包含路径中。如果您想自己调用 gcov 函数(我不推荐这样做),那么您必须自己声明它们。
extern void __gcov_reset (void);
extern void __gcov_dump (void);
与 libgcov
的链接应该可以工作,但需要注意的是它是一个静态库。