一、背景

在之前的博客 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

三、优化后效果

awk优化钉钉通知测试报告的更多相关文章

  1. [钉钉通知系列]Jenkins发布后自动通知

    一.前言 最近使用Jenkins进行自动化部署,但是发布署后,并没有相应的通知,虽然有邮件发送通知,但是发现邮件会受限于大家接受的设置,导致不能及时看到相关的发布内容.由于之前有用Gitlab推送消息 ...

  2. 重新拾取:TFS2017钉钉机器人源代码签入通知

    http://www.cnblogs.com/79039535/p/9316791.html 现在很多公司办公都使用钉钉打卡签到,于是鉴于公司也使用钉钉就打算用钉钉来做一个源代码签入通知. 首先先去打 ...

  3. 基于C#的钉钉SDK开发(1)--对官方SDK的重构优化

    在前段时间,接触一个很喜欢钉钉并且已在内部场景广泛使用钉钉进行工厂内部管理的客户,如钉钉考勤.日常审批.钉钉投影.钉钉门禁等等方面,才体会到原来钉钉已经已经在企业上可以用的很广泛的,因此回过头来学习研 ...

  4. jenkins 集成钉钉机器人通知

    公司使用钉钉做为公司内部的通讯工具,所以想通过Jenkins发布完成以后通过钉钉来通知大家,研究发现钉钉提供机器人,所以我把机器人集成进来通知相关人员. 1.创建通知人群组,添加机器人(钉钉默认自带了 ...

  5. jenkins 构建后发送钉钉消息通知(插件)

    钉钉,越来越多的公司采用,那么我们在持续集成中,也可以直接选择钉钉插件的,在之前的博客中 ,对发送的钉钉消息进行了定制,那样的话会开启一个新的任务, 其实今天呢,我们可以直接安装一个插件就可以发送了, ...

  6. Jenkins发布后自动通知【钉钉】

    阅读目录 一.前言 二.使用钉钉推送的优势 三.配置 一.前言 最近使用Jenkins进行自动化部署,但是发布署后,并没有相应的通知,虽然有邮件发送通知,但是发现邮件会受限于大家接受的设置,导致不能及 ...

  7. jenkis +sonarqube 对后端代码静态扫描,钉钉群通知执行结果(记录)

    代码提交,触发后端sonar测试,测试完成,jenkins触发依赖任务,执行python脚本,达到预期,调用上线任务模块,进行上线,达不到预期,钉钉群通知. 牵涉到配置: 1.配置sonar测试任务 ...

  8. 钉钉机器人-实现监控通知功能-python

    1. 首先得创建有 一个 钉钉群.(因为只能发群通知) 2. 添加机器人,得到一个url: 3. 开始写Python脚本: # -*- coding: utf-8 -*- ""&q ...

  9. [转] 钉钉的H5性能优化方案

    对于一个H5的产品,功能无疑很重要,但是性能同样是用户体验中不可或缺的一环.原本H5的渲染性能就不及native的app,如果不把性能优化做起来,将极大地影响用户使用产品的积极性. 用户感受 当用户能 ...

  10. 基础架构之日志管理平台及钉钉&邮件告警通知

    接上一篇,我们继续解释如何把ELK跟钉钉及发送邮件功能结合起来,让我们及时的了解重要日志并快速反馈. Sentinel 安装,项目介绍在https://github.com/sirensolution ...

随机推荐

  1. vue-表单与v-model

    使用 v-model 后,表羊控件显示的值只依赖所绑定的数据,不再关心初始化时的 value 属性,对于 textarea></textarea> 之间插入的值,也不会生效. 使用 ...

  2. .NET静态代码编织——肉夹馍(Rougamo)4.0

    肉夹馍(https://github.com/inversionhourglass/Rougamo),一款编译时AOP组件.相比动态代理AOP需要在应用启动时进行初始化,编译时完成代码编织的肉夹馍减少 ...

  3. 代码随想录Day12

    二叉树遍历 分为前序.中序.后续.层序四种 其中前中后序属于深度优先搜索,层序属于广度优先搜索 前序遍历顺序: 根节点->左子树->右子树 中序遍历顺序: 左子树->根节点-> ...

  4. 04-canvas多根线条

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  5. Kubernetes-3:使用kubeadm部署k8s环境及常见报错解决方法

    k8s集群安装 环境说明: k8s-Master-Centos8 ip:192.168.152.53 k8s-Node1-Centos7 ip:192.168.152.253 k8s-Node2-Ce ...

  6. 如何调用openai的TTS模型

    这是24年1月份写的了,调用代码大概率有变动,仅供参考. 1 什么是OpenAI的TTS模型 OpenAI的TTS模型是一种文本到语音(Text-to-Speech)模型,它可以将给定的文本转换为自然 ...

  7. Effective C++——Item33: 避免隐藏继承的名字

    Effective C++--Item33: 避免隐藏继承的名字 一.从原理理解隐藏 从变量作用域看隐藏 全局变量x和局部变量x的类型是不同的,但C++的隐藏规则:只隐藏名字(hiding names ...

  8. Servlet——idea创建Servlet模板

    idea创建Servlet模板   以前新建一个Servlet是通过新建一个Class文件   可以直接新建一个idea内的Servlet模板                    可以通过设置 更改 ...

  9. 生理性喜欢(把我吃掉&病态饥饿)

    alloverzyt 转载好文章 https://www.zhihu.com/question/627599874/answer/3494578704 什么是生理性喜欢? 是吃掉. 这不是什么夸张的写 ...

  10. 《Vue.js 设计与实现》读书笔记 - 第5章、非原始值的响应式方案

    第5章.非原始值的响应式方案 5.1 理解 Proxy 和 Reflect Proxy Proxy 只能代理对象,不能代理非对象原始值,比如字符串. Proxy 会拦截对对象的基本语义,并重新定义对象 ...