2 /******************************************************************
4 * Copyright 2018 Samsung Electronics All Rights Reserved.
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
20 ******************************************************************/
27 from xlsxwriter.workbook import Workbook
29 from ite.config import *
30 from ite.constants import *
31 from ite.result.collector import TestResultCollector
32 from ite.tc.container import TestSpecContainer
33 from ite.reporter.excel_util import *
34 from ite.reporter.reporter_util import *
35 from ite.util import *
37 class TestResultReporter:
46 def make_summary(self, data):
47 for platform in TEST_PLATFORM:
48 if not platform in data:
51 self.summary[platform] = dict()
52 self.failtc[platform] = dict()
53 self.passtc[platform] = dict()
55 for target in data[platform]:
56 self.summary[platform][target] = dict()
57 self.failtc[platform][target] = dict()
58 self.passtc[platform][target] = dict()
60 for build_type in data[platform][target]:
61 self.summary[platform][target][build_type] = dict()
62 self.failtc[platform][target][build_type] = dict()
63 self.passtc[platform][target][build_type] = dict()
65 for transport in data[platform][target][build_type]:
66 self.summary[platform][target][build_type][transport] = dict()
67 self.failtc[platform][target][build_type][transport] = dict()
68 self.passtc[platform][target][build_type][transport] = dict()
70 for network in data[platform][target][build_type][transport]:
71 self.summary[platform][target][build_type][transport][network] = dict()
72 self.failtc[platform][target][build_type][transport][network] = dict()
73 self.passtc[platform][target][build_type][transport][network] = dict()
75 for tctype in TESTCASE_TYPES:
76 self.summary[platform][target][build_type][transport][network][tctype] = dict()
77 self.failtc[platform][target][build_type][transport][network][tctype] = dict()
78 self.passtc[platform][target][build_type][transport][network][tctype] = dict()
80 for module in TESTSUITE_MODULES:
81 self.summary[platform][target][build_type][transport][network][tctype][module] = dict()
82 self.failtc[platform][target][build_type][transport][network][tctype][module] = dict()
83 self.passtc[platform][target][build_type][transport][network][tctype][module] = dict()
85 for result in TC_RESULT:
86 self.summary[platform][target][build_type][transport][network][tctype][module][result] = 0
88 if ((not tctype in list(data[platform][target][build_type][transport][network])) or (not module in list(data[platform][target][build_type][transport][network][tctype]))):
91 for suite in list(data[platform][target][build_type][transport][network][tctype][module]):
92 self.failtc[platform][target][build_type][transport][network][tctype][module][suite] = list()
93 self.passtc[platform][target][build_type][transport][network][tctype][module][suite] = list()
95 for tc_name in list(data[platform][target][build_type][transport][network][tctype][module][suite]):
96 testcase = data[platform][target][build_type][transport][network][tctype][module][suite][tc_name]
97 if (testcase.success == 0):
98 self.summary[platform][target][build_type][transport][network][tctype][module][TC_RESULT.FAIL] += 1
99 self.failtc[platform][target][build_type][transport][network][tctype][module][suite].append(testcase)
101 self.summary[platform][target][build_type][transport][network][tctype][module][TC_RESULT.PASS] += 1
102 self.passtc[platform][target][build_type][transport][network][tctype][module][suite].append(testcase)
105 def generate_testresult_report(self, path, spec_data):
106 collector = TestResultCollector()
107 collector.collect_results(path)
109 self.testspec = spec_data
111 self.make_summary(collector.result.data)
113 def report_fail_result_to_txt(self, dir_path):
114 self.report_test_result_to_txt(dir_path, self.failtc)
116 def report_pass_result_to_txt(self, dir_path):
117 self.report_test_result_to_txt(dir_path, self.passtc)
119 def report_test_result_to_txt(self, dir_path, result_suite):
120 for platform in TEST_PLATFORM:
121 if not platform in result_suite:
124 for target in result_suite[platform]:
125 for build_type in result_suite[platform][target]:
126 for transport in result_suite[platform][target][build_type]:
127 transport_name = transport
128 if transport_name == NO_TRANSPORT:
130 for network in result_suite[platform][target][build_type][transport]:
131 network_name = network
132 if network_name == NO_NETWORK:
134 new_dir = os.path.join(dir_path, '%s_%s_%s_%s_%s' %(platform, target.strip(), build_type, transport_name, network_name))
136 for tctype in result_suite[platform][target][build_type][transport][network]:
137 for module in result_suite[platform][target][build_type][transport][network][tctype]:
138 for suite in list(result_suite[platform][target][build_type][transport][network][tctype][module]):
139 for testcase in list(result_suite[platform][target][build_type][transport][network][tctype][module][suite]):
140 text_file_name = suite
141 if not ('_' + tctype.lower()) in suite.lower():
142 text_file_name += '_' + tctype.lower()
143 text_file_name += '_' + testcase.name + '_' + build_type + '.txt'
144 file_path = os.path.join(new_dir, text_file_name)
145 txt = open_write_file(file_path)
148 print("[Defect Info]", file=txt)
149 print(" Title: ", file=txt)
150 print(" Description: \n", file=txt)
152 if platform in self.testspec:
153 if tctype in self.testspec[platform]:
154 if module in self.testspec[platform][tctype]:
155 if transport in self.testspec[platform][tctype][module]:
156 if network in self.testspec[platform][tctype][module][transport]:
157 if suite in self.testspec[platform][tctype][module][transport][network]:
158 if testcase.name in self.testspec[platform][tctype][module][transport][network][suite]:
159 spec = self.testspec[platform][tctype][module][transport][network][suite][testcase.name]
160 print("[Test Case Info]", file=txt)
161 print(spec.to_string(), file=txt)
163 print("\n[Test Result]", file=txt)
164 print("Fail Rate: %d/%d\n" % (testcase.fail, testcase.fail+testcase.success), file=txt)
167 for result in testcase.runresult:
168 print("[%d Try]" % index, file=txt)
169 print("--------------------------------------------------------------------", file=txt)
170 print("Result: " + result.result, file=txt)
171 print("Run Type: " + result.runtype, file=txt)
172 print("Run Time: " + str(result.runtime), file=txt)
173 print("\n<<<Fail Message>>> \n" + result.fail_msg, file=txt)
174 print("\n<<<Test Log>>> \n" + result.test_log, file=txt)
175 print("--------------------------------------------------------------------\n\n", file=txt)
178 def report_result(self, sheet, form, report_title, result_writer, result_suite):
181 for title, size in RESULT_CAT_TITLE:
182 if (title == 'Line'):
184 sheet.write(row, col, title, form.title)
185 sheet.set_column(col, col, size)
188 for title, size in report_title:
189 sheet.write(row, col, title, form.title)
190 sheet.set_column(col, col, size)
196 def write_platform(platforms):
197 for platform in platforms:
199 platform_first_row = row
201 if not platform in result_suite:
206 yield result_suite[platform], platform
209 merge_cell(sheet, platform_first_row, col, row-1, col, platform, form.cell)
211 def write_target(platforms):
212 for platform in platforms:
213 targets, platform_name = platform
214 for target in list(targets):
216 target_first_row = row
220 yield targets[target], platform_name, target
223 merge_cell(sheet, target_first_row, col, row-1, col, target, form.cell)
225 def write_build_type(targets):
226 for target in targets:
227 build_types, platform, target = target
228 for build_type in list(build_types):
230 build_type_first_row = row
234 yield build_types[build_type], platform, target, build_type
237 merge_cell(sheet, build_type_first_row, col, row-1, col, build_type, form.cell)
239 def write_transport(build_types):
240 for build_type in build_types:
241 transports, platform, target, build_type = build_type
242 for transport in list(transports):
244 transport_first_row = row
248 yield transports[transport], platform, target, build_type, transport
251 merge_cell(sheet, transport_first_row, col, row-1, col, transport, form.cell)
254 def write_network(transports):
255 for transport in transports:
256 networks, platform, target, build_type, transport = transport
257 for network in list(networks):
259 network_first_row = row
263 yield networks[network], platform, target, build_type, transport, network
266 merge_cell(sheet, network_first_row, col, row-1, col, network, form.cell)
269 def write_tctype(networks):
270 for network in networks:
271 types, platform, target, build_type, transport, network = network
272 for tctype in list(types):
277 for module in TESTSUITE_MODULES:
278 module_count += len(types[tctype][module])
279 if module_count == 0:
284 yield TESTSUITE_MODULES, types[tctype], platform, target, build_type, transport, network, tctype
287 merge_cell(sheet, type_first_row, col, row-1, col, tctype, form.cell)
289 def write_module(tctypes):
290 for tctype in tctypes:
291 module_names, modules, platform, target, build_type, transport, network, tctype = tctype
292 for module in module_names:
294 module_first_row = row
296 if (len(list(modules[module])) == 0):
301 yield modules[module], platform, target, build_type, transport, network, tctype, module
304 merge_cell(sheet, module_first_row, col, row-1, col, module, form.cell)
306 def write_suite(modules):
307 for module in modules:
308 suites, platform, target, build_type, transport, network, tctype, module = module
309 for suite in list(suites):
311 suite_first_row = row
313 if (len(suites[suite]) == 0):
316 if not suite in suites and not suite in self.testspec[platform][build_type][tctype][module][transport][network]:
317 print ('suite not found: ', platform, tctype, module, transport, network, suite)
322 yield suites[suite], platform, target, build_type, transport, network, tctype, module, suite
325 merge_cell(sheet, suite_first_row, col, row-1, col, suite, form.cell)
327 def write_tc(suites):
329 testcases, platform, target, build_type, transport, network, tctype, module, suite = suite
330 testspec = self.testspec[platform][build_type][tctype][module][transport][network][suite]
331 for testcase in testcases:
333 row, col = result_writer(row, col, testcase, testspec, sheet, platform, target, transport, network)
336 walk_through_results(write_platform, write_target, write_build_type, write_transport, write_network, write_tctype, write_module, write_suite, write_tc)
339 def report_to_xlsx(self, path):
340 workbook = Workbook(path)
341 form = ExcelFormat(workbook)
343 summarysheet = workbook.add_worksheet('Summary')
348 summarysheet.merge_range(row, col, row+3, col, '', form.cell)
351 for platform in TEST_PLATFORM:
352 if not platform in self.summary:
358 for target in self.summary[platform]:
362 for tc_type in TESTCASE_TYPES + ('Total',):
366 for result in TC_RESULT + ('Total',):
367 summarysheet.write(row, col, result, form.result_title[result])
371 summarysheet.merge_range(row, tc_type_col, row, col-1, tc_type, form.title)
374 summarysheet.merge_range(row, target_col, row, col-1, target, form.title)
377 summarysheet.merge_range(row, platform_col, row, col-1, platform, form.title)
380 for result in TC_RESULT + ('Total','Pass Rate',):
381 summarysheet.write(row+3, col, result, form.result_title[result])
383 summarysheet.merge_range(row, total_col, row+2, col-1, "Total", form.total)
388 for module in TESTSUITE_MODULES :
390 summarysheet.write(row, col, module, form.title)
393 module_total_txt = dict()
394 for result in TC_RESULT + ('Total',):
395 module_total_txt[result] = '=SUM('
397 for platform in TEST_PLATFORM:
398 if not platform in self.summary:
401 for target in self.summary[platform]:
402 for tc_type in TESTCASE_TYPES:
403 for result in TC_RESULT:
405 for build_type in self.summary[platform][target]:
406 for transport in self.summary[platform][target][build_type]:
407 for network in self.summary[platform][target][build_type][transport]:
408 result_sum += self.summary[platform][target][build_type][transport][network][tc_type][module][result]
409 summarysheet.write(row, col, result_sum, form.cell)
412 total_txt = '=SUM(%s:%s)' % (get_cell_name(col - len(TC_RESULT), row), get_cell_name(col - 1, row))
413 summarysheet.write(row, col, total_txt, form.cell)
416 for result in TC_RESULT + ('Total',):
417 total_txt = '=SUM(%s,%s)' % (get_cell_name(col - (len(TC_RESULT) + 1)*2, row), get_cell_name(col - (len(TC_RESULT) + 1), row))
418 summarysheet.write(row, col, total_txt, form.cell)
419 module_total_txt[result] += '%s,' % get_cell_name(col, row)
422 for result in TC_RESULT + ('Total',):
423 module_total_txt[result] += ')'
424 summarysheet.write(row, col, module_total_txt[result], form.cell)
427 total_txt = '=IF(%s=0,"",ROUND(%s/%s*100, 2))' % (get_cell_name(col - 1, row), get_cell_name(col - 3, row), get_cell_name(col - 1, row))
428 summarysheet.write(row, col, total_txt, form.cell)
433 summarysheet.write(row, col, 'Total', form.total)
436 for platform in TEST_PLATFORM:
437 if not platform in self.summary:
440 for target in self.summary[platform]:
441 for tc_type in TESTCASE_TYPES + ('Total',):
442 for result in TC_RESULT + ('Total',):
443 total_txt = '=SUM(%s:%s)' % (get_cell_name(col, row - len(TESTSUITE_MODULES)), get_cell_name(col, row - 1))
444 summarysheet.write(row, col, total_txt, form.total_no)
447 for result in TC_RESULT + ('Total',):
448 total_txt = '=SUM(%s:%s)' % (get_cell_name(col, row - len(TESTSUITE_MODULES)), get_cell_name(col, row - 1))
449 summarysheet.write(row, col, total_txt, form.total_no)
451 total_txt = '=IF(%s=0,"",ROUND(%s/%s*100, 2))' % (get_cell_name(col - 1, row), get_cell_name(col - 3, row), get_cell_name(col - 1, row))
452 summarysheet.write(row, col, total_txt, form.total_no)
454 def write_pass_result(row, col, testcase, testspec, sheet, platform, target, transport, network):
460 while(index < len(testcase.runresult)):
461 sheet.write(row, col, testcase.runresult[index].result, form.cell)
462 sheet.write(row, col + 1, testcase.runresult[index].runtype, form.cell)
463 sheet.write(row, col + 2, testcase.runresult[index].runtime, form.cell)
464 sheet.write(row, col + 3, testcase.runresult[index].fail_msg, form.cell_wrap)
465 temp_log = get_log_content_or_filename(testcase.runresult[index].test_log)
466 sheet.write(row, col + 4, temp_log, form.cell_wrap)
471 merge_cell(sheet, tc_row, col, row - 1, col, testcase.name, form.cell)
473 merge_cell(sheet, tc_row, col, row - 1, col,
474 "%d/%d" % (testcase.fail, testcase.fail + testcase.success), form.cell)
477 if testcase.name in testspec:
478 spec = testspec[testcase.name]
479 for key, title in sorted(TAG_DIC.items(), key=operator.itemgetter(1)):
482 merge_cell(sheet, tc_row, col, row -1, col, spec.__dict__[key], form.cell_wrap)
489 def write_fail_result(row, col, testcase, testspec, sheet, platform, target, transport, network):
495 while(index < len(testcase.runresult)):
496 sheet.write(row, col, testcase.runresult[index].result, form.cell)
497 sheet.write(row, col + 1, testcase.runresult[index].runtype, form.cell)
498 sheet.write(row, col + 2, testcase.runresult[index].runtime, form.cell)
499 sheet.write(row, col + 3, testcase.runresult[index].fail_msg, form.cell_wrap)
500 temp_log = get_log_content_or_filename(testcase.runresult[index].test_log)
501 sheet.write(row, col + 4, temp_log, form.cell_wrap)
506 merge_cell(sheet, tc_row, col, row - 1, col, testcase.name, form.cell)
508 merge_cell(sheet, tc_row, col, row - 1, col,
509 "%d/%d" % (testcase.fail, testcase.fail + testcase.success), form.cell)
512 if testcase.name in testspec:
513 spec = testspec[testcase.name]
514 for key, title in sorted(TAG_DIC.items(), key=operator.itemgetter(1)):
517 merge_cell(sheet, tc_row, col, row -1, col, spec.__dict__[key], form.cell_wrap)
524 def write_defect_result(row, col, testcase, testspec, sheet, platform, target, transport, network):
530 while(index < len(testcase.runresult)):
531 sheet.write(row, col, testcase.runresult[index].result, form.cell)
532 sheet.write(row, col + 1, testcase.runresult[index].runtype, form.cell)
533 sheet.write(row, col + 2, testcase.runresult[index].runtime, form.cell)
538 merge_cell(sheet, tc_row, col, row - 1, col, testcase.name, form.cell)
540 merge_cell(sheet, tc_row, col, row - 1, col,
541 "%d/%d" % (testcase.fail, testcase.fail + testcase.success), form.cell)
544 merge_cell(sheet, tc_row, col, row-1, col, '', form.cell_wrap)
546 merge_cell(sheet, tc_row, col, row-1, col, '', form.cell)
550 if testcase.name in list(testspec):
551 test_target = testspec[testcase.name].target
553 description = '[Device: %s %s]\n' %(platform, target)\
554 + '[TC: %s]\n' % (testcase.name)\
555 + '[Target: %s]\n\n' %(test_target) \
557 merge_cell(sheet, tc_row, col, row-1, col, description, form.cell_wrap)
563 def get_log_content_or_filename(log):
565 begin_index = log.find('Log File Name:') + len('Log File Name:')
566 end_index = log.find('Content:')
567 log = log[begin_index:end_index].strip()
570 passsheet = workbook.add_worksheet('PassTC')
571 self.report_result(passsheet, form, RESULT_TITLE, write_pass_result, self.passtc)
573 failsheet = workbook.add_worksheet('FailedTC')
574 self.report_result(failsheet, form, RESULT_TITLE, write_fail_result, self.failtc)
576 defectsheet = workbook.add_worksheet('DefectReport')
577 self.report_result(defectsheet, form, DEFECT_TITLE, write_defect_result, self.failtc)