基于 Jenkins 的测试报告获取与处理并写入 Jira Wiki 的技术总结

title: 基于 Jenkins 的测试报告获取与处理并写入 Jira Wiki 的技术总结
tags: 
- jenkins
- python
categories:
- jenkins

在软件开发的持续集成与持续交付(CI/CD)流程里,及时、准确地获取并分析测试报告对保障软件质量至关重要。本文将详细阐述如何借助 Jenkins 搭建自动化系统,实现批量触发测试任务、获取测试报告关键信息并写入 Jira Wiki 的全流程自动化,为技术同行提供技术参考与实践经验。

一、功能实现概述

批量任务触发与结果等待

借助jenkins库,通过run_jenkins_task函数实现批量触发 Jenkins 测试自动化任务。关键代码如下:

import asyncioasync def run_jenkins_task(env,testNG_job_name_dict,sosotest_job_name_dict,robot_job_name_dict):job_names = testNG_job_name_dict.get(env, [])testNG_results, sosotest_results, robot_results = await asyncio.gather(*[trigger_and_get_result(server, job_name) for job_name in job_names],* [trigger_and_get_result(sosotest_server, job_name, sosotest_params) for job_name,sosotest_params in sosotest_job_name_dict.items()],*[trigger_and_get_result(sosotest_server, job_name, sosotest_params) for job_name,sosotest_params in robot_job_name_dict.items()],return_exceptions=True)return testNG_results, sosotest_results, robot_results

该函数根据不同环境(如gray、cd等)和任务类型(testNG、sosotest、robot),批量触发对应的 Jenkins 任务。利用asyncio.gather并发执行任务,极大提高了执行效率。执行过程中,程序会等待所有任务完成,获取每个任务的执行结果,确保后续处理基于完整的任务数据 。

测试报告关键信息提取

针对testNG、sosotest和robot三种不同类型的测试报告,分别编写get_testNG_report、get_sosotest_report和get_robot_report函数,运用正则表达式提取关键信息。以get_testNG_report函数为例:

import re
import requestsdef get_testNG_report(testReport_url):report_info={}report_info['testReport_url'] = testReport_urltry:res = requests.get(testReport_url)if res.status_code == 200:failures_pattern = r'(\d+) failures'failures_match = re.search(failures_pattern, res.text)if failures_match:failures = int(failures_match.group(1))else:failures = 0tests_pattern = r'(\d+) tests'tests_match = re.search(tests_pattern, res.text)if tests_match:tests = int(tests_match.group(1))else:tests = 0success_num = tests - failuresif tests!= 0:success_rate = "{:.2%}".format(success_num / tests)report_info['success_rate'] = success_ratereport_info['success_num'] = success_numreport_info['failures'] = failuresreport_info['tests'] = testselse:print(f"请求失败,状态码: {res.status_code}")except requests.RequestException as e:print(f"请求时发生异常: {e}")return report_info

此函数通过requests库获取测试报告页面内容,然后使用正则表达式匹配(\d+) failures和(\d+) tests,分别提取失败次数和测试总次数,进而计算成功次数和成功率。针对不同类型报告,通过调整正则表达式,精准提取出报告执行数、成功率、失败数等关键信息。

信息组装与 Jira Wiki 写入

利用assembly_content函数将提取的关键信息组装成特定格式的 HTML 表格内容,再通过与 Jira API 交互的函数将其写入 Jira Wiki。assembly_content函数核心代码如下:

def assembly_content(content_list):content_header = f'''<table class=\"wrapped confluenceTable\" style=\"width: 2093.0px;\"><!-- 省略表格头部详细定义 --></tr>'''content_body = ""for value in content_list:content_body += f'''<tr><td class=\"confluenceTd\" style=\"width: 208.0px;\" rowspan=\"3\">{value['functional_domain']}</td>'''for key1, value1 in value.items():if key1 == "functional_domain":continuevalue1 = {} if value1 is None else value1# 构建表格行内容content_body += f'''<td class=\"confluenceTd\" style=\"width: 171.0px;\">{key1}</td><td class=\"confluenceTd\" style=\"width: 125.0px;\">{value1.get("tests")}</td><!-- 省略其他列内容构建 --><td class=\"confluenceTd\" style=\"width: 766.0px;\"><a href=\"{value1.get('testReport_url')}">{value1.get('testReport_url')}</a></td></tr><tr>'''content_body += f'''</tr>'''content_fooder = f''' </tbody></table>'''content = content_header + content_body + content_fooderreturn content

该函数将不同任务的测试报告关键信息,按照功能域和报告类型进行整理,生成对应的 HTML 表格行。最终将这些行组合成完整的表格内容,其中包含报告执行数、成功率、失败数以及报告链接等信息。在写入 Jira Wiki 时,需要根据 Jira 对内容格式的要求,对生成的 HTML 内容进行适当转义和调整 ,确保顺利写入。

