【问题标题】:Grails / Cobertura report - conditional coverage doesn't make senseGrails / Cobertura 报告 - 条件覆盖没有意义
【发布时间】:2013-09-26 04:47:00
【问题描述】:

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

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

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

【问题讨论】:

  • result 走在路上了吗?
  • 是的,结果稍后分配。

标签: grails cobertura


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

  • 知道在哪里可以获得该 JAR 的源代码吗?另外 - 知道如何仅在测试应用构建阶段将该 JAR 包含在类路径中吗?
【解决方案3】:

我在我们的 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

【讨论】:

  • 似是而非的解释 - 那么如何在 Grails 应用程序中修复它?
  • 感谢您的解释。这也让我感到困惑:(
  • @wrschneider99 经过一番调查,我找到了解决方案,请检查我的答案。
猜你喜欢
  • 2017-01-03
  • 2010-11-14
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2011-07-03
  • 2015-04-06
相关资源
最近更新 更多