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

11

我在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文件的情况下完成这个操作?

1个回答

18
根据苹果公司的说法,gcov不是Xcode 7覆盖范围支持的一部分。Gcov是gcc遗留问题,直到出现替代品才得以保留。显然,他们放弃了旧版gcov文件格式支持,转而采用新的中间格式profdata。我自己进行了研究,没有找到任何将profdata转换回gcov的工具,但有Venom的Slather。Slather能够生成Gutter JSON、Cobertura XML、HTML和纯文本的覆盖报告。它还可以与像Coveralls这样的流行服务集成。目前它仅适用于gcov,但他们已经开展了相关问题并等待支持profdata的PR请求。他们通常行动迅速,所以很快就会合并到主分支中。
此外,如果您决定编写自己的工具,可以考虑多种方法进行审查:
  • 将llvm-cov show的纯文本输出转换
  • 按照格式文档转换profdata的二进制格式
  • 帮助Slather团队介绍从他们的模型返回gcov的交叉覆盖,一旦他们合并了profdata支持

3
我尝试了PR分支中的Slather,并在博客文章中描述了我的经历:http://goo.gl/UUBrBu。它几乎完美,但是我发现用llvm-cov和Slather得到的覆盖率百分比不同,因此可能需要一些改进。 - i4niac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接