二、经验总结

异步并发提升效率

使用asyncio库实现异步操作,通过asyncio.gather并发触发和等待多个测试任务,极大减少了整体任务执行时间。在处理大量测试任务时,避免了顺序执行带来的时间浪费,提升了测试效率,加快了反馈周期,有助于开发团队及时根据测试结果调整开发方向。

正则表达式精准提取

在报告解析中,正则表达式能针对不同结构的测试报告,精准提取关键信息。通过为不同报告类型编写专门的正则表达式模式,能够快速、准确地获取报告执行数、成功率、失败数等数据。不过,由于测试框架版本变化可能导致报告格式改变,需要建立正则表达式库,对解析模式进行统一管理,以便及时调整适配。

模块化设计增强维护性

代码采用模块化设计,每个函数负责独立功能,如任务触发、报告解析、内容组装等。这使得代码结构清晰,可读性和可维护性大大提高。当需要修改或扩展功能时,仅需关注对应的模块,减少了对整体代码的影响。在团队协作开发中,模块化设计有助于提高开发效率,降低沟通成本,提升代码质量。

可扩展性保障系统长期可用

系统具备良好的可扩展性。对于新的测试类型或报告格式,只需添加新的报告解析函数和相应映射关系,就能集成到现有系统。例如,未来引入新测试框架,按照现有模式编写解析函数并配置映射,即可实现对新报告的处理,保障系统能适应不断变化的测试需求。

三、改进方向探讨

强化错误处理机制

目前部分函数对异常仅做简单打印输出,在实际生产环境中远远不够。应使用logging模块记录详细日志,方便后续排查问题;针对不同异常类型,制定更合理的抛出与恢复策略,确保系统稳定可靠。与 Jira Wiki 交互时,针对网络异常、权限不足等问题,增加重试机制、优化权限管理,保障数据顺利写入。

消除代码冗余

run_jenkins_task函数中触发不同类型任务的代码存在重复。可将触发任务的公共部分封装成独立函数,减少代码冗余,使代码结构更清晰,降低维护成本,便于统一修改和优化触发任务的逻辑。


本文永久更新地址:

https://www.fenxiangbe.com/p/基于 Jenkins 的测试报告获取与处理并写入 Jira Wiki 的技术总结.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/67416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue-有关于TS与路由器

title: vue(TS)路由器 date: 2025-01-28 12:00:00 tags:- 前端 categories:- 前端Vue3-第二部分 这里是代码中出现TS的&#xff0c;后面是路由器 现在先上代码&#xff0c;步步分析。 eg1-props的使用 步步分析代码&#xff08;先理解&#xff0c;再实践&#xff09; 框架…

mysql.sock.lock 导致mysql重启失败

背景 今天公司物业断电&#xff0c;导致机房服务器停电宕机&#xff0c;所有的服务都得重启。本着mysql实例都做了服务自启动&#xff0c;所以没有太担心影响开发的日常工作。但是今天一上班开发就找来&#xff0c;各种服务都没起来有问题&#xff0c;数据库连不上。马上登陆数…

【hot100】刷题记录(7)-除自身数组以外的乘积

题目描述&#xff1a; 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#x…

1-2 飞机大战游戏场景

前言&#xff1a; 根据前面的项目框架&#xff0c;搭建游戏的运行场景...... 1.0 框架预览 基于该框架首先实现游戏的运行场景 2.0 图片文件 创建图片文件&#xff0c;本次项目使用easyx作为图形库文件&#xff0c;在easyx中想要显示图片&#xff0c;需要有一张图片和图片的掩码…

进程通讯——类型和发展

进程常用交互方法如上

安装zsh并美化

0 Zsh 是一种功能强大的 shell&#xff0c;通常用于替代默认的 Bash shell。它为命令行提供了更多的功能&#xff0c;例如自动补全、强大的模式匹配和主题支持等。 Oh My Zsh 是用于管理 Zsh 配置的框架。 powerlevel10k是样式&#xff0c;通过p10k configure脚本可以调节自己…

GMSL 明星产品之 MAX96717

在上一篇文章中&#xff0c;我们详细介绍了车载市场中爆火的 GMSL 到底是个啥 &#xff1a; 揭开 GMSL 的面纱&#xff1a;自动驾驶背后的隐藏技术。今天我们就来详细了解下如今在摄像头侧超级火爆的加串器&#xff1a;MAX96717。 MAX96717 系列有三款产品&#xff1a; MAX967…

线段树 算法

文章目录 基础知识适用场景小结 题目概述题目详解300.最长递增子序列2407.最长递增子序列 II 基础知识 线段树和树状数组都只是一个工具来的&#xff0c;题目并不会一下子就告诉你这个题目用到线段树和树状数组&#xff0c;这个取决于你想使用的数据结构以及所要优化的方向 线…

