利用Python统计Jira数据并可视化

目录
  • 1. 准备
  • 2. 实战一下
  • 3. 总结

大家好,我是安果!

目前公司使用 Jira 作为项目管理工具,在每一次迭代完成后的复盘会上,我们都需要针对本次迭代的 Bug 进行数据统计,以帮助管理层能更直观的了解研发的代码质量

本篇文章将介绍如何利用统计 Jira 数据,并进行可视化

1. 准备

首先,安装 Python 依赖库

# 安装依赖库
pip3 install jira
pip3 install html-table
pip3 install pyecharts
pip3 install snapshot_selenium

其中

  • jira 使用 jsql 语法从在项目中获取需要的数据
  • html-table 用于生成一个 HTML 格式的表格数据
  • pyecharts 和 snapshot_selenium 用于数据可视化

2. 实战一下

下面我们通过 7 个步骤来实现上面的功能

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状态
        """
        # Jira首页地址
        self.server = 'https://jira.**.team'

        # Jira登录账号信息
        self.basic_auth = ('用户名', '密码')

        # 创建一个客户端连接信息
        self.jiraClinet = JIRA(server=self.server, basic_auth=self.basic_auth)

2-2 根据项目类型获取看板 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 根据看板 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  根据项目名、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:
            # 待解决(打开、重新打开、处理中、延期处理)
            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 统计数据

需要注意的是,使用 a 标签组装的链接不能直接跳转,需要针对数据进行二次替换才能正常进行链接跳转

from HTMLTable import (
    HTMLTable
)

...
 def gen_html_table(self, datas):
        """
        初始化表单样式
        :return:
        """
        table = HTMLTable(caption=f'实时BUG统计【{self.project_name}】,一共{len(datas)}个')

        # 表头行
        table.append_header_rows((('ID', '状态', '优先级', '责任人', '终端', 'URL'),))

        # 添加数据
        table.append_data_rows(datas)

        # 设置样式
        table.caption.set_style({'font-size': '15px'})

        # 其他样式设置
        ...

        # 替换数据,便于展示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)
...
# 生成本地文件的数据
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 数据统计

首先,这里按 Bug 责任人进行分组,然后按数目进行降序排列

然后,按 Bug 优先等级进行降序排列

最后,获取每一个端的 Bug 总数

...
        # 2、统计每个人(按数目)
        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总数排序:", datas_by_count)

        # 3、统计每个人(按优先级)
        datas_by_priority = {}

        for item in datas_by_count:
            # 责任人
            name = item[0]
            # 5个优先级对应的数目
            counts = self.get_assignee_count(lists, name)
            datas_by_priority[name] = counts

        # 排序(按优先级多条件降序排列)
        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优先级排序:", datas_by_priority)

        # 4、根据终端进行统计分类
        keys, values = self.get_end_type_count(lists)
...

2-7 可视化

针对上面的 3 组数据,使用 pyecharts 绘制成柱状图和饼状图

...
      def draw_image(self, datas_by_count, datas_by_priority, keys, values):
        """
        绘制图片
        :param values:
        :param keys:
        :param datas_by_count: 按bug总数排序结果
        :param datas_by_priority: 按bug优先级排序结果
        :return:
        """
        # 1、按BUG总数排序绘制
        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总数", [item[1] for item in datas_by_count])

        # render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件
        # 也可以传入路径参数,如 bar.render("mycharts.html")
        # bar.render(path=f'{sprint_name}-BUG总数.html')
        make_snapshot(snapshot, bar.render(), "./output/1.png")

        # 2、按优先级排序绘制
        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优先级.html')
        make_snapshot(snapshot, bar2.render(), "./output/2.png")

        # 3、根据终端来绘制饼图
        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="{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',
                             axis=1)
...

3. 总结

通过上面的操作,每次只需要输入项目类型、迭代版本号、要统计的 Bug 类型,就能统计出所需要的数据并绘制成图表

到此这篇关于利用Python统计Jira数据并可视化的文章就介绍到这了,更多相关Python统计Jira数据内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python用Jira库来操作Jira

    Jira简介 Jira是一款功能非常强大的管理工具,广泛的用来 缺陷跟踪.用例管理.需求收集.任务跟踪.工时管理.项目计划管理等工作领域.所以使用这款产品的公司很多,这篇博客讲述在执行自动化测试用例过程中,将失败的用例自动在jira系统记录bug. 提供了完善的RESTful API,如果不想直接请求API接口可以使用Python的Jira库来操作Jira. 官方文档 一.安装 # 安装第三方jira库 pip install jira 二.认证 官网提供了4种认证方式: Cookie Base

  • Python中Cookies导出某站用户数据的方法

    应朋友需要,想将某客户的数据从某站里导出,先去某站搞个账号,建几条数据观察一番,心里有底后开搞. 1.Python环境搭建 之前电脑有安装过PyCharm Community 2019.1,具体安装过程就不写了,先跑个HelloWorld,输出正常后正式开整. 2.利用抓包工具或者Google浏览器调试模式拿到请求参数 Cookies参数如下: cookies = { 'JSESSIONID': 'XXX', 'phone': 'XXX', 'password': 'XXX', 'isAuto'

  • python操作jira添加模块的方法

    目录 JIRA介绍: python操作jira 首先安装jira模块 导入jira模块 编写添加模块代码 获取当前项目的模块信息 从excel表读取信息 主方法中调用添加模块等方法 JIRA介绍: JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域. 在开发工作中,Jira通常用作BUG管理和任务跟踪管理等,项目经理,测试人员,开发人员等在Jira上进行提交BUG,提交任务,修改任务进度等操作. 当项目逐渐多

  • Python操作Jira库常用方法解析

    Jira提供了完善的RESTful API,如果不想直接请求API接口可以使用Python的Jira库来操作Jira Jira Python文档 安装方法 pip install jira 认证 Jira的访问是有权限的,在访问Jira项目时首先要进行认证,Jira Python库提供了3种认证方式: 通过Cookis方式认证(用户名,密码) 通过Basic Auth方式认证(用户名,密码) 通过OAuth方式认证 认证方式只需要选择一种即可,以下代码为使用Cookies方式认证. form j

  • Python 统计Jira的bug 并发送邮件功能

    1.首先在pycharm上使用pip安装 pip install html-table pip install jira 2.初始化发件人邮箱,账号,密码 # 发件人邮箱账号 my_sender = 'username@xxx.com.cn' # user登录邮箱的用户名,password登录邮箱的密码(授权码,即客户端密码,非网页版登录密码),但用腾讯邮箱的登录密码也能登录成功 my_pass = 'xxxxx' # 收件人邮箱账号 my_users=['username@xxx.com.cn

  • 利用Python统计Jira数据并可视化

    目录 1. 准备 2. 实战一下 3. 总结 大家好,我是安果! 目前公司使用 Jira 作为项目管理工具,在每一次迭代完成后的复盘会上,我们都需要针对本次迭代的 Bug 进行数据统计,以帮助管理层能更直观的了解研发的代码质量 本篇文章将介绍如何利用统计 Jira 数据,并进行可视化 1. 准备 首先,安装 Python 依赖库 # 安装依赖库 pip3 install jira pip3 install html-table pip3 install pyecharts pip3 instal

  • 利用python对月饼数据进行可视化(看看哪家最划算)

    目录 前言 数据 代码 效果 尾语 前言 中秋节,又称拜月节.月光诞.月夕等,节期在每年的农历八月十五日(九月十). 中秋节自古以来就有祭月.赏月.吃月饼.玩花灯.赏桂花.饮桂花酒等民俗,流传经久不息. 马上有临近中秋,这不得好好准备~于是准备对月饼数据进行可视乎 数据 代码 # 导包 import pandas as pd import numpy as np import re # author:Dragon少年 # 导入爬取得到的数据 df = pd.read_csv("月饼.csv&qu

  • 利用Python代码实现数据可视化的5种方法详解

    前言 数据科学家并不逊色于艺术家.他们用数据可视化的方式绘画,试图展现数据内隐藏的模式或表达对数据的见解.更有趣的是,一旦接触到任何可视化的内容.数据时,人类会有更强烈的知觉.认知和交流. 数据可视化是数据科学家工作中的重要组成部分.在项目的早期阶段,你通常会进行探索性数据分析(Exploratory Data Analysis,EDA)以获取对数据的一些理解.创建可视化方法确实有助于使事情变得更加清晰易懂,特别是对于大型.高维数据集.在项目结束时,以清晰.简洁和引人注目的方式展现最终结果是非常

  • 利用python将json数据转换为csv格式的方法

    假设.json文件中存储的数据为: {"type": "Point", "link": "http://www.dianping.com/newhotel/22416995", "coordinates": [116.37256372996957, 40.39798447055443], "category": "经济型", "name": &qu

  • python统计mysql数据量变化并调用接口告警的示例代码

    统计每天的数据量变化,数据量变动超过一定范围时,进行告警.告警通过把对应的参数传递至相应接口. python程序如下 #!/usr/bin/python # coding=utf-8 import pymysql as mdb import os import sys import requests import json tar_conn = mdb.connect(host='192.168.56.128',port=3306,user='xxx',passwd='xxx123',db='b

  • Python抓取数据到可视化全流程的实现过程

    目录 1.爬取目标网站:业绩预告_数据中心_同花顺财经 2.获取序号.股票代码.等你所需要的信息 3.组成DataFrame 4.处理数据 1.爬取目标网站:业绩预告_数据中心_同花顺财经 (ps:headers不会设置的可以看这篇:Python 用requests.get获取网页内容为空 ’ ’) import pandas as pd import numpy as np import matplotlib.pyplot as plt import re import requests##把

  • 手把手教你Python抓取数据并可视化

    目录 前言 一.数据抓取篇 1.简单的构建反爬措施 2.解析数据 3.完整代码 二.数据可视化篇 1.数据可视化库选用 2.案例实战 (1).柱状图Bar (2).地图Map (3).饼图Pie (4).折线图Line (5).组合图表 总结 前言 大家好,这次写作的目的是为了加深对数据可视化pyecharts的认识,也想和大家分享一下.如果下面文章中有错误的地方还请指正,哈哈哈!!!本次主要用到的第三方库: requests pandas pyecharts 之所以数据可视化选用pyechar

  • 利用python如何处理nc数据详解

    前言 这两天帮一个朋友处理了些 nc 数据,本以为很简单的事情,没想到里面涉及到了很多的细节和坑,无论是"知难行易"还是"知易行难"都不能充分的说明问题,还是"知行合一"来的更靠谱些,既要知道理论又要知道如何实现,于是经过不太充分的研究后总结成此文,以记录如何使用 python 处理 nc 数据. 一.nc 数据介绍 nc 全称 netCDF(The Network Common Data Form),可以用来存储一系列的数组,就是这么简单(参考

  • 利用Python绘制MySQL数据图实现数据可视化

    本教程的所有Python代码可以在网上的IPython notebook中获取. 考虑在公司里使用Plotly?可以看一下Plotly的on-premises企业版.(注:On-premises是指软件运行在工作场所或公司内部,详见维基百科) 注意操作系统:尽管Windows或Mac用户也可以跟随本文操作,但本文假定你使用的是Ubuntu系统(Ubuntu桌面版或Ubuntu服务器版).如果你没有Ubuntu Server,你可以通过Amazon的Web服务建立一个云平台(阅读这份教程的前半部分

随机推荐