From c46f047880e0c7ae8d77ba22b4559ebc4bae2100 Mon Sep 17 00:00:00 2001 From: Frank Bryden Date: Thu, 23 Jul 2020 17:41:50 +0200 Subject: [PATCH 1/2] WIP to include pie chart in separate work sheet Signed-off-by: Frank Bryden --- parse_test_results.py | 9 +++++-- write_excel.py | 55 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 59 insertions(+), 5 deletions(-) diff --git a/parse_test_results.py b/parse_test_results.py index 409f363..30c1393 100644 --- a/parse_test_results.py +++ b/parse_test_results.py @@ -19,16 +19,15 @@ class TestOutputParser: """ def __init__(self, input_file, output_file): self.test_entries = [] - self.load_file(input_file) self.api = "" self.output_file = output_file self.robot_file_contents = "" + self.load_file(input_file) def load_file(self, fname): """ Load xml file """ - with open(fname, "r", encoding="utf8") as robot_file: self.robot_file_contents = robot_file.read() @@ -40,6 +39,7 @@ class TestOutputParser: """ Run parser, extracting all info to create the test entries """ + soup = BeautifulSoup(self.robot_file_contents, "lxml") # Suite information @@ -60,6 +60,11 @@ class TestOutputParser: excel_writer = ExcelWriter(self.output_file) for entry in self.test_entries: excel_writer.write_test_entry(entry) + + # Write chart + excel_writer.write_pie_chart() + + # And finally, save the work book excel_writer.save() def create_test_entry(self, xml_obj): diff --git a/write_excel.py b/write_excel.py index aea5429..be7ca93 100644 --- a/write_excel.py +++ b/write_excel.py @@ -6,6 +6,7 @@ from openpyxl import Workbook, load_workbook from openpyxl.utils import get_column_letter from openpyxl.styles import Font from openpyxl.styles.fills import PatternFill +from openpyxl.chart import PieChart, Reference class ExcelWriter: """ @@ -15,9 +16,9 @@ class ExcelWriter: PASS_COL = "00FF00" FAIL_COL = "FF0000" def __init__(self, output_file): + self.output_file = output_file self.work_book = self.get_workbook() self.work_sheet = self.work_book.active - self.output_file = output_file def get_entry_with_id(self, test_id): """ @@ -42,13 +43,13 @@ class ExcelWriter: for cell in self.work_sheet["A"]: if cell.value is None: return cell.row - return 1 + return cell.row + 1 def write_test_entry(self, test_entry): """ Write a test entry to the work_sheet """ - existing_entry_row = self.get_entry_with_id(test_entry.id) + existing_entry_row = self.get_entry_with_id(test_entry.test_id) last_row = self.get_last_row() # Use the above two values to pick a row entry_row = existing_entry_row if existing_entry_row != -1 else last_row @@ -78,6 +79,54 @@ class ExcelWriter: work_book = Workbook() init_workbook(work_book) return work_book + + def get_chart_work_sheet(self): + """ + Returns work sheet where charts will be drawn to. + Creates if does not exist + """ + try: + chart_work_sheet = self.work_book["charts"] + return chart_work_sheet + except KeyError: + return self.work_book.create_sheet("charts") + + def write_pie_chart_data(self): + """ + Writes pie chart data (the charts sheet) required to construct the pie chart later + """ + chart_work_sheet = self.get_chart_work_sheet() + + # Get data from main work sheet + last_row = self.get_last_row() + data = Reference(self.work_sheet, min_col=3, max_col=3, min_row=2, max_row=last_row) + + # Construct pie chart + pie = PieChart() + pie.add_data(data, titles_from_data=True) + #pie.set_categories(labels) + pie.title = "PASS/FAIL Distribution" + + chart_work_sheet.add_chart(pie, "A1") + + def write_pie_chart(self): + """ + Writes a pie chart showing PASS/FAIL stats. + Writes the chart to a separate work sheet. + """ + chart_work_sheet = self.get_chart_work_sheet() + + # Get data from main work sheet + last_row = self.get_last_row() + data = Reference(self.work_sheet, min_col=3, max_col=3, min_row=2, max_row=last_row) + + # Construct pie chart + pie = PieChart() + pie.add_data(data, titles_from_data=True) + #pie.set_categories(labels) + pie.title = "PASS/FAIL Distribution" + + chart_work_sheet.add_chart(pie, "A1") def save(self): """ -- GitLab From ae78647144eefca55e9a50ab2a24e162fda19a4a Mon Sep 17 00:00:00 2001 From: Frank Bryden Date: Fri, 24 Jul 2020 11:28:53 +0200 Subject: [PATCH 2/2] Produced spreadsheet now contains pass/fail pie chart Signed-off-by: Frank Bryden --- parse_test_results.py | 4 ++-- write_excel.py | 53 ++++++++++++++++++++++++++----------------- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/parse_test_results.py b/parse_test_results.py index 30c1393..a1b3634 100644 --- a/parse_test_results.py +++ b/parse_test_results.py @@ -60,9 +60,9 @@ class TestOutputParser: excel_writer = ExcelWriter(self.output_file) for entry in self.test_entries: excel_writer.write_test_entry(entry) - + # Write chart - excel_writer.write_pie_chart() + excel_writer.write_pie_chart_data() # And finally, save the work book excel_writer.save() diff --git a/write_excel.py b/write_excel.py index be7ca93..1591275 100644 --- a/write_excel.py +++ b/write_excel.py @@ -79,7 +79,7 @@ class ExcelWriter: work_book = Workbook() init_workbook(work_book) return work_book - + def get_chart_work_sheet(self): """ Returns work sheet where charts will be drawn to. @@ -90,43 +90,54 @@ class ExcelWriter: return chart_work_sheet except KeyError: return self.work_book.create_sheet("charts") - + def write_pie_chart_data(self): """ Writes pie chart data (the charts sheet) required to construct the pie chart later """ chart_work_sheet = self.get_chart_work_sheet() + # Format data from main work sheet and insert into charts sheet + + # Titles + chart_work_sheet["A2"] = "PASS" + chart_work_sheet["A3"] = "FAIL" + + #Data + data = self.get_pass_fail_counts() + chart_work_sheet.cell(row=2, column=2).value = data[0] + chart_work_sheet.cell(row=3, column=2).value = data[1] + # Get data from main work sheet - last_row = self.get_last_row() - data = Reference(self.work_sheet, min_col=3, max_col=3, min_row=2, max_row=last_row) + data = Reference(chart_work_sheet, min_col=2, max_col=2, min_row=2, max_row=3) + labels = Reference(chart_work_sheet, min_col=1, max_col=1, min_row=2, max_row=3) # Construct pie chart pie = PieChart() - pie.add_data(data, titles_from_data=True) - #pie.set_categories(labels) + pie.add_data(data)#, titles_from_data=True) + pie.set_categories(labels) pie.title = "PASS/FAIL Distribution" - chart_work_sheet.add_chart(pie, "A1") - - def write_pie_chart(self): + chart_work_sheet.add_chart(pie, "E1") + + def get_pass_fail_counts(self): """ - Writes a pie chart showing PASS/FAIL stats. - Writes the chart to a separate work sheet. + Return PASS/FAIL stats as tuple (# of PASS, # of FAIL) """ - chart_work_sheet = self.get_chart_work_sheet() # Get data from main work sheet last_row = self.get_last_row() - data = Reference(self.work_sheet, min_col=3, max_col=3, min_row=2, max_row=last_row) - - # Construct pie chart - pie = PieChart() - pie.add_data(data, titles_from_data=True) - #pie.set_categories(labels) - pie.title = "PASS/FAIL Distribution" - - chart_work_sheet.add_chart(pie, "A1") + pass_count = 0 + fail_count = 0 + for row in self.work_sheet.iter_rows(min_col=3, max_col=3, min_row=2, max_row=last_row - 1): + for cell in row: + if cell.value == "PASS": + pass_count += 1 + elif cell.value == "FAIL": + fail_count += 1 + else: + print("ERROR: unknown value {}".format(cell.value)) + return (pass_count, fail_count) def save(self): """ -- GitLab