Java Cobertura拒绝承认代码已包含在内

Java Cobertura拒绝承认代码已包含在内,java,maven-2,code-coverage,cobertura,Java,Maven 2,Code Coverage,Cobertura,我正在使用Maven(2)Cobertura插件创建关于代码覆盖率的报告,我在方法中使用了以下存根: try { System.exit(0); } catch (final SecurityException exception) { exception.printStackTrace(); } System.err.println("The program never exited!"); 我知道我需要记录异常等,但这不是现在的重点…Cobertura拒绝承认打印堆栈跟踪后

我正在使用Maven(2)Cobertura插件创建关于代码覆盖率的报告,我在方法中使用了以下存根:

try {
    System.exit(0);
} catch (final SecurityException exception) {
    exception.printStackTrace();
}
System.err.println("The program never exited!");
我知道我需要记录异常等,但这不是现在的重点…Cobertura拒绝承认打印堆栈跟踪后的行被覆盖。也就是说,
System.err.println
语句前面带有“}”的行没有显示为覆盖。在此之前,方法的结尾大括号没有显示为已覆盖,因此出现了
System.err
语句。你知道我怎样才能说服cobertura的maven插件,既然
System.err.println
语句被覆盖了,那末大括号就必须被覆盖


哦,是的,我使用模拟安全管理器抛出安全异常,因为这是我发现的使测试在
系统之后继续执行的最简单方法。退出
调用。

我会查看覆盖率报告。仔细检查我的测试。请注意,代码真的被覆盖了,不必担心达到100%。代码覆盖率最好用于查找您可能忽略了测试的区域,但仅仅将获得100%覆盖率作为目标是一个坏习惯,它会导致您跳过需要编写的测试,因为您的工具显示了100%。使用该工具可以做什么,但不要落入让工具定义你做什么的陷阱。

我已经有一段时间没有使用Cobertura了(2005?),并且在那时看到了这种行为。在catch/finally块之后,C#和花括号的NCover也存在类似的问题


我的建议是增加。另外,按照@tvanfosson的建议,认识到在JVM中没有大括号的覆盖,这实际上不会成为任何东西,这是可以忽略的“噪音”。

在Java类文件格式中,每个方法都用一个表来注释,该表将代码偏移量映射到行号。在本例中,右大括号不产生任何字节码,因此不包括在内。这是源代码和字节码之间不完全对应的问题。它应该由coverage工具处理,将这一行识别为非代码


我知道这也有类似的问题。票价要好得多,但是商业性的(不确定是否也能处理这种情况)。如果您使用IDEA,您应该尝试他们的-这非常好,并且正在积极开发中。

我知道这是一个老问题,Cobertura已经解决了这个问题,但是为了完整性,“}”上的缺少覆盖是由内部自动“finally”块造成的

如下所示查看您的代码:

try {
    System.exit(0);
} catch (final SecurityException exception) {
    exception.printStackTrace();
} finally {
    // noop
}

幸运的是,某些版本不再出现这种情况。

谢谢,我在您列出的bug中添加了我的代码示例。希望这个bug将来会被修复,直到你发布了这个链接,我才知道它是一个bug。只是觉得我错过了一些配置问题!我同意你的说法,但是当括号上下的代码被覆盖时,无法达到“完美”的代码覆盖率是非常恼人的。这些都是我在代码更新时进行的测试,所以还没有太多的功能。您需要将时间花在复杂的代码上,而不是花在getter和setter上。覆盖率只有在帮助您实现付费目标的情况下才有价值——交付产品,而不是报告。当然,完美的覆盖率并不是衡量指标的全部目的,但我不同意您对测试能手和能手的看法。很多时候,一个getter或setter被修改为有一个未记录的副作用,并且很难追踪。杀死一个测试解决了这个问题>>“很多时候,一个getter或setter被修改成具有未记录的副作用,并且很难追踪到”你有经验数据吗?我个人使用中型系统(100-1000千千瓦时)的经验告诉我情况并非如此……或者我只是幸运:-)你只是幸运:-)我发现一个特别令人讨厌的副作用是getter,它在返回之前对输出执行O(n)计算……如果创建一个测试用例来显式测试O(n)功能,追查和消除这些信息很容易。我会把任何不免费的信息传递出去;)至于我的IDE,我非常广泛地使用Eclipse。我想试试Emma,但不幸的是,它没有我所知道的Maven 2插件,所以现在Cobertura是我所知道的最好的选择。