一、背景

在之前的博客 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. Lambert cos 定律再积分无穷级数求和

    设有能量为 \(I\) 的一束光射向表面 \(s\),发生理想的漫反射.设反射率为 \(a\),则 \(s\) 向在 \(\phi\) 方向反射的能量 \(R\) 可由 Lambert cos 定律给 ...

  2. 在NextChat中接入SiliconCloud API 体验不同的开源先进大语言模型

    NextChat介绍 One-Click to get a well-designed cross-platform ChatGPT web UI, with GPT3, GPT4 & Gem ...

  3. stm32学习之ADC入门

    ADC_SampleTime 用途:在ADC通道配置(ADC_RegularChannelConfig)需要传输的参数. 含义:指两个采样阶段之间的延迟周期数,该参数会影响ADC在采样过程中的性能和准 ...

  4. 我的 PowerShell 配置

    安装 Scoop: Scoop 是 Windows 上的包管理器 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUse ...

  5. vscode新建html文件并快速生成标准的html代码

    1.打开vscode,点击Open Folder 2.选择目标文件夹,新建一个扩展名为.html的文件: 3.在第一行输入 !(英文状态下),按tab键,新建成功.界面如下图所示:

  6. 【YashanDB知识库】存储过程报错snapshot too old

    问题描述 20231127上午客户反馈绩效系统20231125.20231126出现2次YAS-02020 snapshot too old的问题,测试也有类似问题. 该过程是客户新增的存储过程,目的 ...

  7. pyspark 数据类型及转换

    spark 有哪些数据类型 https://spark.apache.org/docs/latest/sql-reference.html Spark 数据类型 Data Types Spark SQ ...

  8. JavaScript – Function 函数

    参考 阮一峰 – 函数的扩展 基本用法 function fn1(param1, param2 = 'default value') { return 'return value'; } fn1('1 ...

  9. EF Core – Unit of Work, DbContext, Transaction 概念解释

    前言 踩了一个坑, 下面是 2 个 scope 的调用, 第 1 和 3 是一个 Audit log filter action, 第 2 个是 controller. // open tran // ...

  10. 解密Prompt系列38.多Agent路由策略

    常见的多智能体框架有几类,有智能体相互沟通配合一起完成任务的例如ChatDev,CAMEL等协作模式, 还有就是一个智能体负责一类任务,通过选择最合适的智能体来完成任务的路由模式,当然还有一些多智能体 ...