- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我通过启动并运行一个 100% 覆盖率的小型 C++ 测试项目来了解更多关于自动化测试的过程中,我遇到了以下问题——尽管我所有的实际代码行和所有执行分支都是被测试覆盖,lcov 仍然报告两行未经测试(它们只包含函数定义),以及一个据称未经测试的“重复”构造函数方法,即使它匹配我的“真实”构造函数(唯一定义和使用过的构造函数)完美。
(跳到编辑最小复制案例)
如果我使用 gcovr python 脚本生成相同的覆盖率统计数据(来自相同的确切来源,.gcno 和 .gcda 文件)并将结果传递给 Jenkins Cobertura 插件,它会在所有计数上为我提供 100% - 行,条件和方法。
我的意思是:
Jenkins Cobertura 报道页面:http://gints.dyndns.info/heap_std_gcovr_jenkins_cobertura.html (一切都在 100%)。
使用 lcov 处理的相同 .gcda 文件:http://gints.dyndns.info/heap_std_lcov.html (两个函数定义行标记为未执行,即使这些函数中的行已被完全覆盖,还有函数 Hit = functions Total - 1)。
来自 lcov 的源文件的函数统计信息:http://gints.dyndns.info/heap_std_lcov_func(显示了两个相同的构造函数定义,都引用文件中的同一行代码,其中一个标记为命中 5 次, 其他 0 次).
如果我查看中间 lcov .info 文件:http://gints.dyndns.info/lcov_coverage_filtered.info.txt我看到那里也有两个构造函数定义,它们应该在同一行:FN:8,_ZN4BBOS8Heap_stdC1Ev & FN:8,_ZN4BBOS8Heap_stdC2Ev。
哦,不要介意 .uic 包含/析构函数周围的困惑,这只是处理 What is the branch in the destructor reported by gcov? 的一种肮脏方式。拍摄那些文件快照时,我正好在尝试。
有人对如何解决这个问题有建议吗? C++ 编译器在这里做了一些“幕后”魔术吗? (我应该确保从我的测试中调用的特殊用途的构造函数的额外拷贝,也许?)常规函数定义怎么样 - 即使主体已经过全面测试,定义行怎么可能未经测试?这仅仅是 lcov 的问题吗?欢迎任何建议 - 我想了解为什么会发生这种情况,如果我的测试真的有一些功能没有被发现并且 Cobertura 没有提示......或者如果没有,我该如何做lcov 明白吗?
编辑:在下面添加最小的重现场景
lcov_repro_one_bad.cpp:
#include <stdexcept>
class Parent {
public:
Parent() throw() { }
virtual void * Do_stuff(const unsigned m) throw(std::runtime_error) =0;
};
class Child : public Parent {
public:
Child() throw();
virtual void * Do_stuff(const unsigned m)
throw(std::runtime_error);
};
Child::Child()
throw()
: Parent()
{
}
void * Child::Do_stuff(const unsigned m)
throw(std::runtime_error)
{
const int a = m;
if ( a > 10 ) {
throw std::runtime_error("oops!");
}
return NULL;
}
int main()
{
Child c;
c.Do_stuff(5);
try {
c.Do_stuff(11);
}
catch ( const std::runtime_error & ) { }
return 0;
}
生成文件:
GPP_FLAGS:=-fprofile-arcs -ftest-coverage -pedantic -pedantic-errors -W -Wall -Wextra -Werror -g -O0
all:
g++ ${GPP_FLAGS} lcov_repro_one_bad.cpp -o lcov_repro_one_bad
./lcov_repro_one_bad
lcov --capture --directory ${PWD} --output-file lcov_coverage_all.info --base-directory ${PWD}
lcov --output-file lcov_coverage_filtered.info --extract lcov_coverage_all.info ${PWD}/*.*
genhtml --output-directory lcov_coverage_html lcov_coverage_filtered.info --demangle-cpp --sort --legend --highlight
如您所见,所谓的未命中行是函数可能抛出的异常的定义,并且 Child 的额外未命中构造函数仍然存在于函数列表中(单击顶部的函数)。
我已经尝试从函数定义中删除 throw 声明,这会处理函数声明中未执行的行:http://gints.dyndns.info/lcov_repro_bin/lcov_coverage_html/gints/lcov_repro/lcov_repro_one_v1.cpp.gcov.html (额外的构造函数仍然存在,如您所见)。
我已经尝试将函数定义移动到类主体中,而不是稍后定义它们,这样就摆脱了额外的构造函数:http://gints.dyndns.info/lcov_repro_bin/lcov_coverage_html/gints/lcov_repro/lcov_repro_one_v2.cpp.gcov.html (不过,如您所见,Do_stuff 函数定义仍然有些奇怪)。
然后,当然,如果我同时执行以上两个操作,一切都很好:http://gints.dyndns.info/lcov_repro_bin/lcov_coverage_html/gints/lcov_repro/lcov_repro_one_ok.cpp.gcov.html
但我仍然对这的根本原因感到困惑...而且我仍然希望将我的方法(包括构造函数)定义在一个单独的 .cpp 文件中,而不是在类主体中,而且我确实希望我的函数具有可以抛出的明确定义的异常!
这是源代码,以防您想玩这个:http://gints.dyndns.info/lcov_repro_src.zip
有什么想法吗?
谢谢!
最佳答案
好吧,在四处寻找和阅读 C++ 异常声明之后,我想我明白发生了什么:
就未命中的 throw 声明而言,似乎这里的一切实际上都是正确的:函数 throw 声明应该向输出目标文件添加额外代码以检查非法(就 throw声明)抛出异常。由于我没有测试发生这种情况的情况,因此该代码从未执行并且这些语句被标记为未命中是有道理的。尽管这里的情况无论如何都远非理想,但至少可以看出这是从哪里来的。
就重复的构造函数而言,这似乎是 gcc 的一个长期讨论的已知问题(以及各种补丁尝试以解决生成的目标代码重复):http://gcc.gnu.org/bugzilla/show_bug.cgi?id=3187 - 基本上,创建了两种版本的构造函数 - 一种用于此类,一种用于子类,如果您想要 100% 的覆盖率,则需要同时练习这两种版本。
关于c++ - lcov 问题 : weird duplicate constructor marked as not covered & function not marked as covered, 即使其行已被执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12807512/
我有一个“有趣”的问题,即以两种不同的方式运行 wine 会导致: $> wine --version /Applications/Wine.app/Contents/Resources/bin/wi
我制作了这个网络抓取工具来获取网页中的表格。我使用 puppeteer (不知道 crontab 有问题)、Python 进行清理并处理数据库的输出 但令我惊讶的是,当我执行它时 */50 * * *
JavaScript 是否被调用或执行取决于什么?准确地说,我有两个函数,它们都以相同的方式调用: [self.mapView stringByEvaluatingJavaScriptFromStri
我目前正在使用 python 做一个机器学习项目(这里是初学者,从头开始学习一切)。 只是想知道 statsmodels 的 OLS 和 scikit 的 PooledOlS 使用我拥有的相同面板数据
在使用集成对象模型 (IOM) 后,我可以执行 SAS 代码并将 SAS 数据集读入 .Net/C# 数据集 here . 只是好奇,使用 .Net 作为 SAS 服务器的客户端与使用 Enterpr
有一些直接的 jQuery 在单击时隐藏打开的 div 未显示,但仍将高度添加到导航中以使其看起来好像要掉下来了。 这个脚本工作正常: $(document).ready(funct
这个问题已经有答案了: How do I compare strings in Java? (23 个回答) 已关闭 4 年前。 这里是 Java 新手,我正在使用 NetBeans 尝试一些简单的代
如果我将它切换到 Python 2.x,它执行 10。这是为什么? 训练逻辑回归模型 import keras.backend as
我有两个脚本,它们包含在 HTML 正文中。在第一个脚本中,我初始化一个 JS 对象,该对象在第二个脚本标记中引用。 ... obj.a = 1000; obj.
每当我运行该方法时,我都会收到一个带有数字的错误 以下是我的代码。 public String getAccount() { String s = "Listing the accounts";
我已经用 do~while(true) 创建了我的菜单;但是每次用户输入一个数字时,它不会运行程序,而是再次显示菜单!你怎么看? //我的主要方法 public static void main(St
执行命令后,如何让IPython通知我?我可以使用铃声/警报还是通过弹出窗口获取它?我正在OS X 10.8.5的iTerm上运行Anaconda。 最佳答案 使用最新版本的iTerm,您可以在she
您好,我刚刚使用菜单栏为 Swing 编写了代码。但是问题出现在运行中。我输入: javac Menu.java java Menu 它没有给出任何错误,但 GUI 没有显示。这是我的源代码以供引用:
我觉得这里缺少明显的东西,但是我看不到它写在任何地方。 我使用Authenticode证书对可执行文件进行签名,但是当我开始学习有关它的更多信息时,我对原样的值(value)提出了质疑。 签名的exe
我正在设计一个应用程序,它使用 DataTables 中的预定义库来创建数据表。我想对数据表执行删除操作,为此应在按钮单击事件上执行 java 脚本。 $(document).ready(functi
我是 Haskell 新手,如果有人愿意帮助我,我会很高兴!我试图让这个程序与 do while 循环一起工作。 第二个 getLine 命令的结果被放入变量 goGlenn 中,如果 goGlenn
我有一个用 swing 实现迷你游戏的程序,在主类中我有一个循环,用于监听游戏 map 中的 boolean 值。使用 while 实现的循环不会执行一条指令,如果它是唯一的一条指令,我不知道为什么。
我正在尝试开发一个连接到 Oracle 数据库并执行函数的 Java 应用程序。如果我在 Eclipse 中运行该应用程序,它可以工作,但是当我尝试在 Windows 命令提示符中运行 .jar 时,
我正在阅读有关 Java 中的 Future 和 javascript 中的 Promises 的内容。下面是我作为示例编写的代码。我的问题是分配给 future 的任务什么时候开始执行? 当如下行创
我有一个常见的情况,您有两个变量(xSpeed 和 ySpeed),当它们低于 minSpeed 时,我想将它们独立设置为零,并在它们都为零时退出。 最有效的方法是什么?目前我有两种方法(方法2更干净
我是一名优秀的程序员,十分优秀!