3
3
4
4
"""Executable module to test unittest-xml-reporting.
5
5
"""
6
+ import contextlib
7
+ import io
6
8
import sys
7
9
8
10
from xmlrunner .unittest import unittest
@@ -55,6 +57,22 @@ def test_doctest_example(self):
55
57
'name="twice"' .encode ('utf8' ), output )
56
58
57
59
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
+
58
76
class XMLTestRunnerTestCase (unittest .TestCase ):
59
77
"""
60
78
XMLTestRunner test case.
@@ -102,6 +120,9 @@ def test_runner_buffer_output_fail(self):
102
120
print ('should be printed' )
103
121
self .fail ('expected to fail' )
104
122
123
+ def test_output (self ):
124
+ print ('test message' )
125
+
105
126
def test_non_ascii_runner_buffer_output_fail (self ):
106
127
print (u'Where is the café ?' )
107
128
self .fail (u'The café could not be found' )
@@ -270,7 +291,25 @@ def test_xmlrunner_non_ascii_failures(self):
270
291
runner = xmlrunner .XMLTestRunner (
271
292
stream = self .stream , output = outdir , verbosity = self .verbosity ,
272
293
** 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
274
313
outdir .seek (0 )
275
314
output = outdir .read ()
276
315
self .assertIn (
@@ -296,10 +335,52 @@ def test_xmlrunner_buffer_output_pass(self):
296
335
def test_xmlrunner_buffer_output_fail (self ):
297
336
suite = unittest .TestSuite ()
298
337
suite .addTest (self .DummyTest ('test_runner_buffer_output_fail' ))
338
+ # --buffer option
339
+ self .runner_kwargs ['buffer' ] = True
299
340
self ._test_xmlrunner (suite )
300
341
testsuite_output = self .stream .getvalue ()
301
342
self .assertIn ('should be printed' , testsuite_output )
302
343
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
+
303
384
@unittest .skipIf (not hasattr (unittest .TestCase , 'subTest' ),
304
385
'unittest.TestCase.subTest not present.' )
305
386
def test_unittest_subTest_fail (self ):
0 commit comments