最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Python統(tǒng)計Jira數(shù)據(jù)并可視化

 更新時間:2022年07月24日 10:54:55   作者:星安果  
目前公司使用 Jira 作為項目管理工具,在每一次迭代完成后的復(fù)盤會上,我們都需要針對本次迭代的 Bug 進行數(shù)據(jù)統(tǒng)計,以幫助管理層能更直觀的了解研發(fā)的代碼質(zhì)量。本篇文章將介紹如何利用統(tǒng)計 Jira 數(shù)據(jù),并進行可視化,需要的可以參考一下

大家好,我是安果!

目前公司使用 Jira 作為項目管理工具,在每一次迭代完成后的復(fù)盤會上,我們都需要針對本次迭代的 Bug 進行數(shù)據(jù)統(tǒng)計,以幫助管理層能更直觀的了解研發(fā)的代碼質(zhì)量

本篇文章將介紹如何利用統(tǒng)計 Jira 數(shù)據(jù),并進行可視化

1. 準備

首先,安裝 Python 依賴庫

#?安裝依賴庫
pip3?install?jira
pip3?install?html-table
pip3?install?pyecharts
pip3?install?snapshot_selenium

其中

  • jira 使用 jsql 語法從在項目中獲取需要的數(shù)據(jù)
  • html-table 用于生成一個 HTML 格式的表格數(shù)據(jù)
  • pyecharts 和 snapshot_selenium 用于數(shù)據(jù)可視化

2. 實戰(zhàn)一下

下面我們通過 7 個步驟來實現(xiàn)上面的功能

2-1 登錄獲取客戶端連接對象

from?jira?import?JIRA

class?JiraObj(object):
????def?__init__(self,?bug_style,?project_type):
????????"""
????????:param?project_name
????????:param?sprint:?迭代號碼
????????:param?bug_style:?BUG狀態(tài)
????????"""
????????#?Jira首頁地址
????????self.server?=?'https://jira.**.team'

????????#?Jira登錄賬號信息
????????self.basic_auth?=?('用戶名',?'密碼')

????????#?創(chuàng)建一個客戶端連接信息
????????self.jiraClinet?=?JIRA(server=self.server,?basic_auth=self.basic_auth)

2-2 根據(jù)項目類型獲取看板 id

...
????????#?獲取boards看板
????????#?所有看板信息
????????boards?=?[(item.id,?item.name)?for?item?in?self.jiraClinet.boards()]
????????board_id?=?self.__get_board_id(boards,?project_type)
????????print("看板id:",?board_id)
...
????def?__get_board_id(self,?boards,?project_type):
????????"""
????????獲取看板id
????????:param?project_type:
????????:return:
????????"""
????????board_id?=?1
????????for?item?in?boards:
????????????if?(project_type?==?PROJ_TYPE.Type1?and?item[1]?==?'t1')?or?(
????????????????????project_type?==?PROJ_TYPE.Type2?and?item[1]?==?'t2'):
????????????????board_id?=?item[0]
????????????????break
????????return?board_id
..

2-3 根據(jù)看板 id 獲取迭代 id 及迭代名稱

...
?#?獲取項目Sprint,讓用戶進行選擇
????????sprints?=?self.jiraClinet.sprints(board_id=board_id)
????????for?item?in?sprints:
????????????if?str(sprint_no)?in?item.name:
????????????????self.sprint_id?=?item.id
????????????????self.sprint_name?=?item.name
????????????????print(f"選擇Sprint,id:{self.sprint_id},name:{self.sprint_name}")
????????????????break
...

2-4  根據(jù)項目名、Bug 類型、迭代 id 組成 jsql 語句,并查詢數(shù)據(jù)

