Grails / Cobertura报告 - 有条件的报道没有意义

时间:2013-09-20 17:45:00

标签: grails cobertura

可能导致这样的事情:

coverage report fragment

def result行只显示2/6个分支,即使它没有分支,而实际上有条件的下一行也可以。

发生了什么事?我验证了cobertura.ser在构建之间得到了清理。

3 个答案:

答案 0 :(得分:6)

我可以在哪里获得该JAR的来源?

  对于disableOptimizationsTransformation

jarsouce code

另外 - 任何想法如何仅在类路径中包含JAR用于测试应用程序构建阶段?

// Remove the jar before the war is bundled
grails.war.resources = { stagingDir ->
  delete(file:"${stagingDir}/WEB-INF/lib/DisableOptimizationsTransformation-0.1-SNAPSHOT.jar")
}
来自other post here

答案 1 :(得分:5)

同样的讨论也出现在官方论坛上,见Branch coverage issues

@rgarcia提供了一个很棒的小工具jar来禁用AST优化,以便Cobertura能够正确计算覆盖率。

要使用jar,只需将其放入myapp\lib文件夹,然后test-app -coverage:)

答案 2 :(得分:4)

我在grails项目中注意到了同样的事情 - 我认为这是由groovy编译器创建的“优化”分支引起的。

例如 - 此代码

def deleteSomething(params) {
   def result
   if(params.something && params.somethingelse)
      result = "something"
   else result = "something else"
}

在编译时看起来像这样

public Object deleteSomething(Object params)
{
   CallSite[] arrayOfCallSite = $getCallSiteArray(); Object result = null; if ((!BytecodeInterface8.isOrigZ()) || (__$stMC) || (BytecodeInterface8.disabledStandardMetaClass())) {
      if (((DefaultTypeTransformation.booleanUnbox(arrayOfCallSite[2].callGetProperty(params))) && (DefaultTypeTransformation.booleanUnbox(arrayOfCallSite[3].callGetProperty(params))) ? 1 : 0) != 0) {
         String str1 = "something"; result = str1; return str1; } else {
         String str2 = "something else"; result = str2; return str2;
      }
   }
   else if (((DefaultTypeTransformation.booleanUnbox(arrayOfCallSite[4].callGetProperty(params))) && (DefaultTypeTransformation.booleanUnbox(arrayOfCallSite[5].callGetProperty(params))) ? 1 : 0) != 0) {
      String str3 = "something"; result = str3; return str3; } else {
      String str4 = "something else"; result = str4; return str4; } return null;
}

更多讨论here