获取 golang 测试的分支覆盖率

tuk*_*tuk 8 go

如果我们可以为我的 golang 测试获得分支覆盖范围,有人可以向我建议一种方法吗?假设我有一个 golang 代码,如下所示:

package main

import (
    "fmt"
)

func HelloWorld(name string, printv int) string {
    if name == "tuk" || printv == 1 {
        fmt.Println("Hello tuk")
        return "Hello tuk"
    } else {
        fmt.Println("Who are you?")
        return "Who are you?"
    }
}
Run Code Online (Sandbox Code Playgroud)

相应的测试文件如下所示:

package main

import "testing"

func TestHelloWorld(t *testing.T) {
    r := HelloWorld("tuk", 0)
    if r != "Hello tuk" {
        t.Error("Test Failed")
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我执行下面的测试命令,它只是给我语句覆盖率:

go test -coverprofile=cover.out .
ok      test    0.007s  coverage: 60.0% of statements
Run Code Online (Sandbox Code Playgroud)

有什么方法可以让我也获得分支机构的覆盖范围吗?

Rol*_*lig 9

从 Go 1.11(2018 年 11 月)开始,生成的覆盖范围机器代码仅覆盖每个语句块。应该可以采用该代码并对其进行调整以覆盖表达式的每个分支。

看起来gobco 项目确实做到了这一点,尽管只是针对单个文件而不是整个包(同样,截至 2018 年 11 月)。

提出了一个问题,看看 Go 团队认为分支覆盖是否值得。我们的决定是保持当前代码像现在一样简单,并且该决定已经记录在代码本身中

最后我分叉了 gobco 项目并添加了我需要的所有功能。