当前位置: 首页 > news >正文

基于 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

相关文章:

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

title: 基于 Jenkins 的测试报告获取与处理并写入 Jira Wiki 的技术总结 tags: - jenkins - python categories: - jenkins在软件开发的持续集成与持续交付&#xff08;CI/CD&#xff09;流程里&#xff0c;及时、准确地获取并分析测试报告对保障软件质量至关重要。本文将详细…...

Vue.js组件开发-实现导出PDF文件可自定义添加水印及水印样式方向

使用 Vue 实现导出 PDF 文件并添加水印&#xff0c;同时支持设置水印样式、方向和自定义水印内容。 步骤 安装依赖&#xff1a;使用 html2canvas 将 HTML 内容转换为 canvas&#xff0c;使用 jspdf 生成 PDF 文件。创建 Vue 组件&#xff1a;在组件中实现水印生成、HTML 转 c…...

css中的animation

css的animation animation是一个综合属性,是animation-name, animation-duration, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, animation-fill-mode, animation-play-state, and animation-timeline这些属性的简写 不过在…...

四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用)

四.3 Redis 五大数据类型/结构的详细说明/详细使用&#xff08; hash 哈希表数据类型详解和使用&#xff09; 文章目录 四.3 Redis 五大数据类型/结构的详细说明/详细使用&#xff08; hash 哈希表数据类型详解和使用&#xff09;2.hash 哈希表常用指令(详细讲解说明)2.1 hset …...

基于Springboot + vue实现的洗衣店订单管理系统

“前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff1a;人工智能学习网站” &#x1f496;学习知识需费心&#xff0c; &#x1f4d5;整理归纳更费神。 &#x1f389;源码免费人人喜…...

用 Scoop 优雅管理 Windows 软件:安装、配置与使用全指南

本篇将主要讲讲如何用「Scoop」优雅管理 Windows 软件&#xff1a;安装、配置与使用全指南 一、Scoop 是什么&#xff1f; Scoop 是一款专为 Windows 设计的命令行软件包管理工具&#xff0c;它能让你像 Linux 系统一样通过命令快速安装、更新和卸载软件。其核心优势包括&…...

深度学习中常用的评价指标方法

深度学习中常用的评价指标方法因任务类型&#xff08;如分类、回归、分割等&#xff09;而异。以下是一些常见的评价指标&#xff1a; 1. 分类任务 准确率&#xff08;Accuracy&#xff09; 定义&#xff1a;正确预测的样本数占总样本数的比例。 公式&#xff1a;AccuracyTPT…...

多协议网关BL110钡铼6路RS485转MQTT协议云网关

多协议网关BL110钡铼6路RS485转MQTT协议云网关是一款集成了多种通信协议的工业级网关设备&#xff0c;专为物联网&#xff08;IoT&#xff09;应用设计。该网关能够将RS485总线设备的数据转化为MQTT协议&#xff0c;通过网络传输到云平台&#xff0c;实现远程监控和数据管理。以…...

Nginx 安装配置指南

Nginx 安装配置指南 引言 Nginx 是一款高性能的 HTTP 和反向代理服务器&#xff0c;同时也可以作为 IMAP/POP3/SMTP 代理服务器。由于其稳定性、丰富的功能集以及低资源消耗而被广泛应用于各种场景。本文将为您详细介绍 Nginx 的安装与配置过程。 系统要求 在安装 Nginx 之…...

二叉树介绍

一.树的概念 树的图&#xff1a; 1.结点的度&#xff1a;一个结点含有子树的个数称为该结点的度&#xff1b; 如上图&#xff1a;A的度为6 2.树的度&#xff1a;一棵树中&#xff0c;所有结点度的最大值称为树的度&#xff1b; 如上图&#xff1a;树的度为6 3.叶子结点或终…...

VLC-Qt: Qt + libVLC 的开源库

参考链接 https://blog.csdn.net/u012532263/article/details/102737874...

【四川乡镇界面】图层shp格式arcgis数据乡镇名称和编码2020年wgs84无偏移内容测评

本文将详细解析标题和描述中提到的IT知识点&#xff0c;主要涉及GIS&#xff08;Geographic Information System&#xff0c;地理信息系统&#xff09;技术&#xff0c;以及与之相关的文件格式和坐标系统。 我们要了解的是"shp"格式&#xff0c;这是一种广泛用于存储…...

Helm Chart 详解:从入门到精通

Helm 是 Kubernetes 的包管理工具,而 Helm Chart 是 Helm 的核心概念,用于定义、安装和升级 Kubernetes 应用。本文将详细介绍 Helm Chart 的结构、核心文件及其作用,帮助你从入门到精通 Helm Chart。 © ivwdcwso (ID: u012172506) 1. 什么是 Helm Chart? Helm Char…...

excel如何查找一个表的数据在另外一个表是否存在

比如“Sheet1”有“张三”、“李四”“王五”三个人的数据&#xff0c;“Sheet2”只有“张三”、“李四”的数据。我们通过修改“Sheet1”的“民族”或者其他空的列&#xff0c;修改为“Sheet2”的某一列。这样修改后筛选这个修改的列为空的或者为出错的&#xff0c;就能找到两…...

gesp(C++六级)(7)洛谷:P10376:[GESP202403 六级] 游戏

