首页 > 解决方案 > 无法通过 Java API 从 exec 文件中检索 JaCoCo 覆盖范围

问题描述

我们有 JaCoCo 进行报道。一些测试产生了一个新的 java 进程,我为其添加了 jacocoagent 参数,并得到了预期的 jacoco.exec。每个文件都有不同的路径。

IE-javaagent:path/jacoco.jar=destfile=path/to/output.exec

我将它们合并并生成一份报告,其中它们正确显示为这些外部流程所涵盖的内容。

后来我尝试通过 Java API 使用merged.exec,但我无法覆盖这些方法来执行一些内部计算。

在某些情况下,我发现某些行可能有多个类覆盖记录(我假设取决于该特定行执行了多少次),因此我使用以下方法从这些记录中获得最佳覆盖:

private List<IClassCoverage> getJacocoCoverageData(ExecutionDataStore 
execDataStore,
          String classFile) throws IOException
  {
    List<IClassCoverage> result = new ArrayList<>();
    logger.debug("Processing coverage for class: " + classFile);
    final CoverageBuilder coverageBuilder = new CoverageBuilder();
    final Analyzer analyzer = new Analyzer(execDataStore, coverageBuilder);
    File file = new File(this.workspaceRoot, classFile);
    logger.debug("Analyzing coverage in: " + file);
    if (file.exists())
    {
      try (FileInputStream fis = new FileInputStream(file))
      {
        analyzer.analyzeClass(fis, file.getAbsolutePath());
      }
      Iterator<IClassCoverage> it = coverageBuilder.getClasses().iterator();
      while (it.hasNext())
      {
        result.add(it.next());
      }
    }
    return result;
  }

  private IClassCoverage getBestCoverage(List<IClassCoverage> coverage,
          int workingCopyLine)
  {
    IClassCoverage coverageData = null;
    for (IClassCoverage cc : coverage)
    {
      ILine temp = cc.getLine(workingCopyLine);
      if (coverageData == null
              || temp.getStatus()
              > coverageData.getLine(workingCopyLine).getStatus())
      {
        coverageData = cc;
      }
    }
    return coverageData;
  }

不知何故,我只发现未涵盖的覆盖率数据。上面的报告和方法都查看同一个merged.exec 文件。

标签: javaapijacoco

解决方案


事实证明,这与 JaCoCo 文件完全无关。上面的代码运行良好。


推荐阅读