当前位置: 首页 > 后端技术 > Python

练习-如何使用Python对Jira数据进行统计和可视化

时间:2023-03-26 13:25:19 Python

目前公司使用Jira作为项目管理工具。在每次迭代后的回顾会上,我们需要对本次迭代的BUG进行数据统计,以帮助管理本文将介绍如何使用统计Jira数据并可视化1.准备工作首先安装Python依赖库#安装依赖librarypip3installjirapip3installhtml-tablepip3installpyechartspip3installsnapshot_seleniumwherejira使用jsql语法从项目中获取需要的数据。html-table用于生成HTML格式的表格数据pyecharts,snapshot_selenium用于数据可视化。2、我们通过7个步骤实现以上功能\2-1登录获取客户端连接对象fromjiraimportJIRAclassJiraObj(object):def__init__(self,bug_style,project_type):""":paramproject_names:paramproject_name:伪代码:parambug_style:BUG状态"""#Jira主页地址self.server='https://jira.**.team'#Jira登录账号信息self.basic_auth=('username','password')#创建客户端连接信息self.jiraClinet=JIRA(server=self.server,basic_auth=self.basic_auth)2-2根据物品类型获取看板id...#获取看板看板#所有看板信息boards=[(item.id,item.name)为自己的项目。jiraClinet.boards()]board_id=self.__get_board_id(boards,project_type)print("看板id:",board_id)...def__get_board_id(self,boards,project_type):"""获取看板defdef__get_board_id(self,boards,project_type):“”返回:“”Board_id=1foriteminBoards:If(Project_type==Proj_type1anditem[1]=='T1')or(project_type==Proj_type2anditem[1]==']):board_id=item[0]breakbreakreturnboard_id..2-3根据看板id获取迭代id和迭代名称...#获取项目Sprint,让用户选择sprintsid=self.jiraardClinet_board)boarditeminsprints:ifstr(sprint_no)initem.name:self.sprint_id=item.idself.sprint_name=item.namesprint_name:{self}")break...2-4根据项目名称,bug类型,迭代id分组成jsql?语句,并查询数据...?def?get_bug_status_jsql(self,?bug_status:?BUG_STATUS):????????"""????????通过bug状态,获取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:????????????#?关闭????????????status_jsql?=?'?AND?status?=?Closed?'????????elif?bug_status?==?BUG_STATUS.TO_FIXED_CONTAIN_DELAY:????????????#?待解决(打开、重新打开、processing,deferredprocessing)status_jsql='ANDstatusin(open,deferredprocessing,reopen,processing)'returnstatus_jsql...jql=f'project={project_name}andissuetype=failure{self.get_bug_status_jsql(self.bug_style)}ANDSprint={self.sprint_id}ORDERBYprioritydesc,updatedDESC'print(jql)lists=self.get_issue_list(jql)...2-5生成本地HTML统计,需要注意的是用a标签组装的链接不能直接重定向,需要针对数据FromHTMLTableimport(HTMLTable)...defgen_html_table(self,datas):"""初始化表单样式:return:"""table=HTMLTable(caption=f'real-timeBUGstatistics[{self.project_name}],一共{len(datas)}')#表头行table.append_header_rows((('ID','Status','Priority','负责人','Terminal','URL'),))#添加数据table.append_data_rows(datas)#设置样式table.caption.set_style({'font-size':'15px'})#其他样式设置...方便显示#替换数据href地址html=table.to_html().replace("<","<").replace(">",">").replace(""",'"')withopen(f"./output/{self.project_name}-bug_{current_time()}.html",'w',encoding='utf-8')作为文件:file.write(html)...#生成本地文件数据output_tuples=tuple([(item.get("key"),item.get("status"),item.get("priority"),item.get('duty'),item.get('end_type'),f'点我查看')foriteminlists])#生成本地HTML文件self.gen_html_table(output_tuples)..2-6数据统计这里首先按bug负责人分组,然后按编号降序排列。然后,按错误优先级降序排序。最后,获取每一端的错误总数\...#2.统计每个人(按数量)datas_by_count={}foriteminlists:datas_by_count[item.get("duty")]=datas_by_count.get(item.get("duty"),0)+1#降序排序datas_by_count=sorted(datas_by_count.items(),key=lambdaitem:item[1],reverse=True)#print("按错误总数排序:",datas_by_count)#3、统计每个人(按优先级)datas_by_priority={}foritemindatas_by_count:#负责人姓名=item[0]#5个优先级对应的个数counts=self。,item[1][1],item[1][2],item[1][3]),reverse=True)#print("SortbyBugpriority:",datas_by_priority)#4.根据终端统计分类keys,values=self.get_end_type_count(lists)...2-7可视化以上3组数据,使用pyecharts绘制直方图和饼图\...defdraw_image(self,datas_by_count,datas_by_priority,keysValues):"""""ParamValues::ParamKeys::ParamDatas_by_Count:对错误总数进行排序:paramdatas_by_priority:按错误优先级排序:""#1,按错误总数排序。bar=(Bar().set_global_opts(title_opts=opts.TitleOpts(title=f"{self.project_name}",subtitle=f"{self.sprint_name}")))bar.add_xaxis([item[0]foritemindatas_by_count])bar.add_yaxis(f"BUGtotal",[item[1]foritemindatas_by_count])#render会生成一个本地的HTML文件,这个文件会生成在当前目录默认render.html文件#路径参数也可以传入,如bar.render("mycharts.html")#bar.render(path=f'{sprint_name}-BUGtotal.html')make_snapshot(snapshot,bar.render(),"./output/1.png")#2.按优先级绘制bar2=(#Bar(init_opts=opts.InitOpts(theme=ThemeType.INFOGRAPHIC))Bar()mxaxis0.add_fordatas_by_priority中的项目]).add_yaxis(self.__get_priority(bug_priority.highest),[item[1][1][0]fordatas_by_briority],color='#6aaa84f'.High),[item[1][1]foritemindatas_by_priority],color='#a2c4c9').add_yaxis(self.__get_priority(BUG_PRIORITY.Medium),[item[1][2对于datas_by_priority中的项目],color=“#ff9900”).add_yaxis(self.__get_priority(bug_priority.low),[datas_by_by_priority]中的项目[item[1][3],color=“。=f"{self.sprint_name}")))#bar2.render(path=f'{sprint_name}-BUG优先级.html')make_snapshot(snapshot,bar2.render(),”./output/2.png“)#3,,根据终端饼图饼图饼图值)]).set_global_opts(title_opts=opts.TitleOpts(title="每一端的BUG分布")).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{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',通过上述操作,每次,只能通过输入项目类型,迭代版本编号和要计数的错误类型来计算所需的数据。图以上就是本次分享的全部内容,如果你觉得文章还不错,请关注公众号:Python编程学习圈,每日干货分享,发送“J”还能领取大量学习资料,内容涵盖Python电子书、教程、数据库编程、Django、爬虫、云计算等。或前往编程学习网了解更多编程知识技术知识。