@@ -577,6 +577,79 @@ def test_xmlrunner_hold_traceback(self):
577577 countAfterTest = sys .getrefcount (self .DummyRefCountTest .dummy )
578578 self .assertEqual (countBeforeTest , countAfterTest )
579579
580+ class StderrXMLTestRunner (xmlrunner .XMLTestRunner ):
581+ """
582+ XMLTestRunner that outputs to sys.stderr that might be replaced
583+
584+ Though XMLTestRunner defaults to use sys.stderr as stream,
585+ it cannot be replaced e.g. by replaced by capture_stdout_stderr(),
586+ as it's already resolved.
587+ This class resolved sys.stderr lazily and outputs to replaced sys.stderr.
588+ """
589+ def __init__ (self , ** kwargs ):
590+ super (XMLTestRunnerTestCase .StderrXMLTestRunner , self ).__init__ (
591+ stream = sys .stderr ,
592+ ** kwargs
593+ )
594+
595+ def test_test_program_succeed_with_buffer (self ):
596+ with capture_stdout_stderr () as r :
597+ unittest .TestProgram (
598+ module = self .__class__ .__module__ ,
599+ testRunner = self .StderrXMLTestRunner ,
600+ argv = [
601+ sys .argv [0 ],
602+ '-b' ,
603+ 'XMLTestRunnerTestCase.DummyTest.test_runner_buffer_output_pass' ,
604+ ],
605+ exit = False ,
606+ )
607+ self .assertNotIn ('should not be printed' , r [0 ].getvalue ())
608+ self .assertNotIn ('should not be printed' , r [1 ].getvalue ())
609+
610+ def test_test_program_succeed_wo_buffer (self ):
611+ with capture_stdout_stderr () as r :
612+ unittest .TestProgram (
613+ module = self .__class__ .__module__ ,
614+ testRunner = self .StderrXMLTestRunner ,
615+ argv = [
616+ sys .argv [0 ],
617+ 'XMLTestRunnerTestCase.DummyTest.test_runner_buffer_output_pass' ,
618+ ],
619+ exit = False ,
620+ )
621+ self .assertIn ('should not be printed' , r [0 ].getvalue ())
622+ self .assertNotIn ('should not be printed' , r [1 ].getvalue ())
623+
624+ def test_test_program_fail_with_buffer (self ):
625+ with capture_stdout_stderr () as r :
626+ unittest .TestProgram (
627+ module = self .__class__ .__module__ ,
628+ testRunner = self .StderrXMLTestRunner ,
629+ argv = [
630+ sys .argv [0 ],
631+ '-b' ,
632+ 'XMLTestRunnerTestCase.DummyTest.test_runner_buffer_output_fail' ,
633+ ],
634+ exit = False ,
635+ )
636+ self .assertNotIn ('should be printed' , r [0 ].getvalue ())
637+ self .assertIn ('should be printed' , r [1 ].getvalue ())
638+
639+ def test_test_program_fail_wo_buffer (self ):
640+ with capture_stdout_stderr () as r :
641+ unittest .TestProgram (
642+ module = self .__class__ .__module__ ,
643+ testRunner = self .StderrXMLTestRunner ,
644+ argv = [
645+ sys .argv [0 ],
646+ 'XMLTestRunnerTestCase.DummyTest.test_runner_buffer_output_fail' ,
647+ ],
648+ exit = False ,
649+ )
650+ self .assertIn ('should be printed' , r [0 ].getvalue ())
651+ self .assertNotIn ('should be printed' , r [1 ].getvalue ())
652+
580653
581654class DuplicateWriterTestCase (unittest .TestCase ):
582655 def setUp (self ):
0 commit comments