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

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

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

一、功能实现概述

批量任务触发与结果等待

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

import asyncio

async 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 requests

def get_testNG_report(testReport_url):
    report_info={}
    report_info['testReport_url'] = testReport_url
    try:
        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 = 0

            tests_pattern = r'(\d+) tests'
            tests_match = re.search(tests_pattern, res.text)
            if tests_match:
                tests = int(tests_match.group(1))
            else:
                tests = 0

            success_num = tests - failures
            if tests!= 0:
                success_rate = "{:.2%}".format(success_num / tests)
                report_info['success_rate'] = success_rate
            report_info['success_num'] = success_num
            report_info['failures'] = failures
            report_info['tests'] = tests
        else:
            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":
                continue
            value1 = {} 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_fooder
    return 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.coloradmin.cn/o/2284874.html

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

相关文章

[cg] 使用snapgragon 对UE5.3抓帧

最近想要抓opengl 的api&#xff0c;renderdoc在起应用时会闪退&#xff08;具体原因还不知道&#xff09;&#xff0c;试了下snapgraon, 还是可以的 官网需要注册登录后下载&#xff0c;官网路径&#xff1a;Developer | Qualcomm 为了方便贴上已经下载好的exe安装包&#x…

物业巡更系统在现代社区管理中的优势与应用探讨

内容概要 在现代社区管理中&#xff0c;物业巡更系统正逐渐成为一种不可或缺的工具。结合先进的智能技术&#xff0c;这些系统能够有效地提升社区管理的各个方面&#xff0c;尤其是在巡检效率和信息透明度方面。通过实时记录巡检数据&#xff0c;物业管理人员能够确保工作人员…

速通Docker === Docker Compose

目录 Docker Compose 简介 Docker Compose 常用命令 使用 Docker Compose 启动 WordPress 普通启动方式&#xff08;使用 Docker 命令&#xff09; 使用 Docker Compose 启动 Docker Compose 的特性 Docker Compose 简介 Docker Compose 是一个用于定义和运行多容器 Dock…

Spring MVC 综合案例

目录 一. 加法计算器 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 3. 服务器端代码 4. 运行测试 二. 用户登录 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 (1) 登录界面接口 (2) 首页接口 3. 服务器端代码 4. 运行测试 三. 留言板 1. 准备…

数据分析系列--③RapidMiner算子说明及数据预处理

一、算子说明 1 新建过程 2 算子状态灯 状态灯说明: (1)状态指示灯&#xff1a; 红色:指示灯说明有参数未被设置或输入端口未被连接等问题; 黄色:指示灯说明还未执行算子&#xff0c;不管配置是否基本齐全; 绿色:指示灯说明一切正常&#xff0c;已成功执行算子。 (2)三角…

NLP自然语言处理通识

目录 ELMO 一、ELMo的核心设计理念 1. 静态词向量的局限性 2. 动态上下文嵌入的核心思想 3. 层次化特征提取 1. 双向语言模型&#xff08;BiLM&#xff09; 2. 多层LSTM的层次化表示 三、ELMo的运行过程 1. 预训练阶段 2. 下游任务微调 四、ELMo的突破与局限性 1. 技术突破 2. …

Time Constant | RC 和 RL 电路中的时间常数

注&#xff1a;本文为 “Time Constant” 相关文章合辑。 机翻&#xff0c;未校。 How To Find The Time Constant in RC and RL Circuits June 8, 2024 &#x1f4a1; Key learnings: 关键学习点&#xff1a; Time Constant Definition: The time constant (τ) is define…

无心剑七绝《除夕快乐》

七绝除夕快乐 除旧迎新瑞气扬 夕阳烂漫映红妆 快言美酒佳肴味 乐享天伦福满堂 2025年1月28日 平水韵七阳平韵 无心剑这首七绝以“除夕快乐”为题&#xff0c;巧妙地运用了藏头手法&#xff0c;将“除夕快乐”四字分别嵌入诗的每一句首字&#xff0c;构思精巧&#xff0c;富有新…

Object类(3)

大家好&#xff0c;今天继续给大家介绍一下object类中的方法&#xff0c;那么话不多说&#xff0c;来看。 hashcode()这个方法,帮我们算了一个具体的对象位置,这里面涉及到数据结构,简单认为它是个内存地址,然后调用Integer.toHexString ()将这个地址以16进制输出。 该方法是一…