...
?def?get_bug_status_jsql(self,?bug_status:?BUG_STATUS):
????????"""
????????通過bug狀態(tài),獲取jsql
????????:param?bug_status:
????????:return:
????????"""
????????status_jsql?=?''
????????if?bug_status?==?BUG_STATUS.ALL:
????????????status_jsql?=?'?'
????????elif?bug_status?==?BUG_STATUS.TO_VERIFY:
????????????#?待驗證(已解決)
????????????status_jsql?=?'?AND?status?=?已解決?'
????????elif?bug_status?==?BUG_STATUS.TO_FIXED:
????????????#?待解決(打開、重新打開、處理中)
????????????status_jsql?=?'?AND?status?in?(打開,?重新打開,?處理中)?'
????????elif?bug_status?==?BUG_STATUS.CLOSED:
????????????#?關(guān)閉
????????????status_jsql?=?'?AND?status?=?Closed?'
????????elif?bug_status?==?BUG_STATUS.TO_FIXED_CONTAIN_DELAY:
????????????#?待解決(打開、重新打開、處理中、延期處理)
????????????status_jsql?=?'?AND?status?in?(打開,?延期處理,?重新打開,?處理中)?'
????????return?status_jsql
...
jql?=?f'project?=?{project_name}?and?issuetype?=?故障??{self.get_bug_status_jsql(self.bug_style)}?AND?Sprint?=?{self.sprint_id}?ORDER?BY?priority?desc,?updated?DESC'
????????print(jql)
????????lists?=?self.get_issue_list(jql)
...

2-5  生成本地 HTML 統(tǒng)計數(shù)據(jù)

需要注意的是,使用 a 標簽組裝的鏈接不能直接跳轉(zhuǎn),需要針對數(shù)據(jù)進行二次替換才能正常進行鏈接跳轉(zhuǎn) 

from?HTMLTable?import?(
????HTMLTable
)

...
?def?gen_html_table(self,?datas):
????????"""
????????初始化表單樣式
????????:return:
????????"""
????????table?=?HTMLTable(caption=f'實時BUG統(tǒng)計【{self.project_name}】,一共{len(datas)}個')

????????#?表頭行
????????table.append_header_rows((('ID',?'狀態(tài)',?'優(yōu)先級',?'責任人',?'終端',?'URL'),))

????????#?添加數(shù)據(jù)
????????table.append_data_rows(datas)

????????#?設(shè)置樣式
????????table.caption.set_style({'font-size':?'15px'})

????????#?其他樣式設(shè)置
????????...

????????#?替換數(shù)據(jù),便于展示href地址
????????html?=?table.to_html().replace("&lt;",?"<").replace("&gt;",?">").replace("&quot;",?'"')

????????with?open(f"./output/{self.project_name}-bug_{current_time()}.html",?'w',?encoding='utf-8')?as?file:
????????????file.write(html)
...
#?生成本地文件的數(shù)據(jù)
output_tuples?=?tuple([
????????????(item.get("key"),?item.get("status"),?item.get("priority"),?item.get('duty'),?item.get('end_type'),
?????????????f'<a?href="{item.get(" rel="external nofollow" url")}"?target="_blank">點我查看</a>')?for?item?in?lists])

#?生成本地HTML文件
self.gen_html_table(output_tuples)
..

2-6 數(shù)據(jù)統(tǒng)計

首先,這里按 Bug 責任人進行分組,然后按數(shù)目進行降序排列

然后,按 Bug 優(yōu)先等級進行降序排列

最后,獲取每一個端的 Bug 總數(shù)

...
????????#?2、統(tǒng)計每個人(按數(shù)目)
????????datas_by_count?=?{}
????????for?item?in?lists:
????????????datas_by_count[item.get("duty")]?=?datas_by_count.get(item.get("duty"),?0)?+?1

????????#?降序排序
????????datas_by_count?=?sorted(datas_by_count.items(),?key=lambda?item:?item[1],?reverse=True)

????????#?print("按Bug總數(shù)排序:",?datas_by_count)

????????#?3、統(tǒng)計每個人(按優(yōu)先級)
????????datas_by_priority?=?{}

????????for?item?in?datas_by_count:
????????????#?責任人
????????????name?=?item[0]
????????????#?5個優(yōu)先級對應(yīng)的數(shù)目
????????????counts?=?self.get_assignee_count(lists,?name)
????????????datas_by_priority[name]?=?counts

