如何从 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 支持
我在 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 支持