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