Awk优化钉钉通知测试报告
一、背景
在之前的博客 Go服务自动触发单元测试覆盖率 中钉钉通知的效果实现如下图:
最近RD提出对本次和上次覆盖率的比对需求,并把比对结果也显示在钉钉通知上。
二、实现思路
要实现数据比对,就需要对上次的数据进行存储,那该怎么存储呢?
1、存储到MySQL
2、以文件的形式存储到slave机器上,然后再读取文件获得上次的数据
因为就只是一个数据而已,所以就不劳烦MySQL了,确定选择方法2。
go test命令输出的原始数据格式:
localhost:z_data aaa$ cat this_yuanshi.txt ok k-p/dashboard/api 0.014s coverage: 85.7% of statements FAIL k-p/dashboard/auth [build failed] ok k-p/dashboard/auth/api 0.013s coverage: 53.8% of statements ok k-p/dashboard/auth/jwe 3.527s coverage: 61.0% of statements ok k-p/dashboard/cert/ecdsa 0.014s coverage: 13.2% of statements FAIL k-p/dashboard/client [build failed] ok k-p/dashboard/client/api 0.318s coverage: 16.7% of statements ok k-p/dashboard/client/csrf 0.020s coverage: 88.2% of statements 2020-07-22T15:39:57.371+0800 DEBUG logger/logger.go:53 logger init ok --- FAIL: TestInit (0.00s) panic: open /workspace/code/xes/k-p/cicd/conf/conf.json: no such file or directory [recovered] panic: open /workspace/code/xes/k-p/cicd/conf/conf.json: no such file or directory goroutine 7 [running]:
覆盖率取coverage后百分比的平均数,前提是本行记录以“ok”开头。
目标有了,那怎么拿到覆盖率?分两步走:
第一步:把符合以“ok”开头的行写入一个新txt文件,如:guolv.txt
find this_yuanshi.txt | xargs cat | grep ^ok > guolv.txt
第二步:求guolv.txt中每行coverage后百分比的平均数
this_num=$(awk 'BEGIN{count=0}{count+=$5}END{printf("%.1f%%",count/NR)}' guolv.txt)
有了数据,接下来就是 发送钉钉通知 和 本次数据覆盖上次数据 两步。
完整的脚本:
#!/bin/bash source /etc/profile source /Users/aaa/.bash_profile set +x this_path="/Users/xes/CI/reports/***/z_data" git clone https://***/***/***.git k-p cd kubernetes-platform echo "生成.out文件" go test ./... -coverprofile=cover.out > $this_path/this_yuanshi.txt cd $this_path #获取本次的覆盖率 find this_yuanshi.txt | xargs cat | grep ^ok > guolv.txt this_num=$(awk 'BEGIN{count=0}{count+=$5}END{printf("%.1f%%",count/NR)}' guolv.txt) #获取上次的覆盖率,如果没有则创建文件 if [./last_num.txt] then last_num=$(cat ./last_num.txt) echo $last_num else touch ./last_num.txt fi cd - echo "生成Html报告" go tool cover -html=cover.out -o coverage.html #发送钉钉通知 cd $this_path this_time=$(cat this_num.txt) last_time=$(cat last_num.txt) now=$(echo $this_time|cut -b 1,2,3,4) last=$(echo $last_time|cut -b 1,2,3,4) change=$(echo | awk "{print $now - $last}") json='{"msgtype":"link","link":{"text":"本次:'"$this_time"' 上次:'"$last_time"' 变化:'"$change%"'\n\n点击查看本次和上次的HTML报告","title":"k-p单元测试覆盖率统计","picUrl":"https://***/***/avatar1/18b85ab1eddf66dd5be67d62489db637_s120.jpg ","messageUrl":"http://***:8080/***-platform-unitcover"}}' curl -H "Content-Type:application/json;charset=utf-8" -X POST -d "$json" https://oapi.dingtalk.com/robot/send?access_token=29d4bf78f0105e66f6d8d387bb4658ed42a6979452b6fdc7232527*** #把本次的覆盖率赋值给上次 cp ./this_num.txt ./last_num.txt
三、优化后效果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)