我正在使用:
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对这些人来说工作得很好。
欢迎提示和建议。
答案 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来解决问题。