一、背景
上篇分享了如何在服务器中部署docker+jenkins+python+allure+nginx,在这些环境准备好后,本篇继续分享如何使用jenkins实现日常构建接口自动化测试,并将测试简报发送到飞书通知
二、jenkins任务的创建及执行
2.1 新建jenkins任务
添加Git仓库信息后,每次构建任务都会先从仓库拉取所配置的最新分支代码来执行
使用浏览器打开jenkins页面并登录
复制代码仓库链接
添加Git仓库的账号密码或者其它验证方式
配置任务时若找不到Git选项,或Git选项无法正常使用,可前往系统管理-插件管理更新或安装Git插件
选择所保存的账密,Repository URL下方的红字消失,表示验证通过
默认master分支
添加构建步骤-执行shell
命令python3 run.py会在jenkins容器中的工程目录下执行
可以加一个pwd验证一下执行命令的路径
最后保存配置!
2.2 构建任务
此处贴一下我的run.py文件中的运行命令
先执行pytest框架的接口自动化脚本
然后执行allure命令读取report/tmp下的测试数据,生成html测试报告保存到report/html目录下
上文的执行shell可根据你的run.py所执行的命令具体调整
点击立即构建验证配置
静待任务执行完成,进入到刚刚的构建记录,点击控制台输出,可以看到控制台日志以及pwd命令输出的当前执行路径
2.3 修改nginx配置
使用jenkins-allure插件生成的报告,在访问时需要登录jenkins账号,nginx代理的不需要登录
在构建jenkins任务时使用pwd已经看到了项目根目录路径,run.py文件中我将生成的html测试报告存在report/html,将两者拼接到一起,就是我的html测试报告所在的路径(其中/apitest是jenkins任务名,如果你jenkins容器的启动命令及生成测试报告的路径和我一样,那下面这个路径也是一样的)
/var/jenkins_home/workspace/apitest/report/html
修改nginx配置文件
vim /usr/local/src/nginx/conf/nginx.conf
listen的端口号在上篇时已经修改过了,现在只需要修改查找html文件的根目录
将默认的html替换为测试报告所在的路径,并保存
2.4 重载nginx配置
# nginx运行中时使用,重新加载nginx配置文件
nginx -s reload
再次使用浏览器访问<服务器ip:nginx端口号>,请求到的就是allure测试报告
2.5 修改时区
jenkins默认使用的是格林尼治时间,与北京时间有8个小时时差,因此在做定时构建前需要先修改时区
这里介绍一个比较简单,不需要修改配置文件的方法
时区的修改分为两个,一个是用户时区,一个是定时构建时区(配置定时构建时一并进行)
这里就是用户时区,现在显示的是格林尼治时间,比北京时间快8小时
进入系统管理
点击管理用户
选择修改当前登录的用户
在最下方找到time zone,将其修改为上海Asia/Shanghai,并保存
完成修改用户时区后,界面看到的时间已经更新为了国内的北京时间
2.6 jenkins定时构建
进入任务,修改配置
Git信息在上篇已经配置过了
先使用TZ=Asia/Shanghai定义构建使用的是国内时区(如果修改过jenkins配置文件的时区,这里就不用定义了)
0 10 * * * 代表着每天10:00执行一次
第一位的0是分钟,例:5 * * * * 代表每5分钟执行一次
第二位的10是小时,第三位的*是一个月的第几天,第四位的*是一年中的第几月,第五位的*是一周中的第几天,具体根据你的需求来设置
执行的shell中我增加了每次运行前先删除测试结果数据的文件夹,保证测试结果都是最新的
生成allure报告的命令allure generate report/tmp -o report/html --clean中,--clean清除的是输出报告路径report/html
保存以上配置,我们的接口自动化测试脚本就会在每天的10点执行,allure测试报告也会保持最新的测试结果
三、测试结果通知
3.1 效果预览
有这样一个测试结果简报,我们可以及时知道自动化测试执行了没有,通过率如何,如果全通过且耗时正常就不需要查看详细的allure报告
3.2 飞书配置
参考飞书官方文档:开发文档 - 飞书开放平台
首先得有一个飞书群,可以新建一个单人群作调试用
在飞书群的右上角···点开设置,添加群机器人
webhook地址需要保存下来,我这里开启了签名校验
这样我们就成功在群里添加了通知机器人,并获得了webhook地址
测试通知请阅读上方的飞书开发者文档,不再赘述
3.3 webhook代码
jenkins有webhook插件,但不易自定义消息内容,要想实现测试结果简报的内容,我们可以使用python自定义推送的内容
其中有一个ENVIRONMENT是从配置文件传递过来,其它的将密钥、webhook地址、allure报告地址更换一下即可使用
直接贴上webhook.py内容
# -*- coding: utf-8 -*-
import requests, time, datetime
import hashlib
import base64
import hmac
from config.setting import ENVIRONMENT
secret = "xxxxxxxxxxxxxxxxxxxx" # 飞书机器人密钥
url = "https://open.feishu.cn/open-apis/bot/v2/xxxxxxxxxxxxxxxxxx" # 飞书webhook地址
server_url = "http://120.xx.xx.xxx:9091" # allure地址,即服务器ip:nginx端口号
def buildresult():
'''
获取构建结果的概要数据,以发送简略报告文本到飞书
'''
report_hearder = {"Accept": "application/json, text/javascript, */*; q=0.01"}
test_res = requests.get(server_url + "/widgets/summary.json", headers=report_hearder) # 获取用例执行情况
total = test_res.json()['statistic']['total'] # 执行用例总数
passed = test_res.json()['statistic']['passed'] # 通过数
skipped = test_res.json()['statistic']['skipped'] # 跳过数
failed = test_res.json()['statistic']['failed'] + test_res.json()['statistic']['broken'] # 失败数,我将失败和故障的均算在了失败数
try:
passed_rate = f'{round(passed / total * 100)}%' #通过率
exetime_0 = round((test_res.json()['time']['duration'] / 1000), 2) # 执行时长
exetime = f'{exetime_0}秒'
except:
passed_rate = exetime = '执行失败啦!!!快检查下!!!'
return total, passed, skipped, failed, passed_rate, exetime
def gen_sign(timestamp, secret):
'''
签名校验,若飞书机器人未开启签名校验,则可忽略这一步
'''
# 拼接timestamp和secret
string_to_sign = '{}\n{}'.format(timestamp, secret)
hmac_code = hmac.new(string_to_sign.encode("utf-8"), digestmod=hashlib.sha256).digest()
# 对结果进行base64处理
sign = base64.b64encode(hmac_code).decode('utf-8')
return sign
def feishu_webhook():
timestamp = int(time.time())
print(timestamp)
sign = gen_sign(timestamp, secret)
print(sign)
total, passed, skipped, failed, passed_rate, exetime = buildresult()
header = {"Content-Type": "application/json"}
data = {
"timestamp": timestamp,
"sign": sign,
"msg_type": "post",
"content": {
"post": {
"zh_cn": {
"title": f"接口自动化测试执行完成",
"content": [
[{
"tag": "text",
"text": "简略测试报告 \n"
f"- 执行环境:{ENVIRONMENT} \n"
f"- 通过率:{passed_rate} \n"
f"- 测试用例总数:{total} \n"
f"- 通过数:{passed} \n"
f"- 失败数:{failed} \n"
f"- 总耗时:{exetime} \n"
f"- Allure测试报告:"
},
{
"tag": "a",
"text": "查看详细测试报告",
"href": f"{server_url}"
}
]
]
}
}
}
}
res = requests.post(url=url, headers=header, json=data)
print(res.json())
if __name__ == '__main__':
feishu_webhook()
然后在run文件中输出测试报告后加上webhook.py的运行命令,即可实现报告生成后自动发送报告到飞书
现在,将代码推到远程仓库,立即构建jenkins任务试试吧,有问题欢迎评论区留言
四、总结
至此,jenkins会在设置好的时间点,自动拉取Git仓库中最新的代码分支,构建执行自动化脚本,测试完成之后发送测试报告到飞书群这一工作流程。
欢迎评论区指正与讨论!