????????#?排序(按優(yōu)先級多條件降序排列)
????????datas_by_priority?=?sorted(datas_by_priority.items(),
???????????????????????????????????key=lambda?item:?(item[1][0],?item[1][1],?item[1][2],?item[1][3]),?reverse=True)

????????#?print("按Bug優(yōu)先級排序:",?datas_by_priority)

????????#?4、根據(jù)終端進行統(tǒng)計分類
????????keys,?values?=?self.get_end_type_count(lists)
...

2-7 可視化

針對上面的 3 組數(shù)據(jù),使用 pyecharts 繪制成柱狀圖和餅狀圖

...
??????def?draw_image(self,?datas_by_count,?datas_by_priority,?keys,?values):
????????"""
????????繪制圖片
????????:param?values:
????????:param?keys:
????????:param?datas_by_count:?按bug總數(shù)排序結(jié)果
????????:param?datas_by_priority:?按bug優(yōu)先級排序結(jié)果
????????:return:
????????"""
????????#?1、按BUG總數(shù)排序繪制
????????bar?=?(
????????????Bar().set_global_opts(
????????????????title_opts=opts.TitleOpts(title=f"{self.project_name}",?subtitle=f"{self.sprint_name}")))
????????bar.add_xaxis([item[0]?for?item?in?datas_by_count])
????????bar.add_yaxis(f"BUG總數(shù)",?[item[1]?for?item?in?datas_by_count])

????????#?render?會生成本地?HTML?文件,默認會在當前目錄生成?render.html?文件
????????#?也可以傳入路徑參數(shù),如?bar.render("mycharts.html")
????????#?bar.render(path=f'{sprint_name}-BUG總數(shù).html')
????????make_snapshot(snapshot,?bar.render(),?"./output/1.png")

????????#?2、按優(yōu)先級排序繪制
????????bar2?=?(
????????????#?Bar(init_opts=opts.InitOpts(theme=ThemeType.INFOGRAPHIC))
????????????Bar()
????????????????.add_xaxis([item[0]?for?item?in?datas_by_priority])
????????????????.add_yaxis(self.__get_priority(BUG_PRIORITY.Highest),?[item[1][0]?for?item?in?datas_by_priority],
???????????????????????????color='#6aa84f')
????????????????.add_yaxis(self.__get_priority(BUG_PRIORITY.High),?[item[1][1]?for?item?in?datas_by_priority],
???????????????????????????color='#a2c4c9')
????????????????.add_yaxis(self.__get_priority(BUG_PRIORITY.Medium),?[item[1][2]?for?item?in?datas_by_priority],
???????????????????????????color="#ff9900")
????????????????.add_yaxis(self.__get_priority(BUG_PRIORITY.Low),?[item[1][3]?for?item?in?datas_by_priority],
???????????????????????????color="#ea9999")
????????????????.add_yaxis(self.__get_priority(BUG_PRIORITY.Lowest),?[item[1][4]?for?item?in?datas_by_priority],
???????????????????????????color="#980000")
????????????????.set_global_opts(
????????????????title_opts=opts.TitleOpts(title=f"{self.project_name}",?subtitle=f"{self.sprint_name}"))
????????)
????????#?bar2.render(path=f'{sprint_name}-BUG優(yōu)先級.html')
????????make_snapshot(snapshot,?bar2.render(),?"./output/2.png")

????????#?3、根據(jù)終端來繪制餅圖
????????if?len(keys)?>?0?and?len(values)?>?0:
????????????c?=?(
????????????????Pie()
????????????????????.add("",?[list(z)?for?z?in?zip(keys,?values)])
????????????????????.set_global_opts(title_opts=opts.TitleOpts(title="各端BUG分布"))
????????????????????.set_series_opts(label_opts=opts.LabelOpts(formatter=":?{c}"))
????????????)
????????????make_snapshot(snapshot,?c.render(),?f"./output/{self.project_name}_end.png")

????????#?4、合并兩張圖片
????????self.concatenate_img(['./output/1.png',?'./output/2.png'],?img_name=f'./output/{self.sprint_name}_bug.png',
?????????????????????????????axis=1)
...

