3 from __future__ import print_function
4 import testlog_parser, sys, os, xml, glob, re
5 from table_formatter import *
6 from optparse import OptionParser
7 from operator import itemgetter, attrgetter
8 from summary import getSetName, alphanum_keyselector
11 if __name__ == "__main__":
12 usage = "%prog <log_name>.xml [...]"
13 parser = OptionParser(usage = usage)
15 parser.add_option("-o", "--output", dest = "format",
16 help = "output results in text format (can be 'txt', 'html' or 'auto' - default)",
17 metavar = 'FMT', default = 'auto')
19 parser.add_option("--failed-only", action = "store_true", dest = "failedOnly",
20 help = "print only failed tests", default = False)
22 (options, args) = parser.parse_args()
24 options.generateHtml = detectHtmlOutputType(options.format)
27 testsuits = [] # testsuit module, name, time, num, flag for failed tests
32 if ("*" in arg) or ("?" in arg):
33 flist = [os.path.abspath(f) for f in glob.glob(arg)]
34 flist = sorted(flist, key= lambda text: str(text).replace("M", "_"))
35 files.extend([ x for x in flist if x not in seen and not seen.add(x)])
37 fname = os.path.abspath(arg)
38 if fname not in seen and not seen.add(fname):
41 file = os.path.abspath(fname)
42 if not os.path.isfile(file):
43 sys.stderr.write("IOError reading \"" + file + "\" - " + str(err) + os.linesep)
47 fname = os.path.basename(fname)
48 find_module_name = re.search(r'([^_]*)', fname)
49 module_name = find_module_name.group(0)
53 tests = testlog_parser.parseLogFile(file)
55 test_sets.append((os.path.basename(file), tests))
56 except IOError as err:
57 sys.stderr.write("IOError reading \"" + file + "\" - " + str(err) + os.linesep)
58 except xml.parsers.expat.ExpatError as err:
59 sys.stderr.write("ExpatError reading \"" + file + "\" - " + str(err) + os.linesep)
65 setsCount = len(test_sets)
68 name_extractor = lambda name: str(name)
70 for i in range(setsCount):
71 for case in test_sets[i][1]:
72 name = name_extractor(case)
73 if name not in test_cases:
74 test_cases[name] = [None] * setsCount
75 test_cases[name][i] = case
81 for name in sorted(test_cases.iterkeys(), key=alphanum_keyselector):
82 cases = test_cases[name]
84 groupName = next(c for c in cases if c).shortName()
85 if groupName != prevGroupName:
86 if prevGroupName != None:
87 suit_time = suit_time/60 #from seconds to minutes
88 testsuits.append({'module': module_name, 'name': prevGroupName, \
89 'time': suit_time, 'num': suit_num, 'failed': fails_num})
90 overall_time += suit_time
94 prevGroupName = groupName
96 for i in range(setsCount):
100 if case.get('status') == 'run':
101 suit_time += case.get('time')
102 if case.get('status') == 'failed':
105 # last testsuit processing
106 suit_time = suit_time/60
107 testsuits.append({'module': module_name, 'name': prevGroupName, \
108 'time': suit_time, 'num': suit_num, 'failed': fails_num})
109 overall_time += suit_time
111 if len(testsuits)==0:
117 if not options.failedOnly:
118 tbl.newColumn('module', 'Module', align = 'left', cssclass = 'col_name')
119 tbl.newColumn('name', 'Testsuit', align = 'left', cssclass = 'col_name')
120 tbl.newColumn('time', 'Time (min)', align = 'center', cssclass = 'col_name')
121 tbl.newColumn('num', 'Num of tests', align = 'center', cssclass = 'col_name')
122 tbl.newColumn('failed', 'Failed', align = 'center', cssclass = 'col_name')
125 for suit in sorted(testsuits, key = lambda suit: suit['time'], reverse = True):
127 tbl.newCell('module', suit['module'])
128 tbl.newCell('name', suit['name'])
129 tbl.newCell('time', formatValue(suit['time'], '', ''), suit['time'])
130 tbl.newCell('num', suit['num'])
131 if (suit['failed'] != 0):
132 tbl.newCell('failed', suit['failed'])
134 tbl.newCell('failed', ' ')
138 tbl.newColumn('module', 'Module', align = 'left', cssclass = 'col_name')
139 tbl.newColumn('name', 'Testsuit', align = 'left', cssclass = 'col_name')
140 tbl.newColumn('failed', 'Failed', align = 'center', cssclass = 'col_name')
143 for suit in sorted(testsuits, key = lambda suit: suit['time'], reverse = True):
144 if (suit['failed'] != 0):
146 tbl.newCell('module', suit['module'])
147 tbl.newCell('name', suit['name'])
148 tbl.newCell('failed', suit['failed'])
153 if options.generateHtml:
154 tbl.htmlPrintTable(sys.stdout)
155 htmlPrintFooter(sys.stdout)
157 if not options.failedOnly:
158 print('\nOverall time: %.2f min\n' % overall_time)
159 tbl.consolePrintTable(sys.stdout)