Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/ts/misc/perf_tests_timing.py
16354 views
1
#!/usr/bin/env python
2
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
9
import re
10
11
if __name__ == "__main__":
12
usage = "%prog <log_name>.xml [...]"
13
parser = OptionParser(usage = usage)
14
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')
18
19
parser.add_option("--failed-only", action = "store_true", dest = "failedOnly",
20
help = "print only failed tests", default = False)
21
22
(options, args) = parser.parse_args()
23
24
options.generateHtml = detectHtmlOutputType(options.format)
25
26
files = []
27
testsuits = [] # testsuit module, name, time, num, flag for failed tests
28
overall_time = 0
29
30
seen = set()
31
for arg in args:
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)])
36
else:
37
fname = os.path.abspath(arg)
38
if fname not in seen and not seen.add(fname):
39
files.append(fname)
40
41
file = os.path.abspath(fname)
42
if not os.path.isfile(file):
43
sys.stderr.write("IOError reading \"" + file + "\" - " + str(err) + os.linesep)
44
parser.print_help()
45
exit(0)
46
47
fname = os.path.basename(fname)
48
find_module_name = re.search(r'([^_]*)', fname)
49
module_name = find_module_name.group(0)
50
51
test_sets = []
52
try:
53
tests = testlog_parser.parseLogFile(file)
54
if tests:
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)
60
61
if not test_sets:
62
continue
63
64
# find matches
65
setsCount = len(test_sets)
66
test_cases = {}
67
68
name_extractor = lambda name: str(name)
69
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
76
77
prevGroupName = None
78
suit_time = 0
79
suit_num = 0
80
fails_num = 0
81
for name in sorted(test_cases.iterkeys(), key=alphanum_keyselector):
82
cases = test_cases[name]
83
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
91
suit_time = 0
92
suit_num = 0
93
fails_num = 0
94
prevGroupName = groupName
95
96
for i in range(setsCount):
97
case = cases[i]
98
if not case is None:
99
suit_num += 1
100
if case.get('status') == 'run':
101
suit_time += case.get('time')
102
if case.get('status') == 'failed':
103
fails_num += 1
104
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
110
111
if len(testsuits)==0:
112
exit(0)
113
114
tbl = table()
115
rows = 0
116
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')
123
124
# rows
125
for suit in sorted(testsuits, key = lambda suit: suit['time'], reverse = True):
126
tbl.newRow()
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'])
133
else:
134
tbl.newCell('failed', ' ')
135
rows += 1
136
137
else:
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')
141
142
# rows
143
for suit in sorted(testsuits, key = lambda suit: suit['time'], reverse = True):
144
if (suit['failed'] != 0):
145
tbl.newRow()
146
tbl.newCell('module', suit['module'])
147
tbl.newCell('name', suit['name'])
148
tbl.newCell('failed', suit['failed'])
149
rows += 1
150
151
# output table
152
if rows:
153
if options.generateHtml:
154
tbl.htmlPrintTable(sys.stdout)
155
htmlPrintFooter(sys.stdout)
156
else:
157
if not options.failedOnly:
158
print('\nOverall time: %.2f min\n' % overall_time)
159
tbl.consolePrintTable(sys.stdout)
160
print(2 * '\n')
161
162