gesp(C六级)&#xff08;7&#xff09;洛谷&#xff1a;P10376&#xff1a;[GESP202403 六级] 游戏 题目描述 你有四个正整数 n , a , b , c n,a,b,c n,a,b,c&#xff0c;并准备用它们玩一个简单的小游戏。 在一轮游戏操作中&#xff0c;你可以选择将 n n n 减去 a a a&am…...

随机森林例子

完整代码&#xff1a; # 导入必要的库 from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score import numpy as np# 加载鸢尾花数…...

Qt中Widget及其子类的相对位置移动

Qt中Widget及其子类的相对位置移动 最后更新日期&#xff1a;2025.01.25 下面让我们开始今天的主题… 一、开启篇 提出问题&#xff1a;请看上图&#xff0c;我们想要实现的效果是控件黄色的Widge&#xff08;m_infobarWidget&#xff09;t随着可视化窗口&#xff08;m_glWidge…...

MyBatis 关联映射详解

目录 一、创建表结构 1. 学生表 (student) 2. 教师表 (teacher) 二、一对一 & 多对一 关系映射 1. 连表查询&#xff08;直接查询&#xff09; 2. 分步查询&#xff08;懒加载&#xff09; 三、一对多 关系映射 1. 直接查询 2. 分步查询 四、MyBatis 延迟加载&am…...

Shell特殊位置变量以及常用内置变量总结

目录 1. 特殊的状态变量 1.1 $?&#xff08;上一个命令的退出状态&#xff09; 1.2 $$&#xff08;当前进程的 PID&#xff09; 1.3 $!&#xff08;后台进程的 PID&#xff09; 1.4 $_&#xff08;上一条命令的最后一个参数&#xff09; 2.常用shell内置变量 2.1 echo&…...

LeetCode:96.不同的二叉搜索树

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;96.不同的二叉搜索树 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉…...

基于Springboot的智能学习平台系统【附源码】

基于Springboot的智能学习平台系统 效果如下&#xff1a; 系统登陆页面 系统主页面 课程详情页面 论坛页面 考试页面 试卷管理页面 考试记录页面 错题本页面 研究背景 随着互联网技术的普及&#xff0c;人们探索知识的方式逐渐转向数字化平台。传统的教学方法通常局限于固定…...

DeepSeek助力学术文献搜索!

搜集文献 宝子们如果是第一次发表学术论文&#xff0c;论文往往是会署名多个作者。在这种情况下&#xff0c;即便成功发表了论文&#xff0c;独立撰作或主导写作的挑战仍旧存在。那么&#xff0c;怎样才能独立地完成一篇属于自己的学术论文呢&#xff1f;对于初次尝试学术论文…...

阿里:基于路由和规划的多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…...

@RestControllerAdvice 的作用

系列博客目录 文章目录 系列博客目录1.ControllerAdvice 有什么用主要功能 2.与 RestControllerAdvice 的区别3.苍穹外卖中的使用4.RestControllerAdvice可以指定范围吗&#xff08;1&#xff09;指定应用到某些包中的 RestController&#xff08;2&#xff09;指定应用到具有特…...

k均值聚类将数据分成多个簇

K-Means 聚类并将数据分成多个簇&#xff0c;可以使用以下方法&#xff1a; 实现思路 随机初始化 K 个聚类中心计算每个点到聚类中心的距离将点分配到最近的簇更新聚类中心重复上述过程直到收敛 完整代码&#xff1a; import torch import matplotlib.pyplot as pltdef kme…...

书生大模型实战营2

L0——入门岛 Python基础 Conda虚拟环境 虚拟环境是Python开发中不可或缺的一部分&#xff0c;它允许你在不同的项目中使用不同版本的库&#xff0c;避免依赖冲突。Conda是一个强大的包管理器和环境管理器。 创建新环境 首先&#xff0c;确保你已经安装了Anaconda或Minico…...

Excel 技巧21 - Excel中整理美化数据实例,Ctrl+T 超级表格(★★★)

本文讲Excel中如何整理美化数据的实例&#xff0c;以及CtrlT 超级表格的常用功能。 目录 1&#xff0c;Excel中整理美化数据 1-1&#xff0c;设置间隔行颜色 1-2&#xff0c;给总销量列设置数据条 1-3&#xff0c;根据总销量设置排序 1-4&#xff0c;加一个销售趋势列 2&…...

前端——js高级25.1.27

复习&#xff1a;对象 问题一&#xff1a; 多个数据的封装提 一个对象对应现实中的一个事物 问题二&#xff1a; 统一管理多个数据 问题三&#xff1a; 属性&#xff1a;组成&#xff1a;属性名属性值 &#xff08;属性名为字符串&#xff0c;属性值任意&#xff09; 方…...

学习数据结构(4)顺序表+单链表

1.顺序表算法题 题三&#xff1a; 2.单链表 &#xff08;1&#xff09;概念 链表是⼀种物理存储结构上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 &#xff08;2&#xff09;节点 节点的组成主要有两个部分&#xff1a;当前节点要保…...

GIS 中的 SQLAlchemy:空间数据与数据库之间的桥梁

利用 SQLAlchemy 在现代应用程序中无缝集成地理空间数据导言 地理信息系统&#xff08;GIS&#xff09;在管理城市规划、环境监测和导航系统等各种应用的空间数据方面发挥着至关重要的作用。虽然 PostGIS 或 SpatiaLite 等专业地理空间数据库在处理空间数据方面非常出色&#…...