一些同学的公司在做接口自动化测试时,难免会要求进行持续集成以及需要将可视化报告发送到诸如钉钉工作群等地方,于是便编写下列相关教程。
jenkins 上进行持续集成以及接入钉钉
前提条件
准备好自动化脚本
持续集成
源代码管理模块
安装插件:Git plugin
获取凭证:http 拉取链接对应:登录账号密码,id 置空,描述任意
指定分支:格式为*/xxx
比如*/dev
触发器模块
定时触发:
jenkins
项目中构建触发器->Build periodically
采用五颗*占位符的方式书写。
分别为:分钟,小时,一个月中第几天,第几月,一周中第几天
常用格式:
H/30 * * * * 每30分钟构建一次
H H/2 * * * 每2个小时构建一次
0 8 * * * 每天早上8点构建一次
0,8,12,22 * * * 每天8点,12点,22点构建各一次
复制代码
推送触发:
当指定远端仓库存在推送或合并行为时,触发jenkins
构建
生成对应 git 仓库的凭证 api token
gitlab 举例:个人头像->Settings->Access Token
→ Personal Access Tokens
->编写名称,有效期以及勾选权限:api
->生成,复制token
安装插件GitLab Plugin
配置token
:Manage Jenkins
→ System
→ GitLab
然后按照要求填写gitlab
仓库地址以及获取的token
便可创建一个链接凭证
在项目中选中对应链接凭证,便可将该项目和凭证对应的远程仓库关联起来,从而捕获远程仓库的提交合并等行为。
然后就是设置捕获哪些分支的情况作为触发器。
后置处理器插件
插件 Post build task
path = os.path.abspath(os.path.dirname((__file__)))
try:
with open(path + r'/allure-results/html/export/prometheusData.txt', 'r') as f:
for lines in f: # 通常这里应该是 'line' 而不是 'lines',因为每次迭代都是一行
parts = lines.strip('\n').split(' ') # 去除换行符并按空格分割
if len(parts) >= 2: # 确保至少有两个元素
launch_name = parts[0]
num = parts[1]
d.update({launch_name: num}) # 更新或添加键值对到字典
print(d) # 在文件读取完成后打印字典
except FileNotFoundError:
print("文件未找到或无法打开")
except IOError as e:
print(f"打开文件时发生I/O错误: {e}")
print(d)
retries_run = d.get('launch_retries_run') # 运行总数
print('运行总数:{}'.format(retries_run))
status_passed = d.get('launch_status_passed') # 通过数量
print('通过数量:{}'.format(status_passed))
status_failed = d.get('launch_status_failed') # 不通过数量
print('没通过数量:{}'.format(status_failed))
status_broken = d.get('launch_status_broken') # 中断数量
复制代码
接入钉钉 api
插件安装:Ding Talk
使用方法
jenkins
配置钉钉助手
Manage jenkins
->钉钉图标(我的jenkins
版本是 2.4,图标在页面底部)
新增机器人,这里定义机器人的名字然后是最关键的webhook
这个是一个凭证来链接对应的钉钉群聊里的小机器人。
安全设置(这个是钉钉 app 在创建群机器人时的设置):
ip 设置:钉钉群里的机器人只接收指定 ip 发送请求
关键字:只接收信息中包含关键字的请求。
项目中便会出现钉钉机器人选项,选择jenkins
配置好的机器人,便可发送基本信息,不过此处并不用这种方式来向钉钉群聊发送消息,而是通过代码调用钉钉机器人开放的接口。
代码中使用第三方库:dingtalkchatbot
来完成对钉钉机器人发送请求,并且通过关键字的方式通过安全检验。
在jenkins
自动化脚本运行完毕后,通过post build task
来触发该后置脚本的运行,便可获取并发送刚刚生成的测试报告的信息到钉钉群里。
from dingtalkchatbot.chatbot import DingtalkChatbot
# jenkins登录地址
jenkins_url = "http://xxxx:8282/"
# 获取jenkins对象
server = jenkins.Jenkins(jenkins_url, username='xxxx', password='xxxx') # Jenkins登录名 ,密码
# job名称
job_name = "job/xxxxx/" # Jenkins运行任务名称
# job的url地址
job_url = jenkins_url + job_name
# 获取最后一次构建
job_last_build_url = server.get_info(job_name)['lastBuild']['url']
# 报告地址
report_url = job_last_build_url + 'allure' # 'allure'为我的Jenkins全局工具配置中allure别名
def send_dingtalk(self):
d = {}
path = os.path.abspath(os.path.dirname((__file__)))
try:
with open(path + r'/allure-results/html/export/prometheusData.txt', 'r') as f:
for lines in f: # 通常这里应该是 'line' 而不是 'lines',因为每次迭代都是一行
parts = lines.strip('\n').split(' ') # 去除换行符并按空格分割
if len(parts) >= 2: # 确保至少有两个元素
launch_name = parts[0]
num = parts[1]
d.update({launch_name: num}) # 更新或添加键值对到字典
print(d) # 在文件读取完成后打印字典
except FileNotFoundError:
print("文件未找到或无法打开")
except IOError as e:
print(f"打开文件时发生I/O错误: {e}")
print(d)
retries_run = d.get('launch_retries_run') # 运行总数
print('运行总数:{}'.format(retries_run))
status_passed = d.get('launch_status_passed') # 通过数量
print('通过数量:{}'.format(status_passed))
status_failed = d.get('launch_status_failed') # 不通过数量
print('没通过数量:{}'.format(status_failed))
status_broken = d.get('launch_status_broken') # 中断数量
con = {
"content": "Pytest_Allure_Demo自动化脚本执行完成。\n"
"测试概述:\n"
"运行总数: " + retries_run + "\n"
"通过数量: " + status_passed + "\n"
"失败数量: " + status_failed + "\n"
"中断数量: " + status_broken + "\n"
"构建地址:" + job_url + "\n"
"报告地址:" + report_url
}
# 获取路径,目的是找到report.html文件的路径
path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) # 获取当前路径
html_path = os.path.join(path, "allure-results/html/index.html") # 获取html格式报告文件的路径
tile = time.strftime("%Y-%m-%d %H:%M:%S")
# WebHook地址,你钉钉上创建自定义机器人时生成的值
webhook = 'xxxx'
# 初始化机器人小丁
xiaoding = DingtalkChatbot(webhook)
ding = DingTalk()
jd = json.dumps(con)
# xixi = ding.read_report(html_path)
xiaoding.send_text(
# Qa-审核后台自动化是机器人的关键字,必须要保持一致
msg='Qa-冼喆\n\n' + con["content"] + "\n\n项目url:**/" + "\n\n执行时间:" + tile
)
复制代码
评论