收集 Golang 覆盖率
如果无法正常显示,请先停止浏览器的去广告插件。
1. ECUG
Meetup
·第3期。
如何收集
美Golang
实时覆盖率
李意扬
七牛云视频业务质量保障负责人,测试开发专家
ECUG Mee
期
效率优化与质佳实践专场
2. ECUG
Meetup
·第3期。
01
现状
目录
02
CONTENT
新工具
03
原理
04
扩展
ECUG Meetup 第3期
聚效率优化气
晟佳实践专场
(. VIPTEST
3. ECUG
Meetup
·第3期。
01
现状
ECUG Meetup 第3期
(. VIPTEST
4. ECUG
其他语言覆盖率工具
Meetup
·第3期。
RCoV
JaCoCoRce
RCOV
pcov coverlet
coverletJaCoCo
JaCoco
RCOV
gcov
JaCoCo
JaCoco
gcov
RCOV
gcov
pCOV
Coverag
Coverage
BCOV=CCOV
Coverle1
Coverage
RCoV
pCoVPCoV
RCovCoverage
RCOV
Jcov
JaCoCo
pcov
coverlet
ECUG Meetup 第3期
婴效率优化与质佳实践专场
ECUG
X ( VIPTEST >
5. ECUG
Golang 覆盖率
Meetup
单测覆盖率
·第3期。
kcp.go
kcp_test.go
go test -cover
kcpgo test-cover -coverprofile=cover.out
PASS
coverage: 42.9% of statements
ok
kcp/kcp0.001s
→ kcp cat cover.out
mode: set
kcp/kcp/kcp.go:3.25,4.121 1
kcp/kcp/kcp.go:16.516.221
kcp/kcp/kcp.go:5.16,6.2611
kcp/kcp/kcp.go:7.178.221@
kcp/kcp/kcp.go:9.1710.2311
kcp/kcp/kcp.go:11.1812.2110
kcp/kcp/kcp.go:13.19,14.2210
文件名:起始行.起始列,结束行.结束列该基本块中的语句数量该基本块被执行到的次数
ECUG Meetup第3期
ECUG
X ( VIPTEST
6. ECUG
Golang覆盖率
Meetup
集测覆盖率
·第3期。
测试手段与被测程序分离
How?
ECUG Meetup 第3期
(. VIPTEST
7. ECUG
Golang 覆盖率
Meetup
传统集测覆盖率收集方案
·第3期。
gotest 中有一个-C的fag,可以将单测的代码和被单测调用的代码编译成二进制包执行
ECUG Meetup 第3期
起效优化点
(. VIPTEST
8. ECUG
Golang覆盖率
Meetup
传统集测覆盖率收集方案
·第3期。
gotest 中有一个-C的fag,可以将单测的代码和被单测调用的代码编译成二进制包执行
FUNC TESTMAINSTART(T *TESTING.T)
1.新增测试代码,调用原main 函数
varargs[lstring
fo arg := RANGE OS.ARGS 1
if!strings.Hasprefix(arg,"-test")
aRgs=aP(RgARg)
0S.ARgS=arg
main()
ECUG Meetup 第3期
起效优化与佳续度专换
ECUG
9. ECUG
Golang覆盖率
Meetup
传统集测覆盖率收集方案
·第3期。
gotest 中有一个-C的fag,可以将单测的代码和被单测调用的代码编译成二进制包执行
2.将此函数编译成二进制文件
kcpgo test
:-coverpkg="./..."-C -0
cover.test
ECUG Meetup 第3期
坚效优化与佳续质专换
: VIPTEST
10. ECUG
Golang覆盖率
Meetup
传统集测覆盖率收集方案
·第3期。
go test 中有一个-C的 fag,可以将单测的代码和被单测调用的代码编译成二进制包执行
3.运行二进制文件,指定运行的测试方法 TestMainStart,输出覆盖率文件
kcp:/cover.test-test.run"TestMainStart"
-test.coverprofile=cover.out
ECUG Meetup 第3期
最效电代化气
佳实专换
ECUC
X ( VIPTEST
11. ECUG
Golang覆盖率
Meetup
传统集测覆盖率收集方案
·第3期。
调用 main
开始
initO
TestMainStart(t *testing.T)
main
输出覆盖率报告
结束
main 函数结束
最效电代化气
ECUG Meetup 第3期
最佳实践专场
ECUG
X ( VIPTEST
12. ECUG
Golang 覆盖率
Meetup
传统集测覆盖率收集方案
·第3期。
缺点:
1.项目里必须新增一个测试代码文件
2,改变了程序启动方式
3.被测程序必须退出才能获取覆盖率报告
4.覆盖率报告存储在远端
5.对分布式应用不友好
ECUG Meetup第3期
飞效术在与
晨佳实践专场
(. VIPTEST
13. ECUG
Meetup
·第3期。
02
新工具
ECUG Meetup 第3期
(. VIPTEST
14. 新工具 g0c
ECUG
Meetup
·第3期。
https://github.com/qiniu/goc
ECUG Meetup 第3期
(. VIPTEST
15. 新工具 g0c
ECUG
Meetup
·第3期。
项目甲必架
测试代码文件
ECUG Meetup 第3期
(. VIPTEST
16. goc
git:(V2
CUG
新工
goc
git:(V2)
X
git:(v2) x go build -o main .
NUC
gon
leetup
·第3期
ECUG Meet
GST X
17. 新工具 g0c
ECUG
MeetuP
·第3期。
改变程序动方式
kcp:/cover.test-test.run "TestMainStart"-test.coverprofile=cover.out
VS
kcp
./kcp
ECUG Meetup第3期
军效率优化与质佳实践专场
Q.VIPTEST
18. 新工具 g0c
ECUG
Meetup
·第3期。
金获取覆盖率报告
ECUG Meetup 第3期
(. VIPTEST
19. simple-go-server
git:(master)
simple-go-server
git:(master)
simple-go-server
git(master)
sim
NUC
ple-go-server
http:2021/11/2821:56:48_Simple
go
S6
rver
http:
2021/11/2821:56:48Version:
http:
2021/11/28 21:56:48 GitTag:
http:
2021/11/28 21:56:48GitCommit:
http:2021/11/2821:56:48GitTreestate
http:2021/11/2821:56:48Serverisst
arting..
http:2021/11/28 21:56:48 Server
is re
ady to handle requests at:5000
2021/11/2821:56:48[goc]rinfol
rpc co
nnected to goc server
http:2021/11/28 21:57:20 163810784047
8447619GET/127.0.0.1:56168cur1/7.6
8.0
ECUG门
20. 新工具 g0c
ECUG
Meetup
·第3期。
对分布式这上
ECUG Meetup 第3期
起效化身
(. VIPTEST
21. test
G
NUC
NUC
test (ss
test L
NUC
ECU
了七牛会
22. ECUG
Meetup
·第3期。
03
原理
ECUG Meetup 第3期
(. VIPTEST
23. ECLG
Meetup
·第3期。
覆盖率技术剖析
语句覆盖率,在测试时运行被测程序后,程序中
被执行到的可执行语句的比率
ECUG Meetup 第3期
最效电优化与佳实哦专
(. VIPTEST
24. ECUG
覆盖率技术剖析
Meetup
Coverage.py
·第3期。
Python基于行的统计
sys.settrace(tracefunc)
基于解释器提供的能力,每执行一行调用一次tracefunc 函数,便可统计覆盖率
ECUG Meetup第3期
起效优化点
ECUR
: VIPTEST
25. ECUG
覆盖率技术剖析
Meetup
gcov
·第3期。
x=0;
BB1
x=0
c/c++ 基于块的源码插桩-gCov
do
arc
BB2
y=f(x,y);
y=f(x,y)
BB:基本块
X=X+1;
X=x+1
arc
ARC:从一个BB到另一个BB叫跳转
jwhile(x<y)
x>=y
arc
对ARC部分插桩,计算ARC的执行次数
printfC)
printfy)
BB3
ECUG Meetup 第3期
采效率优化气
收佳实专换
QVIPTEST
七牛元
26. ECUG
覆盖率技术剖析
Meetup
Orglng
Jacoco on-the-fly
·第3期。
INVOKE A0
INVOKE A0
INVOKE CONDO)
INVOKE condo
PUBLIC STATIC VOID EXAMPLE ()
2.
AO):
3
IF (CONDO) T
4.
BO:
NVOKEI
15
INVOKE b0
1 ELSE T
6
CO:
7.
8.
DO:
GOTO
9.
ECUG Meetup 第3期
X VIPTEST
27. ECUG
覆盖率技术剖析
Meetup
Golang
一第3期。
go test-cover 剖析
FUNC MAIN()
A :=0
3
IF A == 0
4
FMT.PRINTIN("HELLO 1")
5
1 ELSE T
6
FMT.PRINTIN("HELLO 2")
X
ECUG Meetup 第3期
ECUG
X VIPTEST :
28. ECUG
覆盖率技术剖析
Meetup
Golang
·第3期。
go test-cover 剖析
FUNC MAIN()
A I= 0
If A
fMt.PRINTIN("HELLO
1
else
fmt.PRINTIN("HELLo
2″
ECUG Meetup 第3期
最佳实践专场
ECUG
X ( VIPTEST
29. ECUG
覆盖率技术剖析
Meetup
Golang
一第3期。
gotest-cover剖析
FUNC MAIN() (GOCOVER.COUNTI0L++:
2
a := 0
插入计数器
3
IF A == 0 IGOCOVER.COUNT[1L++:
4
FMT.PRINTIN("HELLO 1")
5
T ELSET GOCOVER.COUNT[2L++:0
6
FMT.PRINTIN("HELLO 2")
8
ECUG Meetup 第3期
最佳实践专场
起效化身
X VIPTEST >
ECUG
30. ECUG
覆盖率技术剖析
Meetup
Golang
·第3期。
var
structt
COUNT
[3Juint32
POS
[3 * 3]uint32
NumStmt
[3juint16
gotest-cover剖析
POS: [3 * 3]UINT320
定义计数器
XC // [0]
8
7.9. 0X3000C // [1]
9
// [21
10
NUMSTMT: [3UINT160
12
2,//0
1,//1
1,//2
16
ECUG Meetup 第3期
起效优化与佳实度专换
X @ VIPTEST
31. ECUG
Meetup
·第3期。
goc 如何解决痛点
ECUG Meetup 第 3期
(. VIPTEST
32. ECUG
g0c 如何解决痛点
Meetup
·第3期。
项目甲必架
测试代码文件
改变
go build
goc build
go install
goc install
go run
gocrun
ECUG Meetup 第 3期
最效电代化
佳实践专场
(. VIPTEST
33. ECUG
g0c 如何解决痛点
Meetup
·第3期。
判断工程类型
GOPATH
Go module
复制所有GOPATH
复制整个工程到临
依赖到临时目录
时目录
ast/parser 注入计数器
注入计数器变量定义
调用 go build/install/run
原生命令
ECUG Meetup 第 3期
促效电优化气
ECUG
X ( VIPTEST
34. ECUG
g0c 如何解决痛点
Meetup
·第3期。
或获取覆盖率报
注入变量定义
ast/parser 插桩
给每一个main 包注入 HTTPAPI
ECUG Meetup 第3期
(. VIPTEST
35. ECUG
g0c 如何解决痛点
Meetup
一第3期。
GoCover
STRUCT T
[3]uint32
POS
[3 * 3]uint32
NumStmt
[3juint16
http://agent ip/v1/cover/coverage
POS: [3 * 3LUINT320
C // TO]
9. 0X3000C // [1]
// [21
11
NUMSTMT: [3luint16f
2.//0
正
1,//1
14
1,//2
15
16
ECUG Meetup 第3期
起效优化与佳实度专换
ECUG
X ( VIPTEST )
36. ECUG
g0c 如何解决痛点
Meetup
·第3期。
在远!
GET /v1/cover/coverage
插桩后的服务
cmd: goc profile
ECUG Meetup 第3期
(. VIPTEST
37. ECUG
goc 如何解决痛点
Meetup
·第3期。
对分布式一
插桩后的服务1
注册
cmd: goc server
GET http://goc server/vl/cover/register
1./
服务名
2. ip:port
ECUG Meetup 第3期
(. VIPTEST
38. ECUG
g0c 如何解决痛点
Meetup
·第3期。
插桩后的服务1
注册
插桩后的服务2
cmd: goc server
插桩后的服务3
插桩后的服务4
ECUG Meetup 第3期
X ( VIPTEST
39. ECUG
g0c 如何解决痛点
Meetup
·第3期。
插桩后的服务1
代理
拉取
插桩后的服务2
cmd: goc server
插桩后的服务3
请求、合并
插桩后的服务4
cmd: goc profile
ECUG Meetup 第3期
聚效电优化点
X ( VIPTEST
40. ECUG
goc 如何解决痛点
Meetup
·第3期。
对分布式应用不友好-遗留问题云原生应用不友好
1. Docker
2.Kubernetes
必须预先开启端口
3.防火墙
ECUG Meetup 第3期
聚效电优化与佳实度专推
VIPTEST
41. ECUG
g0c 如何解决痛点
Meetup
一第3期。
对云原生应用不友好-gocvl遗留问题
插桩后的服务1
插桩后的服务2
cmd: goc server
拉取
插桩后的服务3
请求、合并
插桩后的服务4
cmd: goc profile
NAT
ECUG Meetup 第3期
聚效率优化点
ECUG
X ( VIPTEST
42. ECUG
Meetup
·第3期。
goc v2
ECUG Meetup 第 3期
(. VIPTEST
43. ECUG
goc v2 如何解决痛点
Meetup
·第3期。
插桩后的服务1
websocket 连接
注册
cmd: goc server
GET ws://server/v2/internal/ws/rpcstream
1./
服务名
2. ip:port
ECUG Meetup 第3期
(. VIPTEST
44. ECUG
goc v2 如何解决痛点
Meetup
·第3期。
插桩后的服务1
ws长连接
cmd: goc server
ECUG Meetup 第3期
(. VIPTEST
45. ECUG
goc v2 如何解决痛点
Meetup
一第3期。
插桩后的服务1
ws长连接
插桩后的服务2
cmd: goc server
插桩后的服务3
插桩后的服务4
ECUG Meetup 第3期
X ( VIPTEST
46. ECUG
g0c v2如何解决痛点
Meetup
·第3期。
应用不友好
插桩后的服务1
ws 长连接
插桩后的服务2
cmd: goc server
插桩后的服务3
插桩后的服务4
docker/k8s 无需做端口配置
NAT
ECUG Meetup 第3期
聚效电优化与最佳实践专场
XVIPTEST
47. ECUG
Meetup
·第3期。
04
扩展
ECUG Meetup 第3期
(. VIPTEST
48. ECUG
扩展
Meetup
·第3期。
集成进已有系统,展示PR/MR增量覆盖率
COVERALLS
sonarQube
Codecov
ECUG Meetup 第3期
婴效率优化与最佳实践专场
ECUC
VIPTEST
49. ECUG
扩展
Meetup
·第3期。
实时覆盖率实现精准测试
1.cmd:goc profile 轮询获取全量覆盖率
2.cmd:goc watch 实时推送增量覆盖率(goc V2)
ECUG Meetup 第3期
起效化点
(. VIPTEST
50. goc
git:(V2)
CUG
goc
gIT:(V2)
NUC
8 func main(){
goc
gIT:(V2)
eetup
i:=1
9
:git:(V2)
goc
NUC
第3期。
10
for f
17
time.Sleep(2 * time.Second)
ifi%2==11
itt
11
fmt.Println("hello,world")
f else t
itt
17
fmt.Println("hello,earth")
18
19
14,2
Bot
-/KCP2 (SSH)
hello,earth
hello,
world
hello,
earth
NUC
hello,
world
hello,
earth
hello,
world
hello,
earth
hello,
world
hello,
earth
hello,
world
hello,
earth
hello,
world
hello.earth
hello,world
hello,earth
ECUG Meel
TX
51. ECUG
扩展
Meetup
·第3期。
实时覆盖率实现精准测试
vscode demo 实时显示覆盖率-基于 cmd:goc profile 轮询
ECUG Meetup 第3期
起效化点
(. VIPTEST
52. Gomain.go
ECUG
Gomain.go>?main
Meetup
FUNC MAIN() T
·第3期。
R := GIN.DEFAULT()
R.GET("/i"func(c *gin.Context)
10
C.JSON(200,gin.Ht
83
"message":"pong1",
12
13
o
14
FUNC(C *GIN.CONTEXT)
15
NAME:= C.QUERY("NAME")
La
16
if name =="A"
C.JSON(200,gin.Hf
8122
"message":"pong2a",
Telse ifname ==""
C.JSON(200,gin.Ht
22
"message":"pong2 b”,
18232
T ELSE T
C.JSON(200,gin.Ht
"message":"pong2 c",
28
29
PROBLEMS
OUTPUT
TERMINAL
DEBUG CONSOLE
2:ZSh
Liyiyang@work
http://127
1:8080/01n927name
[16:05:51]
ECUG Meetup
MPTEST X
53. ECUG
扩展
Meetup
·第3期。
goc server 有丰富的接口
vI接口
功能
√口
功能
获取覆盖率
GET /v1/cover/profile
GET /v2/cover/profile
获取覆盖率
POST /v1/cover/clear
重置覆盖率
DELETE/v2/cover/profile
重置覆盖率
获取服务列表
GET /v2/agents
GET /v1/cover/list
获取服务列表
(仅服务名、ip)
(服务名、ip、服务在线状态)
删除服务
DELETE /v2/agents
POST /vl/cover/remove
删除服务
ws://xxx/v2/cover/ws/watch
实时推送覆盖率
ECUG Meetup 第3期
坚效优化与佳续质专换
ECUG
X ( VIPTEST )
54. Q&A
ECUG Meetup 第 3期
(. VIPTEST
55. 谢谢
ECUG Meetup 第 3期
(. VIPTEST