Maven Cobertura插件生成不完整的覆盖率报告

时间:2015-05-12 10:06:56

标签: java maven cobertura maven-cobertura-plugin

我正在使用:

mvn cobertura:cobertura

生成项目的覆盖率报告。这实际上并没有在pom.xml文件中配置,因此它只使用最新版本的插件(目前为2.6)。

在大多数情况下,这可行,但由于某种原因,一个类有一个非常奇怪的报告。似乎报告说某些行已被覆盖,但其他行(紧挨着它)不是。

我一直在跑:

mvn clean

当然,但这似乎没有帮助。

总的来说,它只报告了大约1%的覆盖率,但这实际上是一个非常关键的课程,我知道它已经被大量使用了。我也知道报告以前工作正常。我不确定他们何时停止工作,因为我一段时间没有检查过该课程的报道。

作为我所看到的一个例子:

2053 private final List<EntityProperty<T>> properties = new ArrayList<EntityProperty<T>>();     
     private final PropertyDescriptor idProperty;
0    private final Set<String> fieldOrder = new LinkedHashSet<String>();
0    private final Map<String, String> additionalFieldLabels = new HashMap<String, String>();

这是来自班级的初始化者。第一行显然被称为2053年。第二行实际上并没有运行任何代码,所以留空(如图所示),但第3行和第4行都报告被调用0次。

另一个例子:

2053 public EntityIntrospector(AdminApp app, EntityApplication entityApp, Class<T> entityClass) {
0        this.app = app;

来自构造函数本身。同样,第一行被称为2053次,但第二行(以及构造函数中的所有其他行)被称为0次。

无论如何,我不知道为什么会这样。

我怀疑它可能是另一个图书馆以某种方式干扰了覆盖/仪器。

班级规模可能是一个因素。源文件本身是一个相当重的2040行(918条实际代码行计入覆盖范围)。

我在过去几天一直在编写其他测试和代码,而cobertura对这些人来说工作得很好。

欢迎提示和建议。

1 个答案:

答案 0 :(得分:1)

所以看起来这个类似乎太大了。我在这个课堂上入侵了一些评论。这显然使整个测试失败,但现在覆盖范围似乎再次正常工作。

这个类现在有804行(就可以覆盖的行而言)。

所以看起来对于一个类cobertura可以处理的大小有一些有效的限制。

在我的情况下,这可能意味着类可以通过重构来破坏代码。

更新(2015年6月3日): 我将有问题的类重构为790行并仍然存在同样的问题。最后,问题似乎与构造函数中的代码有关。我有类似的东西:

try {
    final BeanInfo beanInfo = Introspector.getBeanInfo(entityClass);
    // rest of constructor here (about 50 lines)
}
catch( IntrospectionException ie ) {
    throw new RuntimeException(ie);
}

我将其更改为具有以下方法:

protected BeanInfo getBeanInfo(Class<T> entityClass) {
    try {
        return Introspector.getBeanInfo(entityClass);
    }
    catch( IntrospectionException ie ) {
        throw new RuntimeException(ie);
    }
}

而是在构造函数中调用。这样我知道更长时间需要构造函数本身内的try / catch。

我不是百分之百确定是否通过使构造函数的长度更短或者移动try / catch来解决问题。