3. 總結(jié)

通過上面的操作,每次只需要輸入項目類型、迭代版本號、要統(tǒng)計的 Bug 類型,就能統(tǒng)計出所需要的數(shù)據(jù)并繪制成圖表

到此這篇關(guān)于利用Python統(tǒng)計Jira數(shù)據(jù)并可視化的文章就介紹到這了,更多相關(guān)Python統(tǒng)計Jira數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實現(xiàn)多進程之間共享變量

    Python實現(xiàn)多進程之間共享變量

    Python多線程和多進程之間共享變量的方法有所不同,多線程可以直接使用global變量,而多進程則需要使用multiprocessing庫中的Value、Array、Queue等或Manager模塊,Pool進程池中進程間共享變量時,必須使用Manager模塊,在共享list時,不能直接賦值
    2024-11-11
  • Python實現(xiàn)微信好友數(shù)據(jù)爬取及分析

    Python實現(xiàn)微信好友數(shù)據(jù)爬取及分析

    這篇文章會基于Python對微信好友進行數(shù)據(jù)分析,這里選擇的維度主要有:性別、頭像、簽名、位置,主要采用圖表和詞云兩種形式來呈現(xiàn)結(jié)果,其中,對文本類信息會采用詞頻分析和情感分析兩種方法,感興趣的小伙伴可以了解一下
    2021-12-12
  • Python字典循環(huán)添加一鍵多值的用法實例

    Python字典循環(huán)添加一鍵多值的用法實例

    今天小編就為大家分享一篇Python字典循環(huán)添加一鍵多值的用法實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python 3.10 的首個 PEP 誕生,內(nèi)置類型 zip() 迎來新特性(推薦)

    Python 3.10 的首個 PEP 誕生,內(nèi)置類型 zip() 迎來新特性(推薦)

    這篇文章主要介紹了Python 3.10 的首個 PEP 誕生,內(nèi)置類型 zip() 迎來新特性,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 3段Python圖像處理的實用代碼的分享

    3段Python圖像處理的實用代碼的分享

    這篇文章主要介紹了3段Python圖像處理的實用代碼的分享,計算機視覺方向的Python實用代碼,用到多種庫具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06
  • Pandas告警UserWarning:pandas?only?supports?SQLAlchemy?connectable處理方式

    Pandas告警UserWarning:pandas?only?supports?SQLAlchemy?conn

    這篇文章主要給大家介紹了關(guān)于Pandas告警UserWarning:pandas only supports SQLAlchemy connectable的處理方式,文中還分享了pandas還有哪些userwarning,對大家學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-02-02
  • OpenCV半小時掌握基本操作之圖像裁剪融合

    OpenCV半小時掌握基本操作之圖像裁剪融合

    這篇文章主要介紹了OpenCV基本操作之圖像裁剪融合,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • vue.js刷新當前頁面的實例講解

    vue.js刷新當前頁面的實例講解

    在本篇文章里小編給各位分享了一篇關(guān)于vue.js刷新當前頁面的實例講解,有興趣的朋友們可以學(xué)習(xí)參考下。
    2020-12-12
  • Python三級菜單的實例

    Python三級菜單的實例

    下面小編就為大家?guī)硪黄狿ython三級菜單的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Python中通用的文本相似度計算方法詳解

    Python中通用的文本相似度計算方法詳解

    這篇文章主要為大家詳細介紹了三種Python中通用的文本相似度計算方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04

最新評論

岫岩| 彩票| 徐闻县| 东至县| 奉新县| 尼勒克县| 兴海县| 莲花县| 六盘水市| 定陶县| 自治县| 伊金霍洛旗| 临江市| 涟源市| 泾川县| 大名县| 台中县| 东乡县| 芦溪县| 综艺| 津南区| 新乐市| 定兴县| 山阴县| 三亚市| 华容县| 山东| 攀枝花市| 大渡口区| 咸丰县| 财经| 资溪县| 波密县| 黄梅县| 洪洞县| 霍邱县| 福海县| 繁昌县| 尉犁县| 绥化市| 綦江县|