目前公司使用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'
