10

什么可能导致这样的事情:

覆盖报告片段

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

这是怎么回事?我验证cobertura.ser了在构建之间正在清理。

4

3 回答 3

7

知道在哪里可以获得该 JAR 的源代码吗?

disableOptimizationsTransformation 的jar源代码

另外-知道如何仅在测试应用程序构建阶段将该 JAR 包含在类路径中吗?

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

这里的其他帖子

于 2014-01-03T18:53:39.817 回答
5

官方论坛中也出现了相同的讨论,请参阅分支覆盖问题

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

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

于 2014-01-02T16:58:29.433 回答
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;
}

更多讨论在这里

于 2013-09-20T19:17:45.467 回答