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%"'

点击查看本次和上次的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

三、优化后效果

原文地址:https://www.cnblogs.com/ailiailan/p/13405313.html