@@ -305,37 +305,76 @@ def test_1(self):
305
305
self .assertIs (test_case , subtest )
306
306
self .assertIn ("some recognizable failure" , formatted_exc )
307
307
308
+ def testStackFrameTrimming (self ):
309
+ class Frame (object ):
310
+ class tb_frame (object ):
311
+ f_globals = {}
312
+ result = unittest .TestResult ()
313
+ self .assertFalse (result ._is_relevant_tb_level (Frame ))
314
+
315
+ Frame .tb_frame .f_globals ['__unittest' ] = True
316
+ self .assertTrue (result ._is_relevant_tb_level (Frame ))
317
+
318
+ def testFailFast (self ):
319
+ result = unittest .TestResult ()
320
+ result ._exc_info_to_string = lambda * _ : ''
321
+ result .failfast = True
322
+ result .addError (None , None )
323
+ self .assertTrue (result .shouldStop )
324
+
325
+ result = unittest .TestResult ()
326
+ result ._exc_info_to_string = lambda * _ : ''
327
+ result .failfast = True
328
+ result .addFailure (None , None )
329
+ self .assertTrue (result .shouldStop )
330
+
331
+ result = unittest .TestResult ()
332
+ result ._exc_info_to_string = lambda * _ : ''
333
+ result .failfast = True
334
+ result .addUnexpectedSuccess (None )
335
+ self .assertTrue (result .shouldStop )
336
+
337
+ def testFailFastSetByRunner (self ):
338
+ runner = unittest .TextTestRunner (stream = io .StringIO (), failfast = True )
339
+ def test (result ):
340
+ self .assertTrue (result .failfast )
341
+ result = runner .run (test )
342
+
343
+
344
+ class Test_TextTestResult (unittest .TestCase ):
345
+ maxDiff = None
346
+
308
347
def testGetDescriptionWithoutDocstring (self ):
309
348
result = unittest .TextTestResult (None , True , 1 )
310
349
self .assertEqual (
311
350
result .getDescription (self ),
312
351
'testGetDescriptionWithoutDocstring (' + __name__ +
313
- '.Test_TestResult )' )
352
+ '.Test_TextTestResult )' )
314
353
315
354
def testGetSubTestDescriptionWithoutDocstring (self ):
316
355
with self .subTest (foo = 1 , bar = 2 ):
317
356
result = unittest .TextTestResult (None , True , 1 )
318
357
self .assertEqual (
319
358
result .getDescription (self ._subtest ),
320
359
'testGetSubTestDescriptionWithoutDocstring (' + __name__ +
321
- '.Test_TestResult ) (foo=1, bar=2)' )
360
+ '.Test_TextTestResult ) (foo=1, bar=2)' )
322
361
with self .subTest ('some message' ):
323
362
result = unittest .TextTestResult (None , True , 1 )
324
363
self .assertEqual (
325
364
result .getDescription (self ._subtest ),
326
365
'testGetSubTestDescriptionWithoutDocstring (' + __name__ +
327
- '.Test_TestResult ) [some message]' )
366
+ '.Test_TextTestResult ) [some message]' )
328
367
329
368
def testGetSubTestDescriptionWithoutDocstringAndParams (self ):
330
369
with self .subTest ():
331
370
result = unittest .TextTestResult (None , True , 1 )
332
371
self .assertEqual (
333
372
result .getDescription (self ._subtest ),
334
373
'testGetSubTestDescriptionWithoutDocstringAndParams '
335
- '(' + __name__ + '.Test_TestResult ) (<subtest>)' )
374
+ '(' + __name__ + '.Test_TextTestResult ) (<subtest>)' )
336
375
337
376
def testGetSubTestDescriptionForFalsyValues (self ):
338
- expected = 'testGetSubTestDescriptionForFalsyValues (%s.Test_TestResult ) [%s]'
377
+ expected = 'testGetSubTestDescriptionForFalsyValues (%s.Test_TextTestResult ) [%s]'
339
378
result = unittest .TextTestResult (None , True , 1 )
340
379
for arg in [0 , None , []]:
341
380
with self .subTest (arg ):
@@ -351,7 +390,7 @@ def testGetNestedSubTestDescriptionWithoutDocstring(self):
351
390
self .assertEqual (
352
391
result .getDescription (self ._subtest ),
353
392
'testGetNestedSubTestDescriptionWithoutDocstring '
354
- '(' + __name__ + '.Test_TestResult ) (baz=2, bar=3, foo=1)' )
393
+ '(' + __name__ + '.Test_TextTestResult ) (baz=2, bar=3, foo=1)' )
355
394
356
395
def testGetDuplicatedNestedSubTestDescriptionWithoutDocstring (self ):
357
396
with self .subTest (foo = 1 , bar = 2 ):
@@ -360,7 +399,7 @@ def testGetDuplicatedNestedSubTestDescriptionWithoutDocstring(self):
360
399
self .assertEqual (
361
400
result .getDescription (self ._subtest ),
362
401
'testGetDuplicatedNestedSubTestDescriptionWithoutDocstring '
363
- '(' + __name__ + '.Test_TestResult ) (baz=3, bar=4, foo=1)' )
402
+ '(' + __name__ + '.Test_TextTestResult ) (baz=3, bar=4, foo=1)' )
364
403
365
404
@unittest .skipIf (sys .flags .optimize >= 2 ,
366
405
"Docstrings are omitted with -O2 and above" )
@@ -370,7 +409,7 @@ def testGetDescriptionWithOneLineDocstring(self):
370
409
self .assertEqual (
371
410
result .getDescription (self ),
372
411
('testGetDescriptionWithOneLineDocstring '
373
- '(' + __name__ + '.Test_TestResult )\n '
412
+ '(' + __name__ + '.Test_TextTestResult )\n '
374
413
'Tests getDescription() for a method with a docstring.' ))
375
414
376
415
@unittest .skipIf (sys .flags .optimize >= 2 ,
@@ -382,7 +421,7 @@ def testGetSubTestDescriptionWithOneLineDocstring(self):
382
421
self .assertEqual (
383
422
result .getDescription (self ._subtest ),
384
423
('testGetSubTestDescriptionWithOneLineDocstring '
385
- '(' + __name__ + '.Test_TestResult ) (foo=1, bar=2)\n '
424
+ '(' + __name__ + '.Test_TextTestResult ) (foo=1, bar=2)\n '
386
425
'Tests getDescription() for a method with a docstring.' ))
387
426
388
427
@unittest .skipIf (sys .flags .optimize >= 2 ,
@@ -395,7 +434,7 @@ def testGetDescriptionWithMultiLineDocstring(self):
395
434
self .assertEqual (
396
435
result .getDescription (self ),
397
436
('testGetDescriptionWithMultiLineDocstring '
398
- '(' + __name__ + '.Test_TestResult )\n '
437
+ '(' + __name__ + '.Test_TextTestResult )\n '
399
438
'Tests getDescription() for a method with a longer '
400
439
'docstring.' ))
401
440
@@ -410,44 +449,111 @@ def testGetSubTestDescriptionWithMultiLineDocstring(self):
410
449
self .assertEqual (
411
450
result .getDescription (self ._subtest ),
412
451
('testGetSubTestDescriptionWithMultiLineDocstring '
413
- '(' + __name__ + '.Test_TestResult ) (foo=1, bar=2)\n '
452
+ '(' + __name__ + '.Test_TextTestResult ) (foo=1, bar=2)\n '
414
453
'Tests getDescription() for a method with a longer '
415
454
'docstring.' ))
416
455
417
- def testStackFrameTrimming (self ):
418
- class Frame (object ):
419
- class tb_frame (object ):
420
- f_globals = {}
421
- result = unittest .TestResult ()
422
- self .assertFalse (result ._is_relevant_tb_level (Frame ))
423
-
424
- Frame .tb_frame .f_globals ['__unittest' ] = True
425
- self .assertTrue (result ._is_relevant_tb_level (Frame ))
426
-
427
- def testFailFast (self ):
428
- result = unittest .TestResult ()
429
- result ._exc_info_to_string = lambda * _ : ''
430
- result .failfast = True
431
- result .addError (None , None )
432
- self .assertTrue (result .shouldStop )
433
-
434
- result = unittest .TestResult ()
435
- result ._exc_info_to_string = lambda * _ : ''
436
- result .failfast = True
437
- result .addFailure (None , None )
438
- self .assertTrue (result .shouldStop )
439
-
440
- result = unittest .TestResult ()
441
- result ._exc_info_to_string = lambda * _ : ''
442
- result .failfast = True
443
- result .addUnexpectedSuccess (None )
444
- self .assertTrue (result .shouldStop )
445
-
446
- def testFailFastSetByRunner (self ):
447
- runner = unittest .TextTestRunner (stream = io .StringIO (), failfast = True )
448
- def test (result ):
449
- self .assertTrue (result .failfast )
450
- result = runner .run (test )
456
+ class Test (unittest .TestCase ):
457
+ def testSuccess (self ):
458
+ pass
459
+ def testSkip (self ):
460
+ self .skipTest ('skip' )
461
+ def testFail (self ):
462
+ self .fail ('fail' )
463
+ def testError (self ):
464
+ raise Exception ('error' )
465
+ def testSubTestSuccess (self ):
466
+ with self .subTest ('one' , a = 1 ):
467
+ pass
468
+ with self .subTest ('two' , b = 2 ):
469
+ pass
470
+ def testSubTestMixed (self ):
471
+ with self .subTest ('success' , a = 1 ):
472
+ pass
473
+ with self .subTest ('skip' , b = 2 ):
474
+ self .skipTest ('skip' )
475
+ with self .subTest ('fail' , c = 3 ):
476
+ self .fail ('fail' )
477
+ with self .subTest ('error' , d = 4 ):
478
+ raise Exception ('error' )
479
+
480
+ tearDownError = None
481
+ def tearDown (self ):
482
+ if self .tearDownError is not None :
483
+ raise self .tearDownError
484
+
485
+ def _run_test (self , test_name , verbosity , tearDownError = None ):
486
+ stream = io .StringIO ()
487
+ stream = unittest .runner ._WritelnDecorator (stream )
488
+ result = unittest .TextTestResult (stream , True , verbosity )
489
+ test = self .Test (test_name )
490
+ test .tearDownError = tearDownError
491
+ test .run (result )
492
+ return stream .getvalue ()
493
+
494
+ def testDotsOutput (self ):
495
+ self .assertEqual (self ._run_test ('testSuccess' , 1 ), '.' )
496
+ self .assertEqual (self ._run_test ('testSkip' , 1 ), 's' )
497
+ self .assertEqual (self ._run_test ('testFail' , 1 ), 'F' )
498
+ self .assertEqual (self ._run_test ('testError' , 1 ), 'E' )
499
+
500
+ def testLongOutput (self ):
501
+ classname = f'{ __name__ } .{ self .Test .__qualname__ } '
502
+ self .assertEqual (self ._run_test ('testSuccess' , 2 ),
503
+ f'testSuccess ({ classname } ) ... ok\n ' )
504
+ self .assertEqual (self ._run_test ('testSkip' , 2 ),
505
+ f"testSkip ({ classname } ) ... skipped 'skip'\n " )
506
+ self .assertEqual (self ._run_test ('testFail' , 2 ),
507
+ f'testFail ({ classname } ) ... FAIL\n ' )
508
+ self .assertEqual (self ._run_test ('testError' , 2 ),
509
+ f'testError ({ classname } ) ... ERROR\n ' )
510
+
511
+ def testDotsOutputSubTestSuccess (self ):
512
+ self .assertEqual (self ._run_test ('testSubTestSuccess' , 1 ), '.' )
513
+
514
+ def testLongOutputSubTestSuccess (self ):
515
+ classname = f'{ __name__ } .{ self .Test .__qualname__ } '
516
+ self .assertEqual (self ._run_test ('testSubTestSuccess' , 2 ),
517
+ f'testSubTestSuccess ({ classname } ) ... ok\n ' )
518
+
519
+ def testDotsOutputSubTestMixed (self ):
520
+ self .assertEqual (self ._run_test ('testSubTestMixed' , 1 ), 'sFE' )
521
+
522
+ def testLongOutputSubTestMixed (self ):
523
+ classname = f'{ __name__ } .{ self .Test .__qualname__ } '
524
+ self .assertEqual (self ._run_test ('testSubTestMixed' , 2 ),
525
+ f'testSubTestMixed ({ classname } ) ... \n '
526
+ f" testSubTestMixed ({ classname } ) [skip] (b=2) ... skipped 'skip'\n "
527
+ f' testSubTestMixed ({ classname } ) [fail] (c=3) ... FAIL\n '
528
+ f' testSubTestMixed ({ classname } ) [error] (d=4) ... ERROR\n ' )
529
+
530
+ def testDotsOutputTearDownFail (self ):
531
+ out = self ._run_test ('testSuccess' , 1 , AssertionError ('fail' ))
532
+ self .assertEqual (out , 'F' )
533
+ out = self ._run_test ('testError' , 1 , AssertionError ('fail' ))
534
+ self .assertEqual (out , 'EF' )
535
+ out = self ._run_test ('testFail' , 1 , Exception ('error' ))
536
+ self .assertEqual (out , 'FE' )
537
+ out = self ._run_test ('testSkip' , 1 , AssertionError ('fail' ))
538
+ self .assertEqual (out , 'sF' )
539
+
540
+ def testLongOutputTearDownFail (self ):
541
+ classname = f'{ __name__ } .{ self .Test .__qualname__ } '
542
+ out = self ._run_test ('testSuccess' , 2 , AssertionError ('fail' ))
543
+ self .assertEqual (out ,
544
+ f'testSuccess ({ classname } ) ... FAIL\n ' )
545
+ out = self ._run_test ('testError' , 2 , AssertionError ('fail' ))
546
+ self .assertEqual (out ,
547
+ f'testError ({ classname } ) ... ERROR\n '
548
+ f'testError ({ classname } ) ... FAIL\n ' )
549
+ out = self ._run_test ('testFail' , 2 , Exception ('error' ))
550
+ self .assertEqual (out ,
551
+ f'testFail ({ classname } ) ... FAIL\n '
552
+ f'testFail ({ classname } ) ... ERROR\n ' )
553
+ out = self ._run_test ('testSkip' , 2 , AssertionError ('fail' ))
554
+ self .assertEqual (out ,
555
+ f"testSkip ({ classname } ) ... skipped 'skip'\n "
556
+ f'testSkip ({ classname } ) ... FAIL\n ' )
451
557
452
558
453
559
classDict = dict (unittest .TestResult .__dict__ )
0 commit comments