Jiraベースの欠陥自動レポート分析(7)matplotlib円グラフ:欠陥の重大度の分布

1つは、描画クラスをカプセル化する

1.モジュールをインポートします

# coding=utf-8
import matplotlib.pyplot as plt

 

2.中国語とマイナス記号の文字化けした表示を解決します

plt.rcParams['font.sans-serif'] = ['simhei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

 

3.パッケージ図

統計グラフを描いた後、保存するためのパスが必要です

class Draw:
    """
    绘图
    """
    def __init__(self, reportpath):
        self.reportpath = reportpath

 

4.円グラフを描画します(重複を避けるために1より大きいデータのみを表示します)

    # 只显示>1标签
    def my_autopct(self, pct, limit=1):
        return ('%.2f%%' % pct) if pct > limit else ''

    def drawing_cake(self, amounts, lebals, project_name, title):
        """
        绘制饼状图
        :param amounts:数量列表
        :param lebals:图例
        :param project_name:项目名称(用于保存路径、文件名称)
        :param title:标题(用于保存路径、文件名称)
        """
        plt.figure(figsize=(10, 10))
        indic = []
        # 将数据最大的突出显示
        for value in amounts:
            if value == max(amounts):
                indic.append(0.1)
            else:
                indic.append(0)
        plt.pie(amounts,
                # labels=lebals,
                startangle=90,  # 起始角度
                shadow=True,  # 阴影
                # 是否分割出饼图的哪一块 默认是None,不分割的时候为0,分割的时候传入0.1
                explode=tuple(indic),  # tuple方法用于将列表转化为元组
                autopct=self.my_autopct  # 比例数值格式
                # autopct='%1.2f%%'
                )
        # 给图像加上图例,并显示在左上方
        plt.legend(lebals, loc='upper left')
        plt.title(project_name + ' ' + title)
        filename = self.reportpath + "/" + project_name + ' ' + title + ".png"
        plt.savefig(filename)
        plt.show()
        plt.cla()
        plt.close("all")


    def drawing_histogram_tied(self):
        """
        绘制柱状图,见后文
        """
        pass


    def drawing_linechart_more(self):
        """
        绘制折线图,见后文
        """
        pass

        

 

2、パッケージ円グラフのデータ統計

1.依存モジュールをインポートします

# coding=utf-8
from ana_jira import Ana_jira
from draw import Draw

 

2.パッケージデータ統計

class Cake:
    def __init__(self, project_name, test_jira, first_day, last_day, types, weeks, report_path):
        self.project_name = project_name
        self.test_jira = test_jira
        self.first_day = first_day
        self.last_day = last_day
        self.types = types
        self.weeks = weeks
        self.report_path = report_path

 

3.統計的欠陥重大度分布

方法1:

JQL統計を直接照会する

def cake(self, ana_type):
    """
    绘制饼状图(严重性分布、优先级分布)
    :param project_name:
    :return:
    """
    # ana_type = '严重性'
    # 获取不同优先级\严重等级JQL
    amount = []
    severity = []
    for i in self.types[ana_type]:
        severity.append(i)
        serch_jql = """
        project = "{}" AND {} = {} AND created >= {} AND created <= {}
        """.format(self.project_name, ana_type, i, self.first_day, self.last_day)
        onetypy_numbers = Ana_jira(self.test_jira, serch_jql).req_jira()
        amount.append(onetypy_numbers)  # 缺陷数量列表
    #   绘制饼状图: 优先级\严重性
    if sum(amount) > 0:
        # severity = ['Fatal', 'Severe', 'Average', 'Minor']
        Draw(self.report_path).drawing_cake(amount, severity, self.project_name,
                                            'Issues Severity Distribution (Iteration Week)')
        print('项目{}最近{}周{}分布情况统计完成'.format(self.project_name, self.weeks, ana_type))

    else:
        print('项目{}最近{}周未提交缺陷,无法统计{}分布情况'.format(self.project_name, self.weeks, ana_type))
 def cake_repairs_cycle(self):
    """
    绘制饼图:修复周期(见后文)
    :param project_name:
    :return:
    """
    pass

 

方法2:

データベースの欠陥レコード、つまりjira_issuesテーブルをクエリして、欠陥の重大度の分布を取得します

def cake_db(self):
    sql = """
    SELECT severity_level,COUNT(id) AS amount 
    FROM jira_issues 
    WHERE project='{}' AND created BETWEEN '{}' AND '{}' 
    GROUP BY project,severity_level
    """.format(self.project_name, self.first_day, self.last_day)
    from common.mysqluntil import MysqlUntil
    results = MysqlUntil().mysql_select(sql)
    amount, severity = [], []
    for result in results:
        severity.append(result['severity_level'])
        amount.append(result['amount'])
    if sum(amount) > 0:
        # severity = ['Fatal', 'Severe', 'Average', 'Minor']
        Draw(self.report_path).drawing_cake(amount, severity, self.project_name,
                                            'Issues Severity Distribution (Iteration Week)')
        print('项目{}最近{}周统计完成'.format(self.project_name, self.weeks))

    else:
        print('项目{}最近{}周未提交缺陷,无法统计分布情况'.format(self.project_name, self.weeks))

 

方法3

欠陥の重大度分布は、以前の方法と同じテスター統計テーブルから計算することもできます。

 

3.統計を実行し、欠陥の重大度分布をプロットします

1.カウントする期間に応じて日付を取得します()

from datetime import datetime
import time
import datetime

 過去N週間のすべての日付のリストを取得します

# 获取前N周的所有日期(weeks=N)
def getBeforeWeekDays(self, weeks):
    # 0,1,2,3,4,5,6,分别对应周一到周日
    week = datetime.datetime.now().weekday()
    start = 7 * weeks + week
    end = week
    days_list = []
    for index in range(start, end, -1):
        day = self.getdate(index)
        days_list.append(day)
    return days_list

 ここに判断を追加します。制限の下で、最大統計期間は4週間です。期間は通常、反復期間であり、反復は長すぎてはなりません。統計グラフは、期間が長すぎて簡単に実行できることを示しています。問題を引き起こします。

weeks = 2  # 缺陷统计N周前的数据
if isinstance(weeks, int):
    if 1 <= weeks <= 4:
        weeks = int(weeks)
    else:
        weeks = 2
else:
    weeks = 2

# 缺陷统计分析的开始日期、结束日期
days_list = getBeforeWeekDays(weeks)
first_day, last_day = days_list[0], days_list[-1]

 

2.レポートの保存パスを取得します

import os

 現在のパスに従って保存パスを設定します

file_path_now = os.path.abspath('.')  # 获取当前目录
report_path = file_path_now + "/report/" + date_now    # 拼接图片存储地址(拼接时间,以防重复被覆盖)
# 如果不存在,新建一个文件夹
if not os.path.exists(report_path):
    os.mkdir(report_path)

 

3.統計タイプを定義します

types = {
        '优先级': ['Highest', 'High', 'Medium', 'Low', 'Lowest'],
        '严重性': [u'致命', u'严重', u'一般', u'优化']
    }

 

4.統計を実行し、レポート統計を表示します

c = Cake(project_name, test_jira, first_day, last_day, types, weeks, project_report_path)
c.cake('严重性')  # (项目)严重性分布、优先级分布
c.cake_db()

 

 

 

おすすめ

転載: blog.csdn.net/kk_gods/article/details/110819560