From 1e5e4c9e553f6bc1778f1a9eb71ac26e81a7a0d1 Mon Sep 17 00:00:00 2001
From: boafantasy
概要{ %(passrate)s }
-失败{ %(fail)s }
通过{ %(Pass)s }
+失败{ %(fail)s }
+错误{ %(error)s }
所有{ %(count)s }
+
%(script)s
@@ -375,6 +376,7 @@ class Template_mixin(object):
@@ -396,6 +399,7 @@ class Template_mixin(object):
通过
失败
错误
+ 耗时
详细
%(test_list)s
@@ -384,6 +386,7 @@ class Template_mixin(object):
%(Pass)s
%(fail)s
%(error)s
+ %(time_usage)s
通过率:%(passrate)s
%(Pass)s
%(fail)s
%(error)s
+ %(time_usage)s
详细
""" # variables: (style, desc, count, Pass, fail, error, cid)
@@ -474,9 +478,10 @@ def __init__(self, verbosity=1):
def startTest(self, test):
stream = sys.stderr
- stdout_content = " Testing: " + str(test)
- stream.write(stdout_content)
- stream.flush()
+ # stdout_content = " Testing: " + str(test)
+ # stream.write(stdout_content)
+ # stream.flush()
+ # stream.write("\n")
TestResult.startTest(self, test)
# just one buffer for both stdout and stderr
self.outputBuffer = io.StringIO()
@@ -486,13 +491,14 @@ def startTest(self, test):
self.stderr0 = sys.stderr
sys.stdout = stdout_redirector
sys.stderr = stderr_redirector
-
+ self.test_start_time = round(time.time(), 2)
def complete_output(self):
"""
Disconnect output redirection and return buffer.
Safe to call multiple times.
"""
+ self.test_end_time = round(time.time(), 2)
if self.stdout0:
sys.stdout = self.stdout0
sys.stderr = self.stderr0
@@ -512,45 +518,51 @@ def addSuccess(self, test):
self.success_count += 1
TestResult.addSuccess(self, test)
output = self.complete_output()
- self.result.append((0, test, output, ''))
+ use_time = round(self.test_end_time - self.test_start_time, 2)
+ self.result.append((0, test, output, '', use_time))
if self.verbosity > 1:
- sys.stderr.write('ok ')
+ sys.stderr.write(' S ')
sys.stderr.write(str(test))
sys.stderr.write('\n')
else:
- sys.stderr.write('.')
+ sys.stderr.write(' S ')
+ sys.stderr.write('\n')
def addError(self, test, err):
self.error_count += 1
TestResult.addError(self, test, err)
_, _exc_str = self.errors[-1]
output = self.complete_output()
- self.result.append((2, test, output, _exc_str))
+ use_time = round(self.test_end_time - self.test_start_time, 2)
+ self.result.append((2, test, output, _exc_str, use_time))
if self.verbosity > 1:
- sys.stderr.write('E ')
+ sys.stderr.write(' E ')
sys.stderr.write(str(test))
sys.stderr.write('\n')
else:
- sys.stderr.write('E')
+ sys.stderr.write(' E ')
+ sys.stderr.write('\n')
def addFailure(self, test, err):
self.failure_count += 1
TestResult.addFailure(self, test, err)
_, _exc_str = self.failures[-1]
output = self.complete_output()
- self.result.append((1, test, output, _exc_str))
+ use_time = round(self.test_end_time - self.test_start_time, 2)
+ self.result.append((1, test, output, _exc_str, use_time))
if self.verbosity > 1:
- sys.stderr.write('F ')
+ sys.stderr.write(' F ')
sys.stderr.write(str(test))
sys.stderr.write('\n')
else:
- sys.stderr.write('F')
+ sys.stderr.write(' F ')
+ sys.stderr.write('\n')
class HTMLTestRunner(Template_mixin):
"""
"""
- def __init__(self, stream=sys.stdout, verbosity=1,title=None,description=None,tester=None):
+ def __init__(self, stream=sys.stdout, verbosity=2 ,title=None,description=None,tester=None):
self.stream = stream
self.verbosity = verbosity
if title is None:
@@ -571,7 +583,7 @@ def __init__(self, stream=sys.stdout, verbosity=1,title=None,description=None,te
def run(self, test):
"Run the given test case or test suite."
- result = _TestResult(self.verbosity)
+ result = _TestResult(self.verbosity) # verbosity为1,只输出成功与否,为2会输出用例名称
test(result)
self.stopTime = datetime.datetime.now()
self.generateReport(test, result)
@@ -584,12 +596,12 @@ def sortResult(self, result_list):
# Here at least we want to group them together by class.
rmap = {}
classes = []
- for n,t,o,e in result_list:
+ for n,t,o,e,s in result_list:
cls = t.__class__
if cls not in rmap:
rmap[cls] = []
classes.append(cls)
- rmap[cls].append((n,t,o,e))
+ rmap[cls].append((n,t,o,e,s))
r = [(cls, rmap[cls]) for cls in classes]
return r
@@ -608,17 +620,19 @@ def getReportAttributes(self, result):
if result.error_count: status.append('错误 %s' % result.error_count )
if status:
status = ','.join(status)
- self.passrate = str("%.2f%%" % (float(result.success_count) / float(result.success_count + result.failure_count + result.error_count) * 100))
+ if (result.success_count + result.failure_count + result.error_count) > 0:
+ self.passrate = str("%.2f%%" % (float(result.success_count) / float(result.success_count + result.failure_count + result.error_count) * 100))
+ else:
+ self.passrate = "0.00 %"
else:
status = 'none'
return [
('测试人员', self.tester),
('开始时间',startTime),
('合计耗时',duration),
- ('测试结果',status + ",通过率= "+self.passrate),
+ ('测试结果',status + ",通过率 = "+self.passrate),
]
-
def generateReport(self, test, result):
report_attrs = self.getReportAttributes(result)
generator = 'HTMLTestRunner %s' % __version__
@@ -661,14 +675,18 @@ def _generate_heading(self, report_attrs):
def _generate_report(self, result):
rows = []
sortedResult = self.sortResult(result.result)
+ # 所有用例统计耗时初始化
+ sum_ns = 0
for cid, (cls, cls_results) in enumerate(sortedResult):
# subtotal for a class
- np = nf = ne = 0
- for n,t,o,e in cls_results:
+ np = nf = ne = ns = 0
+ for n,t,o,e,s in cls_results:
if n == 0: np += 1
elif n == 1: nf += 1
else: ne += 1
-
+ ns += s # 把单个class用例文件里面的多个def用例每次的耗时相加
+ ns = round(ns, 2)
+ sum_ns += ns # 把所有用例的每次耗时相加
# format class description
if cls.__module__ == "__main__":
name = cls.__name__
@@ -685,18 +703,20 @@ def _generate_report(self, result):
fail = nf,
error = ne,
cid = 'c%s' % (cid+1),
+ time_usage=str(ns) + "秒" # 单个用例耗时
)
rows.append(row)
- for tid, (n,t,o,e) in enumerate(cls_results):
+ for tid, (n,t,o,e,s) in enumerate(cls_results):
self._generate_report_test(rows, cid, tid, n, t, o, e)
-
+ sum_ns = round(sum_ns, 2)
report = self.REPORT_TMPL % dict(
test_list = ''.join(rows),
count = str(result.success_count+result.failure_count+result.error_count),
Pass = str(result.success_count),
fail = str(result.failure_count),
error = str(result.error_count),
+ time_usage=str(sum_ns) + "秒", # 所有用例耗时
passrate =self.passrate,
)
return report
From 0e3299de2c0ae12df1715baa01cb9222e8238917 Mon Sep 17 00:00:00 2001
From: boafantasy