Wrote script generating timing table

This commit is contained in:
Anna Kogan 2012-12-24 15:29:49 +04:00
parent f6ca38a579
commit e1331b44f5
2 changed files with 111 additions and 0 deletions

View File

@ -0,0 +1,108 @@
#!/usr/bin/env python
import testlog_parser, sys, os, xml, glob, re
from table_formatter import *
from optparse import OptionParser
from operator import itemgetter, attrgetter
from summary import getSetName, alphanum_keyselector
if __name__ == "__main__":
usage = "%prog <log_name>.xml"
parser = OptionParser(usage = usage)
for arg in sys.argv:
print arg
parser.add_option("-o", "--output", dest="format",
help="output results in text format (can be 'txt', 'html' or 'auto' - default)",
metavar="FMT", default="auto")
(options, args) = parser.parse_args()
options.generateHtml = detectHtmlOutputType(options.format)
if 1 != len(args):
parser.print_help()
exit(0)
# expand wildcards and filter duplicates
file = os.path.abspath(args[0])
if not os.path.isfile(file):
print 'Incorrect file name!'
parser.print_help()
exit(0)
# read all passed files
test_sets = []
try:
tests = testlog_parser.parseLogFile(file)
if tests:
test_sets.append((os.path.basename(file), tests))
except IOError as err:
sys.stderr.write("IOError reading \"" + file + "\" - " + str(err) + os.linesep)
except xml.parsers.expat.ExpatError as err:
sys.stderr.write("ExpatError reading \"" + file + "\" - " + str(err) + os.linesep)
if not test_sets:
sys.stderr.write("Error: no test data found" + os.linesep)
quit()
# find matches
setsCount = len(test_sets)
test_cases = {}
name_extractor = lambda name: str(name)
for i in range(setsCount):
for case in test_sets[i][1]:
name = name_extractor(case)
if name not in test_cases:
test_cases[name] = [None] * setsCount
test_cases[name][i] = case
testsuits = [] # testsuit name, time, flag for failed tests
prevGroupName = None
suit_time = 0
has_failed = False
for name in sorted(test_cases.iterkeys(), key=alphanum_keyselector):
cases = test_cases[name]
groupName = next(c for c in cases if c).shortName()
if groupName != prevGroupName:
if prevGroupName != None:
testsuits.append((prevGroupName, suit_time, has_failed))
has_failed = False
suit_time = 0
prevGroupName = groupName
for i in range(setsCount):
case = cases[i]
if not case is None:
if case.get("status") == "run":
suit_time += case.get("time")
if case.get("status") == "failed":
has_failed = True
tbl = table()
# header
tbl.newColumn("name", "Name", align = "left", cssclass = "col_name")
tbl.newColumn("time", "Time (ms)", align = "left", cssclass = "col_name")
tbl.newColumn("failed", "Failed tests", align = "center", cssclass = "col_name")
# rows
for suit in sorted(testsuits, key=lambda suit: suit[1], reverse=True):
tbl.newRow()
tbl.newCell("name", suit[0])
tbl.newCell("time", formatValue(suit[1], "", ""), suit[1])
if (suit[2]):
tbl.newCell("failed", "Yes")
# output table
if options.generateHtml:
htmlPrintHeader(sys.stdout, "Timings of %s tests from %s test logs" % (len(test_cases), setsCount))
tbl.htmlPrintTable(sys.stdout)
htmlPrintFooter(sys.stdout)
else:
tbl.consolePrintTable(sys.stdout)

View File

@ -30,6 +30,7 @@ class TestInfo(object):
self.parseLongMetric(xmlnode, "mean");
self.parseLongMetric(xmlnode, "stddev");
self.parseFloatMetric(xmlnode, "gstddev");
self.parseFloatMetric(xmlnode, "time");
def parseLongMetric(self, xmlnode, name, default = 0):
if xmlnode.hasAttribute(name):
@ -78,6 +79,8 @@ class TestInfo(object):
val = self.metrix.get(name, None)
if not val:
return val
if name == "time":
return self.metrix.get("time")
if name in ["gmean", "min", "mean", "median", "stddev"]:
scale = 1.0
frequency = self.metrix.get("frequency", 1.0) or 1.0