diff --git a/parse_test_results.py b/parse_test_results.py index 409f36333f65807587f6e611c13288961f6fadd1..a1b36340816c246007618843499afaad0f897669 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_data() + + # 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 aea5429ba9f0177df8c8fbeb46418fb838b46999..1591275ffc04ca33f6a0eae0b067df32a175192a 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 @@ -79,6 +80,65 @@ class ExcelWriter: 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() + + # 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 + 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.title = "PASS/FAIL Distribution" + + chart_work_sheet.add_chart(pie, "E1") + + def get_pass_fail_counts(self): + """ + Return PASS/FAIL stats as tuple (# of PASS, # of FAIL) + """ + + # Get data from main work sheet + last_row = self.get_last_row() + 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): """ Save workbook to disk.