GPU上没程序在跑但是显存被占用

原因&#xff1a;存在僵尸线程&#xff0c;运行完但是没有释放内存 查看僵尸线程 fuser -v /dev/nvidia*关闭僵尸线程 pkill -9 -u 用户名 程序名 举例&#xff1a;pkill -9 -u grs python参考&#xff1a;https://blog.csdn.net/qq_40206371/article/details/143798866

2007-2020年各省国内专利申请授权量数据

2007-2020年各省国内专利申请授权量数据 1、时间&#xff1a;2007-2020年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区名称、年份、国内专利申请授权量(项) 4、范围&#xff1a;31省 5、指标解释&#xff1a;专利是专利权的简称&…

python:洛伦兹变换

洛伦兹变换&#xff08;Lorentz transformations&#xff09;是相对论中的一个重要概念&#xff0c;特别是在讨论时空的变换时非常重要。在四维时空的背景下&#xff0c;洛伦兹变换描述了在不同惯性参考系之间如何变换时间和空间坐标。在狭义相对论中&#xff0c;洛伦兹变换通常…

电路研究9.2.3——合宙Air780EP中FTP——FTPGET 命令使用方法研究

怎么说呢&#xff0c;之前也是看的&#xff0c;但是也很迷茫&#xff0c;感觉上虽然是对的&#xff0c;但是无法联系到应用里面&#xff0c;今天研究一下FTP 命令使用方法吧。 15.29 使用方法举例 这里发现下面那些看的不懂呢&#xff0c;于是就返回FTP的应用了。 9.5.4 FTP 应…

ANSYS学习笔记(十)网格质量的诊断和提高

网格质量的好坏不能单纯只看meshing给出的网格质量结果&#xff0c;要根据实际的计算物理场景来判断&#xff0c;需要求解的地方物理量大梯度的位置网格越密越好。 网格质量&#xff1a;在有限网格数量限制下&#xff0c;离散误差小的网格是好网格&#xff0c;是高质量网格。网…

2024收尾工作

目录 开场白 栈与队列 LeetCode232. 用栈实现队列 LeetCode225. 用队列实现栈 LeetCode102. 二叉树的层序遍历 LeetCode103. 二叉树的锯齿形层序遍历 堆&#xff08;优先级队列&#xff09; 堆排序 LeetCode215. 数组中的第 k 个最大元素 总结 开场白 今天是除夕&…

搭建Spring Boot开发环境

JDK&#xff08;1.8及以上版本&#xff09; Apache Maven 3.6.0 修改settings.xml 设置本地仓库位置 <localRepository>D:/repository</localRepository> 设置远程仓库镜像 <mirror><id>alimaven</id><name>aliyun maven</name&…

jmeter中对接口进行循环请求后获取相应数据

1、工作中遇到一个场景就是对某个单一接口进行循环请求&#xff0c;并需要获取每次请求后返回的相应数据&#xff1b; 2、首先就在jmeter对接口相关组件进行配置&#xff0c;需要组件有&#xff1a;循环控制器、CSV数据文件设置、计数器、访问接口、HTTP信息头管理器、正则表达…

网络工程师 (4)存储系统

一、多级存储结构 &#xff08;一&#xff09;组成 寄存器&#xff1a; 寄存器是与CPU直接协调工作的高速存储器&#xff0c;用于加速存储器的访问速度。它通常用于存放操作数或作为地址寄存器&#xff0c;以加快地址转换速度。寄存器的数量有限&#xff0c;一般在几个到几百个…

oracle比较一下统计信息差异吧

统计信息发生了哪些变化&#xff1f; 从上次收集到最近一次收集有什么不同&#xff1f; set long 999999 longc 99999 line 100 select report, maxdiffpct from table(dbms_stats.diff_table_stats_in_history(SYS,T1,to_timestamp(2025-01-22 09:01:46,YYYY-MM-DD hh24:mi:s…

Hive:内部表和外部表,内外转换

内部表和外部表 内部表示例 给表添加数据 外部表示例 给表添加数据 外部表示例 用location指定表目录位置,那么表的位置在实际指定的位置,但是可以被映射 外部表和内部表的区别 删除表后使用show tables in shao; 已经没有被删除的表,说明元数据已经被删除(mysql里面存放),但是…