代码之家  ›  专栏  ›  技术社区  ›  MetroidFan2002

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

  •  2
  • MetroidFan2002  · 技术社区  · 16 年前

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

    try {
        System.exit(0);
    } catch (final SecurityException exception) {
        exception.printStackTrace();
    }
    System.err.println("The program never exited!");
    

    System.err.println 语句未显示为已覆盖。在此之前,该方法的结尾大括号未显示为已覆盖,因此 System.err System.err.println

    哦,是的,我使用一个模拟安全管理器来抛出安全异常,因为这是我发现的使测试在测试结束后继续执行的最简单的方法 System.exit

    4 回复  |  直到 12 年前
        1
  •  9
  •   tvanfosson    16 年前

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

        2
  •  4
  •   ddimitrov    16 年前

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

    Emma 他也有类似的问题。 Clover 票价要好得多,但是商业性的(不确定是否也能处理这种情况)。如果你使用IDEA,你应该试试他们的 new coverage implementation -很好,正在积极开发中。

        3
  •  1
  •   user7116    16 年前

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

    this Cobertura bug report detailing a similar issue . 另外,遵循@tvanfosson的建议,并意识到在一个大括号上没有覆盖,这在JVM中实际上并没有什么意义,这是一个可以忽略的“噪音”。

        4
  •  0
  •   Bruno D. Rodrigues    11 年前

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

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