MATLAB提供的颜色映射表colormap——伪彩色

图像处理领域的一个习惯&#xff1a;不是真实的颜色&#xff0c;一般用伪彩色。一是说明不是物体本身的颜色&#xff0c;二是彩色更容易分辨。 MATLAB陆续提供了16种颜色映射表colormap。 之前的都很丑&#xff0c;近5年新增的4种还可以。总的说来还是丑。 这是一种鸟的名字。…

20.Word:小谢-病毒知识的科普文章❗【38】

目录 题目​ NO1.2.3文档格式 NO4.5 NO6.7目录/图表目录/书目 NO8.9.10 NO11索引 NO12.13.14 每一步操作完&#xff0c;确定之后记得保存最后所有操作完记得再次删除空行 题目 NO1.2.3文档格式 样式的应用 选中应用段落段落→开始→选择→→检查→应用一个一个应用ctr…

【16届蓝桥杯寒假刷题营】第2期DAY4

【16届蓝桥杯寒假刷题营】第2期DAY4 - 蓝桥云课 问题描述 幼儿园小班的浩楠同学有一个序列 a。 他想知道有多少个整数三元组 (i,j,k) 满足 1≤i,j,k≤n 且 ai​aj​ak​。 输入格式 共2行&#xff0c;第一行一个整数 n&#xff0c;表示序列的长度。 第二行 n 个整数&#x…

MySQL查询优化(三):深度解读 MySQL客户端和服务端协议

如果需要从 MySQL 服务端获得很高的性能&#xff0c;最佳的方式就是花时间研究 MySQL 优化和执行查询的机制。一旦理解了这些&#xff0c;大部分的查询优化是有据可循的&#xff0c;从而使得整个查询优化的过程更有逻辑性。下图展示了 MySQL 执行查询的过程&#xff1a; 客户端…

Van-Nav:新年,将自己学习的项目地址统一整理搭建自己的私人导航站,供自己后续查阅使用,做技术的同学应该都有一个自己网站的梦想

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 Van-Nav是一个基于Vue.js开发的导航组件库&#xff0c;它提供了多种预设的样式和灵活的配置选项&#xff0c;使得开发者可以轻松地定制出符合项目需求…

VSCode+Continue实现AI辅助编程

Continue是一款功能强大的AI辅助编程插件&#xff0c;可连接多种大模型&#xff0c;支持代码设计优化、错误修正、自动补全、注释编写等功能&#xff0c;助力开发人员提高工作效率与代码质量。以下是其安装和使用方法&#xff1a; 一、安装VSCode 参见&#xff1a; vscode安…

【hot100】刷题记录(6)-轮转数组

题目描述&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转…

FPGA 使用 CLOCK_DEDICATED_ROUTE 约束

使用 CLOCK_DEDICATED_ROUTE 约束 CLOCK_DEDICATED_ROUTE 约束通常在从一个时钟区域中的时钟缓存驱动到另一个时钟区域中的 MMCM 或 PLL 时使 用。默认情况下&#xff0c; CLOCK_DEDICATED_ROUTE 约束设置为 TRUE &#xff0c;并且缓存 /MMCM 或 PLL 对必须布局在相同…

阿里:基于路由和规划的多agent系统

&#x1f4d6;标题&#xff1a;Talk to Right Specialists: Routing and Planning in Multi-agent System for Question Answering &#x1f310;来源&#xff1a;arXiv, 2501.07813 &#x1f31f;摘要 &#x1f538;利用大型语言模型&#xff08;LLM&#xff09;&#xff0c…

【Unity3D】实现2D角色/怪物死亡消散粒子效果

核心&#xff1a;这是一个Unity粒子系统自带的一种功能&#xff0c;可将粒子生成控制在一个Texture图片网格范围内&#xff0c;并且粒子颜色会自动采样图片的像素点颜色&#xff0c;之后则是粒子编辑出消散效果。 Particle System1物体&#xff08;爆发式随机速度扩散10000个粒…

Synology 群辉NAS安装(10)安装confluence

Synology 群辉NAS安装&#xff08;10&#xff09;安装confluence 写在前面本着一朝鲜吃遍天的原则&#xff0c;我又去了这个github的作者那里翻车的第一次尝试手工创建数据库制作一个新的docker-compose of confluence 不折腾但成功启动的版本 写在前面 在装完jira之后&#x…

万字长文总结前端开发知识---JavaScriptVue3Axios

JavaScript学习目录 一、JavaScript1. 引入方式1.1 内部脚本 (Inline Script)1.2 外部脚本 (External Script) 2. 基础语法2.1 声明变量2.2 声明常量2.3 输出信息 3. 数据类型3.1 基本数据类型3.2 模板字符串 4. 函数4.1 具名函数 (Named Function)4.2 匿名函数 (Anonymous Fun…