首先,向项目推广者@CarlJi 和项目的所有 contributors 致敬。
目前我 GO 语言使用接触还很浅,遇到错误多多批评。
github(goc):[https://github.com/qiniu/goc]
github(simple-go-server):[https://github.com/CarlJi/simple-go-server]
我正在学习 GO 语言,遇到好的工具就简单下载部署了一下,正好是代码覆盖率测试所避不开的,同时还是七牛出品,特别想看看试试。
我发现看别人的源码,对 GO 语言的学习提高特别有效。
GoLand 是收费的,但是如果你在 github 上有一年以上的开源项目,能申请到免费试用一年的注册码。
我也没想着安装 goc,而是打算使用源码来直接调试和使用。
目前都是在 goland 的终端来执行,因为设置了 GOPROXY
切换到 simple-go-server 的文件夹下,执行:
go run /Users/xxx/work/Git/goc/goc.go run .
当前版本 1.0 版本下,这里必须设置 . 这个目录,我本来以为可以写绝对路径的。
这是第一步,使用 goc 的命令指令,来执行启动了 simple-go-server 的程序。
注意,这里可能会报错提示连接超时,需要配置 go 的代理:
GOPROXY=https://goproxy.cn,direct;GO111MODULE=on
控制台会打印:
localhost:simple-go-server xxx$ go run /Users/xxx/work/Git/goc/goc.go run .
[goc] goc server started: http://127.0.0.1:50856
http: 2020/06/23 15:58:51 Simple go server
http: 2020/06/23 15:58:51 Version:
http: 2020/06/23 15:58:51 GitTag:
http: 2020/06/23 15:58:51 GitCommit:
http: 2020/06/23 15:58:51 GitTreeState:
http: 2020/06/23 15:58:51 Server is starting...
http: 2020/06/23 15:58:51 Server is ready to handle requests at :5000
goc 的 server 应该是 goc 自己自带的,也会默认设置成为 center。端口号貌似是随机的,应该可以设置。
go run /Users/xxx/work/Git/goc/goc.go profile --center="http://127.0.0.1:50856"
go run /Users/xxx/work/Git/goc/goc.go profile --center="http://127.0.0.1:50856" > coverage.out && go tool cover -func=coverage.out
这样就会输出没有改变的覆盖率如:
enricofoltran/simple-go-server/main.go:30: main 82.4%
enricofoltran/simple-go-server/main.go:90: index 12.5%
enricofoltran/simple-go-server/main.go:103: healthz 20.0%
enricofoltran/simple-go-server/main.go:113: logging 25.0%
enricofoltran/simple-go-server/main.go:128: tracing 25.0%
total: (statements) 54.0%
执行的就是代码的行号,还有方法的覆盖率。
这时候可以访问
http: 2020/06/23 15:58:51 Server is ready to handle requests at :5000
中得到的端口,访问:http://127.0.0.1:5000/
go run /Users/xxx/work/Git/goc/goc.go profile --center="http://127.0.0.1:50856" > coverage.out && go tool cover -func=coverage.out
得到改变的覆盖率,可以看到百分比改变,很强大:
enricofoltran/simple-go-server/main.go:30: main 85.3%
enricofoltran/simple-go-server/main.go:90: index 75.0%
enricofoltran/simple-go-server/main.go:103: healthz 20.0%
enricofoltran/simple-go-server/main.go:113: logging 87.5%
enricofoltran/simple-go-server/main.go:128: tracing 100.0%
total: (statements) 81.0%
后面又使用这一套测试了我自己的测试程序的覆盖率:
xxxdeMacBook-Pro:test01 xxx$ pwd
/Users/xxx/work/Git/XxxClient/xxx/test01
xxxdeMacBook-Pro:test01 xxx$ go run /Users/xxx/work/Git/goc/goc.go run .
接着查看覆盖率:
xxxdeMacBook-Pro:test01 xxx$ go run /Users/xxx/work/Git/goc/goc.go profile --center="http://127.0.0.1:51447"
mode: count
XxxClient/xxx/test01/main.go:8.13,35.2 12 1
XxxClient/xxx/test01/main.go:49.24,51.2 1 0
XxxClient/xxx/test01/main.go:53.39,55.2 1 1
XxxClient/xxx/test01/main.go:57.31,58.17 1 0
XxxClient/xxx/test01/main.go:58.17,60.3 1 0
XxxClient/xxx/test01/main.go:60.8,62.3 1 0
XxxClient/xxx/test01/main.go:66.30,67.17 1 0
XxxClient/xxx/test01/main.go:67.17,71.3 3 0
XxxClient/xxx/test01/main.go:71.8,73.3 1 0
XxxClient/xxx/test01/main.go:83.46,85.17 1 1
XxxClient/xxx/test01/main.go:85.17,87.3 1 0
XxxClient/xxx/test01/main.go:88.2,91.37 3 1
XxxClient/xxx/test01/main.go:91.37,92.19 1 7
XxxClient/xxx/test01/main.go:92.19,97.4 3 7
XxxClient/xxx/test01/main.go:99.3,101.20 3 7
XxxClient/xxx/test01/main.go:103.2,103.15 1 1
xxxdeMacBook-Pro:test01 xxx$ go run /Users/xxx/work/Git/goc/goc.go profile --center="http://127.0.0.1:51447" > coverage.out && go tool cover -func=coverage.out
XxxClient/xxx/test01/main.go:8: main 100.0%
XxxClient/xxx/test01/main.go:49: add 0.0%
XxxClient/xxx/test01/main.go:53: setVal 100.0%
XxxClient/xxx/test01/main.go:57: print 0.0%
XxxClient/xxx/test01/main.go:66: recu 0.0%
XxxClient/xxx/test01/main.go:83: preorderTraversal 92.3%
total: (statements) 71.4%
比如,XxxClient/xxx/test01/main.go:8.13,35.2 12 1 的解析
这里仅是分析了最简单的代码块,可能会有其他的 GO 代码块不是这么分析的。
goc 提供了很多其他的参数,如果要使用,可以试试:
go run /Users/xxx/work/Git/goc/goc.go list --center="http://127.0.0.1:50856"
等等。
这样就可以调试源码了。
这个工具其实挺有想象力了,很棒,点赞。
还有很多参数,比如 diff 我没试过,应该也很强大,很棒。