开源测试工具 goc 学习:源代码部署和简单使用

zyanycall · 2020年06月23日 · 最后由 水杨 回复于 2020年10月26日 · 4538 次阅读

首先,向项目推广者@CarlJi 和项目的所有 contributors 致敬。
目前我 GO 语言使用接触还很浅,遇到错误多多批评。

github(goc):[https://github.com/qiniu/goc]
github(simple-go-server):[https://github.com/CarlJi/simple-go-server]

背景铺垫

我正在学习 GO 语言,遇到好的工具就简单下载部署了一下,正好是代码覆盖率测试所避不开的,同时还是七牛出品,特别想看看试试。
我发现看别人的源码,对 GO 语言的学习提高特别有效。

开发环境

GoLand

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%

coverage.out 文件解释

比如,XxxClient/xxx/test01/main.go:8.13,35.2 12 1 的解析

  • 8.13:从 main.go 第 8 行的 13 列(12 个字符结束)开始。
  • 35.2:到 main.go 第 35 行的第 2 列(1 个字符结束)结束。
  • 12:一共 12 行代码(除了方法的声明)。
  • 1:被执行覆盖了 1 次。

这里仅是分析了最简单的代码块,可能会有其他的 GO 代码块不是这么分析的。

其他参数

goc 提供了很多其他的参数,如果要使用,可以试试:

go run /Users/xxx/work/Git/goc/goc.go list --center="http://127.0.0.1:50856"

等等。

GoLand 调试工具设置


这样就可以调试源码了。

再次感谢

这个工具其实挺有想象力了,很棒,点赞。
还有很多参数,比如 diff 我没试过,应该也很强大,很棒。

共收到 2 条回复 时间 点赞

goc 里面有个调试开关,任何命令带上它都会打印详细的执行过程,比较方便~
--debug run goc in debug mode

楼主好,首先是要 git 下载 goc 和 simple-go-server,工程 goc 编译通过后。
在 simple-go-server 根目录下执行【go run D:/GoCode/goc/goc.go run .】
报如下异常:【level=fatal msg="Fail to run: fail to list package dependencies"
exit status 1】
请问大概是哪里出错了,btw,演示教程能写的更详细一点吗,多谢先

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册