我试图了解如何使用 CMake、googletest 和 gcov 进行测试覆盖率来正确构建 C++ 项目。我想构建一个适用于任何平台/编译器的通用 CMakeLists.txt。
这是我的第一次尝试。但是,如果我尝试构建项目,然后运行 lcov(以生成报告),我会发现如果使用 CLang(正确结果)或 GCC(错误结果),则会得到不同的结果。请注意,我在 MacO 上,并且通过 brew ( brew install gcc) 安装了 gcc。
此外,我在 main 中使用了以下标志CMakeLists.txt:
if(CODE_COVERAGE)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage" )
endif()
Run Code Online (Sandbox Code Playgroud)
CMakeLists.txt注意:如果您在我的文件或使用中发现错误/奇怪的内容lcov,我愿意接受任何类型的反馈!
#include "library.h"
#include <iostream>
void foo(){
std::cout << "Foo!" << std::endl;
}
void bar(int n){
if (n > 0){
std::cout << "n is grater than 0!" << std::endl;
}
else if (n < 0){
std::cout << "n is less than …Run Code Online (Sandbox Code Playgroud) 我们正在尝试使用geninfo和genhtml(替代gcovr,请参见此处)使用gcov提供的覆盖率生成html页面.
geninfo 从gcov的*.gcda文件创建lcov-tracefilesgenhtml 从上面的tracefiles生成html文件但是,最终结果不仅包括我们的代码,还包括来自/ usr/include的文件.
有谁知道排除这些的方法?
我试着查看手册页但找不到任何内容http://linux.die.net/man/1/geninfo
是否可以从gcov覆盖率分析中排除某些功能或代码行.我的代码包含用于调试的某些函数,并且不作为我的测试套件的一部分进行操作.这些功能降低了gcov报告的覆盖率.我想从结果中排除这些功能.如果通过gcov无法实现,也许可以通过lcov,但我无法弄明白.非常感谢您的帮助.
我的源代码和构建树看起来像这样(参见Makefile将目标文件从源文件不同的目录放入一个单独的目录?)make之后(构建并运行FooAndBarTests):
src
- Foo.cpp
- Bar.cpp
inc
- Foo.h
- Bar.h
test
- FooTest.cpp
- BarTest.cpp
- Main.cpp
- Makefile
- obj
- Foo.gcda
- Foo.gcno
- Bar.gcda
- Bar.gcno
- FooAndBarTests
UnitTest++
- libUnitTest++.a
- src
- ...
Run Code Online (Sandbox Code Playgroud)
然后我可以通过运行gcov -o obj/ ../src/Foo.cpp和生成测试目录中的.gcov文件gcov -o obj/ ../src/Bar.cpp.
但如果我跑,lcov -d obj/ -c -o FooAndBarTests.lcov我得到:
Capturing coverage data from obj/
Found gcov version: 4.2.1
Scanning obj/ for .gcda files ...
Found 4 data files in …Run Code Online (Sandbox Code Playgroud) 我想知道是否有可能告诉lcov忽略源文件中的某些行,即.不要将它们报告为未访问的.我正在寻找一个可以放入代码本身的解决方案,例如:
int some_method(char some_var, char some_other_var)
{
if(some_var == 'A')
{
if(some_other_var == 'B')
{
/* do some real stuff here */
}
else
{
LCOV_DO_NOT_REPORT_NEXT_LINE // **<-- this?? **
NOT_IMPLEMENTED("A*")
}
}
else
{
NOT_IMPLEMENTED("*")
}
Run Code Online (Sandbox Code Playgroud)
和必要的背景:
像上面那样的一大段代码正在一系列单元测试中进行测试,但由于这段代码仍在开发中,因此有很多NOT_IMPLEMENTED("A*")宏只是在屏幕上用行号/文件名放置一条消息并退出应用.没有对未实现的分支进行测试,显然它们将在实现该功能时编写.
然而,lcov报告了这些NOT_IMPLEMENTED线条,它们在覆盖率报告中看起来非常难看(即:它们的红线比例很高).
我要求的是可能的,或者我们应该忍受这个?
我在Ubuntu Trusty上使用C++ 11和g ++ 4.8.
考虑一下这个片段
class Parent {
public:
virtual ~Parent() = default;
virtual void f() = 0;
};
class Child: public Parent {
public:
void f(){}
};
Run Code Online (Sandbox Code Playgroud)
叫做使用
{
Child o;
o.f();
}
{
Parent * o = new Child;
delete o;
}
{
Child * o = new Child;
delete o;
}
Run Code Online (Sandbox Code Playgroud)
我使用gcov生成我的代码覆盖率报告.它报告带有符号的析构函数_ZN6ParentD0Ev永远不会被调用,而它_ZN6ParentD2Ev是.
回答构造函数符号的双重发射和GNU GCC(g ++):为什么它会生成多个dtors?报告_ZN6ParentD0Ev是删除构造函数.
有没有在Parent课堂上调用这个"删除析构函数"的情况?
附属问题:如果没有,有没有办法获得gcov/lcov代码覆盖工具(使用gcov与CMake/CDash一起使用的详细指南的回答?)在其报告中忽略该符号?
我有一个带有一些测试的Angular项目.我的版本是用Gulp编写的.我使用Karma运行测试并生成lcov报告.
然后我使用gulp-sonar插件来运行Sonar.我的声纳配置看起来像这样:
"sonar": {
"host": {
"url": "http://mysonar.example.com.au"
},
"projectKey": "sonar:advertising-test",
"projectName": "advertising-test",
"projectVersion": "1.0.0",
"sources": "app/js",
"javascript": {
"lcov": {
"reportPath": "reports/coverage/lcov.info"
}
},
"exec": {
"maxBuffer": "1048576"
}
}
Run Code Online (Sandbox Code Playgroud)
Sonar运行并分析代码,但在尝试使用以下内容读取lcov报告时失败:
[09:38:58] 09:38:58.322 WARN - Problem during processing LCOV report: can't save DA data for line 0.
java.lang.IllegalArgumentException: Line with number 0 doesn't belong to file app/js/main.js
...
[09:38:58] 09:38:58.324 WARN - Problem during processing LCOV report: can't save DA data for line 65.
java.lang.IllegalArgumentException: Line with number 65 …Run Code Online (Sandbox Code Playgroud) 我有相同的源文件(C和Obj-C)被编译成两个目标:单元测试可执行文件和实际产品(然后进行集成测试).这两个目标构建在不同的位置,因此目标文件.gcno和.gcda文件是分开的.并非所有源文件都编译到单元测试中,因此并非所有对象都存在.所有源文件都编译到产品构建中.
有没有办法将两组.gcda文件组合起来,以获得单元测试和集成测试的总覆盖率(因为它们在产品构建中运行)?
我正在使用lcov.
Mac OS X 10.6,GCC 4.0
谢谢!
我做到了flutter test --coverage
Alcov.info是在下生成的coverage
我想将其转换为 html,但我没有找到适用于 Windows 的工具。
在 Linux 上,你只需执行以下操作:
sudo apt-get update -qq -y
sudo apt-get install lcov -y
Run Code Online (Sandbox Code Playgroud)
然后你就做
genhtml coverage/lcov.info -o coverage/html
我在 Windows 上并且
'genhtml' is not recognized as an internal or external command,
operable program or batch file.
我遇到了lcov的性能问题.
我正在七个不同的配置文件中执行一个程序,收集每个配置文件的覆盖范围,然后将覆盖配置文件与lcov合并:
lcov --rc lcov_branch_coverage=1 -a coverage_1.dat -a coverage_2.dat -a coverage_3.dat -a coverage_4.dat -a coverage_5.dat -a coverage_6.dat -a coverage_7.dat -o coverage_full.dat
Run Code Online (Sandbox Code Playgroud)
然而,这非常缓慢.组合我的7个配置文件大约需要10分钟,这实际上比编译和运行7个配置文件要长.每个dat文件大约有1M行.
在lcov --combine和lcov --remove步骤非常缓慢的为好.每个人大约45秒.
有没有办法加快这个组合步骤?如果需要我可以使用几个线程,我有足够的内存.如果有其他工具能够正确地进行这种组合,我也会感兴趣(我已经尝试将文件转换为Cobertura并使用我发现的Python脚本进行合并,但它崩溃了).
如果完全有替代lcov,我也很感兴趣.我一直在使用gcovr,但有了它,我必须使用其他几种工具来进行组合并且它不是最佳的,但速度要快得多.
lcov ×10
gcov ×7
c++ ×6
gcc ×3
browserify ×1
c ×1
c++11 ×1
cmake ×1
dart ×1
destructor ×1
flutter ×1
html ×1
istanbul ×1
sonarqube ×1
unittest++ ×1