以编程方式获取golang覆盖率

以编程方式获取golang覆盖率,go,code-coverage,Go,Code Coverage,go-cover或-coverprofile在运行go测试时非常好,可以在html或纯文本中很好地显示。但是是否有api可以通过编程方式访问它或处理文件?您可以尝试以下方法: 解析结果() 为了构建一个小型GUI,您可以看到类似usesgocov.Statement的工具: 让我们假设我们想要在一个项目上获得测试覆盖率百分比(作为float64),该项目是我们从某处动态地从git repo获取的,并存储在当前文件夹中的“\u repos/src”下。输入将是典型的“go-get”格式的项目

go-cover或-coverprofile在运行go测试时非常好,可以在html或纯文本中很好地显示。但是是否有api可以通过编程方式访问它或处理文件?

您可以尝试以下方法:

  • 解析结果()
为了构建一个小型GUI,您可以看到类似uses
gocov.Statement
的工具:


让我们假设我们想要在一个项目上获得测试覆盖率百分比(作为float64),该项目是我们从某处动态地从git repo获取的,并存储在当前文件夹中的“\u repos/src”下。输入将是典型的“go-get”格式的项目。我们需要使用正确的GOPATH变量集执行“go test-cover”,解析输出,并提取测试覆盖率的实际百分比。使用当前的Go 1.9测试工具,下面的代码实现了这一点

// ParseFloatPercent turns string with number% into float.
func ParseFloatPercent(s string, bitSize int) (f float64, err error) {
    i := strings.Index(s, "%")
    if i < 0 {
        return 0, fmt.Errorf("ParseFloatPercent: percentage sign not found")
    }
    f, err = strconv.ParseFloat(s[:i], bitSize)
    if err != nil {
        return 0, err
    }
    return f / 100, nil
}

// GetTestCoverage returns the tests code coverage as float
// we are assuming that project is a string
// in a standard "Go get" form, for example:
//     "github.com/apache/kafka"
// and, that you have cloned the repo into "_repos/src"
// of the current folder where your executable is running.
//
func GetTestCoverage(project string) (float64, error) {
    cmdArgs := append([]string{"test", "-cover"}, project)
    cmd := exec.Command("go", cmdArgs...)
    // get the file absolute path of our main executable
    dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
    if err != nil {
        log.Println(err)
        return 0, err
    }
    // set the GOPATH for tests to work
    cmd.Env = os.Environ()
    cmd.Env = append(cmd.Env, "GOPATH="+dir+"/_repos/")

    var out []byte
    cmd.Stdin = nil
    out, err = cmd.Output()

    if err != nil {
        fmt.Println(err.Error())
        return 0, err
    }

    r := bufio.NewReader(bytes.NewReader(out))
    // first line from running "go test -cover" should be in a form
    // ok   <project>   6.554s  coverage: 64.9% of statements
    // split with /t and <space> characters
    line, _, err := r.ReadLine()

    if err != nil {
        fmt.Println(err.Error())
        return 0, err
    }

    parts := strings.Split(string(line), " ")
    if len(parts) < 6 {
        return 0, errors.New("go test -cover do not report coverage correctly")
    }
    if parts[0] != "ok" {
        return 0, errors.New("tests do not pass")
    }
    f, err := ParseFloatPercent(parts[3], 64)
    if err != nil {
        // the percentage parsing problem
        return 0, err
    }

    return f, nil
}
//ParseFloatPercent将数字为%的字符串转换为浮点。
func ParseFloatPercent(s字符串,位大小int)(f float64,err error){
i:=字符串。索引(“%”)
如果i<0{
返回0,fmt.Errorf(“未找到百分比:百分号”)
}
f、 err=strconv.ParseFloat(s[:i],位大小)
如果错误!=零{
返回0,错误
}
返回f/100,无
}
//GetTestCoverage以浮点形式返回测试代码覆盖率
//我们假设这个项目是一个字符串
//以标准的“Go-get”形式,例如:
//“github.com/apache/kafka”
//而且,您已将回购协议克隆到“\u repos/src”
//运行可执行文件的当前文件夹的。
//
func GetTestCoverage(项目字符串)(float64,错误){
cmdArgs:=追加([]字符串{“测试”,“-cover”},项目)
cmd:=exec.Command(“go”,cmdArgs…)
//获取主可执行文件的文件绝对路径
dir,err:=filepath.Abs(filepath.dir(os.Args[0]))
如果错误!=零{
log.Println(错误)
返回0,错误
}
//设置测试工作的GOPATH
cmd.Env=os.Environ()
cmd.Env=append(cmd.Env,“GOPATH=“+dir+”/_repos/”)
var out[]字节
cmd.Stdin=nil
out,err=cmd.Output()
如果错误!=零{
fmt.Println(err.Error())
返回0,错误
}
r:=bufio.NewReader(bytes.NewReader(out))
//运行“go test-cover”的第一行应该是
//ok 6.554s覆盖率:报表的64.9%
//使用/t和字符拆分
第行,u,err:=r.ReadLine()
如果错误!=零{
fmt.Println(err.Error())
返回0,错误
}
部分:=字符串。拆分(字符串(行),“”)
如果长度(零件)<6{
返回0,错误。新建(“进行测试-覆盖率未正确报告覆盖率”)
}
如果零件[0]!=“正常”{
返回0,错误。新建(“测试未通过”)
}
f、 错误:=百分比(第[3]部分,64)
如果错误!=零{
//百分比解析问题
返回0,错误
}
返回f,无
}

很有趣+1.我的回答是三年前写的。没必要投反对票,没问题。我做了一个小编辑。我仍然很感谢您对这个老问题的贡献(Go 1.9)。我偶然发现了我们的回购标记子系统。我使用“测试覆盖率”来检查学生是否完成了要求的测试覆盖率。axw/gocov有点过火,它并没有达到我想要的效果——我只是想要测试覆盖率浮动,在我们动态拉取的回购协议上。