如何从 llvm-cov 生成 .gcov 文件?

How to generate .gcov file from llvm-cov?

我在 Xcode 7 上创建了一个生成代码覆盖率数据的项目。

在其 DerivedData 文件夹中,我可以 运行 llvm-cov show:

/usr/local/opt/llvm/bin/llvm-cov show -instr-profile Build/Intermediates/CodeCoverage/testetestes/Coverage.profdata Build/Intermediates/CodeCoverage/testetestes/Products/Debug-iphonesimulator/testetestes.framework/testetestes

这将产生如下输出:

/Users/marcelofabri/Desktop/testetestes/testetestes/Example.swift:
   |    1|//
   |    2|//  Example.swift
   |    3|//  testetestes
   |    4|//
   |    5|//  Created by Marcelo Fabri on 09/06/15.
   |    6|//  Copyright © 2015 Marcelo Fabri. All rights reserved.
   |    7|//
   |    8|
   |    9|import UIKit
   |   10|
   |   11|class Example: NSObject {
  1|   12|    func testando() {
  1|   13|        if let url = NSURL(string: "dasdas") {
  1|   14|            print("ae \(url)")
  0|   15|        } else {
  0|   16|            print("oi")
  0|   17|        }
  1|   18|    }
   |   19|}

/Users/marcelofabri/Desktop/testetestes/testetestes/OutraClasse.swift:
   |    1|//
   |    2|//  OutraClasse.swift
   |    3|//  testetestes
   |    4|//
   |    5|//  Created by Marcelo Fabri on 18/06/15.
   |    6|//  Copyright © 2015 Marcelo Fabri. All rights reserved.
   |    7|//
   |    8|
   |    9|import UIKit
   |   10|
   |   11|class OutraClasse: NSObject {
   |   12|
  1|   13|    func outroTestando() {
  1|   14|        if let numero = Int("123") {
  1|   15|            print("ae \(numero)")
  0|   16|        } else {
  0|   17|            print("oi")
  0|   18|        }
  1|   19|    }
   |   20|
   |   21|}

不过,我想要 .gcov 文件,因为大多数工具都使用它。有没有办法在不解析输出和手动创建 .gcov 文件的情况下执行此操作?

根据 Apple 的说法,gcov 不是 Xcode 7 覆​​盖支持的一部分。 Gcov 是 gcc 的遗产,它一直存在直到出现替代品。显然,他们放弃了对旧版 gcov 文件格式的支持,转而支持新的中间格式 — profdata。我自己做了研究,没有找到任何工具可以将 profdata 转换回 gcov,但是有 Slather from Venom。 Slather 能够在 Gutter JSON、Cobertura XML、HTML 和普通测试中生成覆盖率报告。它还能够提供与 Coveralls 等流行服务的集成。目前它也只适用于 gcov,但是他们已经打开了问题并且正在等待 PR 请求以支持 profdata。他们通常行动很快,所以它很可能很快就会被合并到 master 中。

此外,如果您决定编写自己的工具,您可以考虑使用多种方法进行审查:

  • 从 llvm-cov show 转换纯文本输出
  • 按照format documentation
  • 对profdata的二进制格式进行转换
  • 帮助 Slather 家伙将交叉覆盖从他们的模型引入回 gcov,一旦他们将合并到 profdata 支持