go -cover或-coverprofile在运行go测试时非常出色,并且可以在html或纯文本中很好地显示。但有没有一个API来以编程方式访问它或处理文件?以编程方式获得golang覆盖
6
A
回答
3
你可以尝试axw/gocov
,其中:
你可以看到像GoCov GUI的工具,以建立一个小的使用gocov.Statement
在convert_statements(s []*gocov.Statement, offset int)
GUI:
1
让我们假设我们想要获得一个项目的测试覆盖百分比(作为float64),我们从某个地方从git仓库动态获取并存储在当前文件夹下的“_repos/src”下。输入将是典型的“go get”格式的项目。我们需要执行“go test -cover”,并设置正确的GOPATH变量,解析输出,并提取测试覆盖率的实际百分比。使用当前的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
}
相关问题
- 1. 角2:以编程方式DIV覆盖
- 2. 以编程方式覆盖视图RelativeLayout
- 3. 以编程方式覆盖图像
- 4. 以编程方式获得EWS accesstoken
- 5. C++/QtTestLib以编程方式获得类
- 6. 如何以编程方式获得$(OutDir)?
- 7. 以编程方式获得FontAwesome unicode值
- 8. 如何以编程方式覆盖Windows Phone Suggestion Bar?
- 9. 以编程方式重复jQuery工具覆盖
- 10. heroku - 以编程方式创建的文件被覆盖
- 11. 如何以编程方式覆盖图像上的文本
- 12. 以编程方式覆盖loadView并设置rootViewController,没有Storyboard
- 13. 以编程方式移除单张覆盖图层图层
- 14. 如何以编程方式实现jqgrid搜索覆盖
- 15. 以编程方式覆盖现有文件
- 16. Android - 以编程方式制作一个StateListDrawable,覆盖前一个?
- 17. FFmpeg AVFilter覆盖/水印以编程方式
- 18. 以编程方式覆盖WPF控件颜色
- 19. 如何以编程方式覆盖web.config设置
- 20. 以编程方式关闭覆盖MUI CSS
- 21. 获取覆盖的行列表每单元测试以编程方式处理
- 22. 如何获得在SaveViewState覆盖方法
- 23. 如何以编程方式覆盖Ruport数据表的格式化程序?
- 24. 以编程方式读取logcat以获得应用程序
- 25. 如何使用jacoco或其他工具以编程方式获得junit 4测试代码覆盖率?
- 26. Golang覆盖嵌入函数
- 27. 我可以以编程方式覆盖客户端app.config WCF端点地址吗?
- 28. Grails:Config.groovy中的设置可以在运行时以编程方式覆盖吗?
- 29. 如何以编程方式在AFS中获得PAG编号?
- 30. 如何以编程方式获得SAS编码选项?
有趣。 +1。我的答案是三年前写的。没有必要downvote。 – VonC
没问题。我做了一个小小的编辑。我仍然感谢你对这个老问题的贡献(用Go 1.9)。 – VonC
我已经偶然发现了我们的回购标记子系统。我使用“测试覆盖率”来检查学生是否需要测试覆盖。 axw/gocov有点矫枉过正,而且它没有做我想做的 - 我只是想让测试覆盖率浮动,并且在回收库中动态调整。 – marni