221
222
"""Record that a test has started."""
222
223
self._start_time = time.time()
225
def _cleanupLogFile(self, test):
226
# We can only do this if we have one of our TestCases, not if
228
setKeepLogfile = getattr(test, 'setKeepLogfile', None)
229
if setKeepLogfile is not None:
224
232
def addError(self, test, err):
225
233
if isinstance(err[1], TestSkipped):
226
return self.addSkipped(test, err)
234
return self.addSkipped(test, err)
227
235
unittest.TestResult.addError(self, test, err)
228
# We can only do this if we have one of our TestCases, not if
230
setKeepLogfile = getattr(test, 'setKeepLogfile', None)
231
if setKeepLogfile is not None:
236
self._cleanupLogFile(test)
233
237
self.extractBenchmarkTime(test)
238
self.error_count += 1
234
239
self.report_error(test, err)
235
240
if self.stop_early:
238
243
def addFailure(self, test, err):
244
self._cleanupLogFile(test)
245
self.extractBenchmarkTime(test)
246
if isinstance(err[1], KnownFailure):
247
return self.addKnownFailure(test, err)
239
248
unittest.TestResult.addFailure(self, test, err)
240
# We can only do this if we have one of our TestCases, not if
242
setKeepLogfile = getattr(test, 'setKeepLogfile', None)
243
if setKeepLogfile is not None:
245
self.extractBenchmarkTime(test)
249
self.failure_count += 1
246
250
self.report_failure(test, err)
247
251
if self.stop_early:
254
def addKnownFailure(self, test, err):
255
self.known_failure_count += 1
256
self.report_known_failure(test, err)
250
258
def addSuccess(self, test):
251
259
self.extractBenchmarkTime(test)
252
260
if self._bench_history is not None:
301
309
class TextTestResult(ExtendedTestResult):
302
310
"""Displays progress and results of tests in text form"""
304
def __init__(self, *args, **kw):
305
ExtendedTestResult.__init__(self, *args, **kw)
306
self.pb = self.ui.nested_progress_bar()
312
def __init__(self, stream, descriptions, verbosity,
317
ExtendedTestResult.__init__(self, stream, descriptions, verbosity,
318
bench_history, num_tests)
320
self.pb = ui.ui_factory.nested_progress_bar()
321
self._supplied_pb = False
324
self._supplied_pb = True
307
325
self.pb.show_pct = False
308
326
self.pb.show_spinner = False
309
327
self.pb.show_eta = False,
322
340
a += ', %d errors' % self.error_count
323
341
if self.failure_count:
324
342
a += ', %d failed' % self.failure_count
343
if self.known_failure_count:
344
a += ', %d known failures' % self.known_failure_count
325
345
if self.skip_count:
326
346
a += ', %d skipped' % self.skip_count
342
362
return self._shortened_test_description(test)
344
364
def report_error(self, test, err):
345
self.error_count += 1
346
365
self.pb.note('ERROR: %s\n %s\n',
347
366
self._test_description(test),
351
370
def report_failure(self, test, err):
352
self.failure_count += 1
353
371
self.pb.note('FAIL: %s\n %s\n',
354
372
self._test_description(test),
376
def report_known_failure(self, test, err):
377
self.pb.note('XFAIL: %s\n%s\n',
378
self._test_description(test), err[1])
358
380
def report_skip(self, test, skip_excinfo):
359
381
self.skip_count += 1
414
437
return '%s%s' % (indent, err[1])
416
439
def report_error(self, test, err):
417
self.error_count += 1
418
440
self.stream.writeln('ERROR %s\n%s'
419
441
% (self._testTimeString(),
420
442
self._error_summary(err)))
422
444
def report_failure(self, test, err):
423
self.failure_count += 1
424
445
self.stream.writeln(' FAIL %s\n%s'
425
446
% (self._testTimeString(),
426
447
self._error_summary(err)))
449
def report_known_failure(self, test, err):
450
self.stream.writeln('XFAIL %s\n%s'
451
% (self._testTimeString(),
452
self._error_summary(err)))
428
454
def report_success(self, test):
429
455
self.stream.writeln(' OK %s' % self._testTimeString())
430
456
for bench_called, stats in getattr(test, '_benchcalls', []):
431
457
self.stream.writeln('LSProf output for %s(%s, %s)' % bench_called)
432
458
stats.pprint(file=self.stream)
459
# flush the stream so that we get smooth output. This verbose mode is
460
# used to show the output in PQM.
433
461
self.stream.flush()
435
463
def report_skip(self, test, skip_excinfo):
487
515
if failed: self.stream.write(", ")
488
516
self.stream.write("errors=%d" % errored)
517
if result.known_failure_count:
518
if failed or errored: self.stream.write(", ")
519
self.stream.write("known_failure_count=%d" %
520
result.known_failure_count)
489
521
self.stream.writeln(")")
491
self.stream.writeln("OK")
523
if result.known_failure_count:
524
self.stream.writeln("OK (known_failures=%d)" %
525
result.known_failure_count)
527
self.stream.writeln("OK")
492
528
if result.skip_count > 0:
493
529
skipped = result.skip_count
494
530
self.stream.writeln('%d test%s skipped' %
545
581
"""Indicates that a test was intentionally skipped, rather than failing."""
584
class KnownFailure(AssertionError):
585
"""Indicates that a test failed in a precisely expected manner.
587
Such failures dont block the whole test suite from passing because they are
588
indicators of partially completed code or of future work. We have an
589
explicit error for them so that we can ensure that they are always visible:
590
KnownFailures are always shown in the output of bzr selftest.
548
594
class CommandFailed(Exception):