Path: blob/master/modules/ts/misc/perf_tests_timing.py
16354 views
#!/usr/bin/env python12from __future__ import print_function3import testlog_parser, sys, os, xml, glob, re4from table_formatter import *5from optparse import OptionParser6from operator import itemgetter, attrgetter7from summary import getSetName, alphanum_keyselector8import re910if __name__ == "__main__":11usage = "%prog <log_name>.xml [...]"12parser = OptionParser(usage = usage)1314parser.add_option("-o", "--output", dest = "format",15help = "output results in text format (can be 'txt', 'html' or 'auto' - default)",16metavar = 'FMT', default = 'auto')1718parser.add_option("--failed-only", action = "store_true", dest = "failedOnly",19help = "print only failed tests", default = False)2021(options, args) = parser.parse_args()2223options.generateHtml = detectHtmlOutputType(options.format)2425files = []26testsuits = [] # testsuit module, name, time, num, flag for failed tests27overall_time = 02829seen = set()30for arg in args:31if ("*" in arg) or ("?" in arg):32flist = [os.path.abspath(f) for f in glob.glob(arg)]33flist = sorted(flist, key= lambda text: str(text).replace("M", "_"))34files.extend([ x for x in flist if x not in seen and not seen.add(x)])35else:36fname = os.path.abspath(arg)37if fname not in seen and not seen.add(fname):38files.append(fname)3940file = os.path.abspath(fname)41if not os.path.isfile(file):42sys.stderr.write("IOError reading \"" + file + "\" - " + str(err) + os.linesep)43parser.print_help()44exit(0)4546fname = os.path.basename(fname)47find_module_name = re.search(r'([^_]*)', fname)48module_name = find_module_name.group(0)4950test_sets = []51try:52tests = testlog_parser.parseLogFile(file)53if tests:54test_sets.append((os.path.basename(file), tests))55except IOError as err:56sys.stderr.write("IOError reading \"" + file + "\" - " + str(err) + os.linesep)57except xml.parsers.expat.ExpatError as err:58sys.stderr.write("ExpatError reading \"" + file + "\" - " + str(err) + os.linesep)5960if not test_sets:61continue6263# find matches64setsCount = len(test_sets)65test_cases = {}6667name_extractor = lambda name: str(name)6869for i in range(setsCount):70for case in test_sets[i][1]:71name = name_extractor(case)72if name not in test_cases:73test_cases[name] = [None] * setsCount74test_cases[name][i] = case7576prevGroupName = None77suit_time = 078suit_num = 079fails_num = 080for name in sorted(test_cases.iterkeys(), key=alphanum_keyselector):81cases = test_cases[name]8283groupName = next(c for c in cases if c).shortName()84if groupName != prevGroupName:85if prevGroupName != None:86suit_time = suit_time/60 #from seconds to minutes87testsuits.append({'module': module_name, 'name': prevGroupName, \88'time': suit_time, 'num': suit_num, 'failed': fails_num})89overall_time += suit_time90suit_time = 091suit_num = 092fails_num = 093prevGroupName = groupName9495for i in range(setsCount):96case = cases[i]97if not case is None:98suit_num += 199if case.get('status') == 'run':100suit_time += case.get('time')101if case.get('status') == 'failed':102fails_num += 1103104# last testsuit processing105suit_time = suit_time/60106testsuits.append({'module': module_name, 'name': prevGroupName, \107'time': suit_time, 'num': suit_num, 'failed': fails_num})108overall_time += suit_time109110if len(testsuits)==0:111exit(0)112113tbl = table()114rows = 0115116if not options.failedOnly:117tbl.newColumn('module', 'Module', align = 'left', cssclass = 'col_name')118tbl.newColumn('name', 'Testsuit', align = 'left', cssclass = 'col_name')119tbl.newColumn('time', 'Time (min)', align = 'center', cssclass = 'col_name')120tbl.newColumn('num', 'Num of tests', align = 'center', cssclass = 'col_name')121tbl.newColumn('failed', 'Failed', align = 'center', cssclass = 'col_name')122123# rows124for suit in sorted(testsuits, key = lambda suit: suit['time'], reverse = True):125tbl.newRow()126tbl.newCell('module', suit['module'])127tbl.newCell('name', suit['name'])128tbl.newCell('time', formatValue(suit['time'], '', ''), suit['time'])129tbl.newCell('num', suit['num'])130if (suit['failed'] != 0):131tbl.newCell('failed', suit['failed'])132else:133tbl.newCell('failed', ' ')134rows += 1135136else:137tbl.newColumn('module', 'Module', align = 'left', cssclass = 'col_name')138tbl.newColumn('name', 'Testsuit', align = 'left', cssclass = 'col_name')139tbl.newColumn('failed', 'Failed', align = 'center', cssclass = 'col_name')140141# rows142for suit in sorted(testsuits, key = lambda suit: suit['time'], reverse = True):143if (suit['failed'] != 0):144tbl.newRow()145tbl.newCell('module', suit['module'])146tbl.newCell('name', suit['name'])147tbl.newCell('failed', suit['failed'])148rows += 1149150# output table151if rows:152if options.generateHtml:153tbl.htmlPrintTable(sys.stdout)154htmlPrintFooter(sys.stdout)155else:156if not options.failedOnly:157print('\nOverall time: %.2f min\n' % overall_time)158tbl.consolePrintTable(sys.stdout)159print(2 * '\n')160161162