从零打造属于自己的CI/CD Jenkins+Apifox (二)
最近在使用一款接口管理工具Apifox,该工具提供了CLI命令工具,它想通过结合持续集成工具Jenkins及Apifox提供的CLI命令对测试用例进行自动化测试。
前面章节讲解
这章节讲解 邮件内如何展示报告附件
号外、号外
邮件模版更新啦!好看的邮件模版总能让开发人员眼前一亮,建议使用以下模版。
1、报告模版如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
offset="0">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
本邮件由系统自动发出,无需回复!<br/>
各位同事,大家好,以下是${PROJECT_NAME }项目构建信息</br>
<td><font color="#CC0000">构建结果 - ${BUILD_STATUS}</font></td>
</tr>
<tr>
<td><br />
<b><font color="#0B610B">构建信息</font></b>
<hr size="2" width="100%" align="center" /></td>
</tr>
<tr>
<td>
<ul>
<li>项目名称: ${PROJECT_NAME}</li>
<li>构建编号: 第${BUILD_NUMBER}次构建</li>
<li>触发原因: ${CAUSE}</li>
<li>构建状态: ${BUILD_STATUS}</li>
<li>构建日期: ${BUILD_TIMESTAMP}</li>
<li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
<li>测试报告: <a href="${PROJECT_URL}apifox-reports">${PROJECT_URL}apifox-reports</a></li>
</ul>
<tr>
<td><br />
<b><font color="#0B610B">用例执行结果:</font></b>
<hr size="2" width="100%" align="center" /></td>
</tr>
<tr>
<td>
<ul>
<li><font color="orange">用例结果: ${STATUS}</font></li>
</ul>
</td>
</tr>
<tr>
<td><br />
<b><font color="#0B610B">环境信息</font></b>
<hr size="2" width="100%" align="center" /></td>
</tr>
<tr>
<td>
<ul>
<li>测试环境地址: <a href="${URL}">${URL}</a></li>
<li>测试环境账号: ${USER}</li>
<li>测试环境密码: ${PWD}</li>
</ul>
</td>
</tr>
</table>
<h3><font color="##CC0000">API测试报告详情见附件,拜~</font></h3>
</body>
</html>
2、邮件内容变量参数说明
${ENV, var="JOB_NAME"}: 当前job名;
${BUILD_NUMBER}: 当前job的第N次构建
${PROJECT_NAME}: 项目名称;
${BUILD_STATUS}: 构建状态;
${BUILD_TIMESTAMP}: 构建时间,需要添加timestamper插件
${CAUSE}: 触发原因;
${BUILD_URL}: 构建地址;
${PROJECT_URL}:报告地址;
以上变量名称是Jenkins自带的。
${STATUS}: 用例执行状态;
${URL}: 环境地址;
${USER}: 环境账号;
${PWD}: 环境密码;
以上报告模版增加了测试环境内容展示,该环境变量是自定义的变量名称,并不是Jenkins自带的;
需要在 jenkins_home 项目内创建 txt文档
比如:/Users/xxxx/data/jenkins_home/workspace/项目名称/build_status.txt
内容如下:
STATUS=Failed #用例执行结果展示
URL=http://xx.xx.xx.xx:xxxx #测试环境地址
USER=xxxxx #测试环境账号
PWD=xxxxx #测试环境密码
配置增加构建步骤
选择:注入环境变量(Injecting environment variables)
属性文件路径内填写txt文档名称即可
邮件内增加报告附件
1、配置构建后操作 选择Editable Email Notification
在Attachments输入框内配置相对路径的报告地址和报告名称
2、点击Advanced Settings在Triggers点击addTriggers选择Always
3、点击高级后,Recipient List内填写收件人邮箱地址后,点击应用保存
4、再次构建后,查看邮箱,邮件内是否收到附件
配置企业微信提醒
1、下载插件
Manage Jenkins->Plugin Manager选择Availble,输入框内填写:Qy Wechat Notification 并勾选框框,点击 install without restart 下载成功后,在installed内查看
创建企微群管理机器人,获取Webhook地址
2、配置构建后操作->选择【企业微信通知】
Webhook地址填写:机器人生成的Token
3、点击立即构建。企业微信内查看执行结果
自定义配置企业微信提醒通知
1、可以简单的在 Jenkins 中安装企业微信插件,直接配置,就可以直接通知
2、为了实际的需求可能要通知部分人或者通知内容要更改,这个时候我们可以自己手写一个python脚本文件,根据需求放在 Build 前后执行就OK了。
创建 Python 脚本如下
import requests
import json
import urllib3
import sys
import re
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
class InformRobot:
def __init__(self):
self.sess = requests.session()
self.test_case_passing_rate = ""
self.test_case_fail_rate = ""
self.avg_api_response_rate = ""
self.test_case_untested_rate = ""
self.test_case_quantity_rate = ""
def markdown_robot(
self, webhook_url, report_url, principal, job_name,test_environment, STATUS
):
"""
实现企业微信通知
:param webhook_url: 企业微信token
:param report_url: 报告地址
:param principal: 负责人名称
:param job_name: 项目名称
:param test_environment:环境名称
:return:
"""
data = {
"msgtype": "markdown", # 消息类型,此时固定为markdown
"markdown": {
"content": f"### 提醒! <font color=\"info\"> {job_name} </font> 接口自动化测试反馈 \n "
f">项目名称:{test_environment} \n" +
f">测试用例结果:<font color=\"info\"> {STATUS} </font> \n" +
f">测试用例总数:<font color=\"info\"> {self.test_case_quantity_rate} </font> \n" +
f">平均接口请求耗时:<font color=\"info\"> {self.avg_api_response_rate} </font> \n" +
f">测试用例通过率:<font color=\"info\"> {self.test_case_passing_rate} </font> \n" +
f">测试用例失败率:<font color=\"#FF0000\"> {self.test_case_fail_rate} </font> \n" +
f">测试用例未测率:<font color=\"#FFCC33\"> {self.test_case_untested_rate} </font> \n" +
f">测试报告链接:[点击查看报告详情]({report_url}) \n" +
f">测试负责人:{principal}"
}
}
re_post = self.sess.post(webhook_url, data=json.dumps(data), verify=False)
print(re_post.content, data)
return re_post
def result_pass_rate(self, html_path):
with open(html_path, "r", encoding="utf-8") as f:
report = f.read()
pass_rate = re.search('<div class="col-md-4 text-label">通过率</div>\n\ +<div class="col-md-8">(.*?)</div>',
report)
fail_rate = re.search('<div class="col-md-4 text-label">失败率</div>\n\ +<div class="col-md-8">(.*?)</div>',
report)
avg_api_response_time = re.search('<div class="col-md-4 text-label">平均接口请求耗时</div>\n\ +<div class="col-md-8">(.*?)</div>',
report)
case_untested_rate = re.search('<div class="col-md-4 text-label">未测率</div>\n\ +<div class="col-md-8">(.*?)</div>',report)
case_quantity_rate = re.search('<div class="col-md-4 text-label">循环数</div>\n\ +<div class="col-md-4">(.*?)</div>',report)
self.test_case_fail_rate = fail_rate.group(1) #用例失败率
self.test_case_passing_rate = pass_rate.group(1) #用例通过率
self.avg_api_response_rate = avg_api_response_time.group(1) #平均接口请求耗时
self.test_case_untested_rate = case_untested_rate.group(1) #用例未测率
self.test_case_quantity_rate = case_quantity_rate.group(1) #用例数量
if __name__ == '__main__':
webhook_url = sys.argv[1]
report_url = sys.argv[2]
principal = sys.argv[3]
job_name = sys.argv[4]
test_environment = sys.argv[5]
STATUS = sys.argv[6]
build_number = sys.argv[7]
path = "/var/jenkins_home/workspace/{}/apifox-reports/test-dsp-apifox_{}.html".format(job_name,build_number)
info_robot = InformRobot()
info_robot.result_pass_rate(path)
info_robot_res = info_robot.markdown_robot(webhook_url, report_url, principal, job_name, test_environment, STATUS)
print(info_robot_res)
info_robot.sess.close()
把 Python 脚本放到 工作空间内,比如:/Users/xxxx/data/jenkins_home/workspace/check-apifox/下面
安装 Python3 环境
因为 Jenkins 是用镜像运行的,所以需要在 Jenkins 容器内安装 Python3 环境,跟着下面步骤一一执行吧!
1、从服务器拉取可用的包到容器内
进入 Jenkins容器内,使用 docker exec -it 容器ID /bin/bash 查看当前操作系统cat /etc/issue
这里查到的是Debian系统(不是ubuntu, 也不是centos),这里yum是没有的,所以不能用yum安装了,这里用apt-get代替yum
先执行更新命令:apt-get update
出现报错,问题原因:权限不足,请使用 root 用户
解决方法如下:使用以下命令重新进入容器:docker exec -u 0 -it 容器ID /bin/bash
备注:-u 0 表示 root 权限
注意:从服务器拉取可用的包完成后,手动重启Docker、Jenkins
2、容器内部安装 Python3
1.先安装依赖
apt-get -y install gcc automake autoconf libtool make
apt-get -y install make*
apt-get -y install zlib*
apt-get -y install openssl libssl-dev
apt-get install sudo
注意:以上依赖下载过程较慢,耐心等待。。。。。。
2.下载 Python3
进入 /usr/local内
root@b8ebff36b8ed:/# cd /usr/local
执行 下载python
root@b8ebff36b8ed:/usr/local# wget https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tgz
出现 bash: wget: command not found
下载 wget
root@b8ebff36b8ed:/usr/local# sudo apt-get install wget
wget下载完成后,再次执行下载操作
root@b8ebff36b8ed:/usr/local# wget https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tgz
下载完成
root@b8ebff36b8ed:/usr/local# ls
Python-3.8.12.tgz bin etc games include lib man sbin share src
使用 命令 tar -xvf Python-3.8.12.tgz
创建 python3 文件夹
mkdir python3
切换到解压后的 Python-3.8.12 目录下
cd Python-3.8.12
3.执行如下代码安装
--prefix 选项是配置安装的路径,执行后所有资源文件放在 /usr/local/python3 的路径里。
./configure --prefix=/usr/local/python3 --enable-optimizations
make
make install
注意:以上命令执行过程时间较慢、耐心等待。。。。。
4.创建软链接
root@b8ebff36b8ed:/# ln -s /usr/local/python3/bin/python3.8 /usr/bin/python3
root@b8ebff36b8ed:/# ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
5.容器内查看Python3环境是否安装成功
Jenkins内添加环境变量和构建命令
1、勾选 將環境變量注入構建過程->属性内容
添加以下内容
webhook_url=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=6cf7bafe-56f9-48b0-xxxx-5399xxxx9c2
principal= xxx # 测试负责人
test_Project_Name=测试环境
DSP_URL=http://xx.xx.xxx.xxx:xxxxx
DSP_USER=xxxx
DSP_PWD=xxxxx
2、添加构建命令
#!/bin/bash
/usr/bin/python3 "webhook.py" ${webhook_url} http://127.0.0.1:80/${JOB_NAME}_${BUILD_NUMBER}.html ${principal} ${JOB_NAME} ${test_Project_Name} ${STATUS} ${BUILD_NUMBER}
注意:请按照该顺序添加环境变量,否则会执行失败。
命令添加完成后,点击执行构建。
出现原因:Jenkins 内虽然安装了Python环境,但是未下载 Python 需要用的模块。
解决方法: Jenkins容器内下载 相关模块。
root@b8ebff36b8ed: pip3 install requests
Collecting requests
Downloading requests-2.28.1-py3-none-any.whl (62 kB)
|████████████████████████████████| 62 kB 378 kB/s
Collecting idna<4,>=2.5
Downloading idna-3.4-py3-none-any.whl (61 kB)
|████████████████████████████████| 61 kB 64 kB/s
Collecting charset-normalizer<3,>=2
Downloading charset_normalizer-2.1.1-py3-none-any.whl (39 kB)
Collecting urllib3<1.27,>=1.21.1
Downloading urllib3-1.26.12-py2.py3-none-any.whl (140 kB)
|████████████████████████████████| 140 kB 296 kB/s
Collecting certifi>=2017.4.17
Downloading certifi-2022.9.24-py3-none-any.whl (161 kB)
|████████████████████████████████| 161 kB 165 kB/s
Installing collected packages: urllib3, idna, charset-normalizer, certifi, requests
Successfully installed certifi-2022.9.24 charset-normalizer-2.1.1 idna-3.4 requests-2.28.1 urllib3-1.26.12
WARNING: Running pip as root will break packages and permissions. You should install packages reliably by using venv: https://pip.pypa.io/warnings/venv
WARNING: You are using pip version 21.1.1; however, version 22.3.1 is available.
You should consider upgrading via the '/usr/local/python3/bin/python3.8 -m pip install --upgrade pip' command.
3、模版下载完成后,再次点击 立即执行构建
4、 企业微信内查看提醒通知
更多推荐
所有评论(0)