33
44"""Executable module to test unittest-xml-reporting.
55"""
6+ import contextlib
7+ import io
68import sys
79
810from xmlrunner .unittest import unittest
@@ -55,6 +57,22 @@ def test_doctest_example(self):
5557 'name="twice"' .encode ('utf8' ), output )
5658
5759
60+ @contextlib .contextmanager
61+ def capture_stdout_stderr ():
62+ """
63+ context manager to capture stdout and stderr
64+ """
65+ orig_stdout = sys .stdout
66+ orig_stderr = sys .stderr
67+ sys .stdout = StringIO ()
68+ sys .stderr = StringIO ()
69+ try :
70+ yield (sys .stdout , sys .stderr )
71+ finally :
72+ sys .stdout = orig_stdout
73+ sys .stderr = orig_stderr
74+
75+
5876class XMLTestRunnerTestCase (unittest .TestCase ):
5977 """
6078 XMLTestRunner test case.
@@ -102,6 +120,9 @@ def test_runner_buffer_output_fail(self):
102120 print ('should be printed' )
103121 self .fail ('expected to fail' )
104122
123+ def test_output (self ):
124+ print ('test message' )
125+
105126 def test_non_ascii_runner_buffer_output_fail (self ):
106127 print (u'Where is the café ?' )
107128 self .fail (u'The café could not be found' )
@@ -270,7 +291,25 @@ def test_xmlrunner_non_ascii_failures(self):
270291 runner = xmlrunner .XMLTestRunner (
271292 stream = self .stream , output = outdir , verbosity = self .verbosity ,
272293 ** self .runner_kwargs )
273- runner .run (suite )
294+
295+ # allow output non-ascii letters to stdout
296+ orig_stdout = sys .stdout
297+ if getattr (sys .stdout , 'buffer' , None ):
298+ # Python3
299+ sys .stdout = io .TextIOWrapper (sys .stdout .buffer , encoding = 'utf-8' )
300+ else :
301+ # Python2
302+ import codecs
303+ sys .stdout = codecs .getwriter ("utf-8" )(sys .stdout )
304+
305+ try :
306+ runner .run (suite )
307+ finally :
308+ if getattr (sys .stdout , 'buffer' , None ):
309+ # Python3
310+ # Not to be closed when TextIOWrapper is disposed.
311+ sys .stdout .detach ()
312+ sys .stdout = orig_stdout
274313 outdir .seek (0 )
275314 output = outdir .read ()
276315 self .assertIn (
@@ -296,10 +335,52 @@ def test_xmlrunner_buffer_output_pass(self):
296335 def test_xmlrunner_buffer_output_fail (self ):
297336 suite = unittest .TestSuite ()
298337 suite .addTest (self .DummyTest ('test_runner_buffer_output_fail' ))
338+ # --buffer option
339+ self .runner_kwargs ['buffer' ] = True
299340 self ._test_xmlrunner (suite )
300341 testsuite_output = self .stream .getvalue ()
301342 self .assertIn ('should be printed' , testsuite_output )
302343
344+ def test_xmlrunner_output_without_buffer (self ):
345+ suite = unittest .TestSuite ()
346+ suite .addTest (self .DummyTest ('test_output' ))
347+ with capture_stdout_stderr () as r :
348+ self ._test_xmlrunner (suite )
349+ output_from_test = r [0 ].getvalue ()
350+ self .assertIn ('test message' , output_from_test )
351+
352+ def test_xmlrunner_output_with_buffer (self ):
353+ suite = unittest .TestSuite ()
354+ suite .addTest (self .DummyTest ('test_output' ))
355+ # --buffer option
356+ self .runner_kwargs ['buffer' ] = True
357+ with capture_stdout_stderr () as r :
358+ self ._test_xmlrunner (suite )
359+ output_from_test = r [0 ].getvalue ()
360+ self .assertNotIn ('test message' , output_from_test )
361+
362+ def test_xmlrunner_stdout_stderr_recovered_without_buffer (self ):
363+ orig_stdout = sys .stdout
364+ orig_stderr = sys .stderr
365+ suite = unittest .TestSuite ()
366+ suite .addTest (self .DummyTest ('test_pass' ))
367+ self ._test_xmlrunner (suite )
368+ self .assertIs (orig_stdout , sys .stdout )
369+ self .assertIs (orig_stderr , sys .stderr )
370+
371+ def test_xmlrunner_stdout_stderr_recovered_with_buffer (self ):
372+ orig_stdout = sys .stdout
373+ orig_stderr = sys .stderr
374+ suite = unittest .TestSuite ()
375+ suite .addTest (self .DummyTest ('test_pass' ))
376+ # --buffer option
377+ self .runner_kwargs ['buffer' ] = True
378+ self ._test_xmlrunner (suite )
379+ self .assertIs (orig_stdout , sys .stdout )
380+ self .assertIs (orig_stderr , sys .stderr )
381+ suite = unittest .TestSuite ()
382+ suite .addTest (self .DummyTest ('test_pass' ))
383+
303384 @unittest .skipIf (not hasattr (unittest .TestCase , 'subTest' ),
304385 'unittest.TestCase.subTest not present.' )
305386 def test_unittest_subTest_fail (self ):
0 commit comments