Skip to content

Commit ff296fd

Browse files
committed
Add capstdout and capstderr attrs to TestReport
Related to #1790
1 parent 08002ab commit ff296fd

File tree

3 files changed

+63
-11
lines changed

3 files changed

+63
-11
lines changed

_pytest/junitxml.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,10 @@ def _add_simple(self, kind, message, data=None):
118118

119119
def _write_captured_output(self, report):
120120
for capname in ('out', 'err'):
121-
allcontent = ""
122-
for name, content in report.get_sections("Captured std%s" %
123-
capname):
124-
allcontent += content
125-
if allcontent:
121+
content = getattr(report, 'capstd' + capname)
122+
if content:
126123
tag = getattr(Junit, 'system-' + capname)
127-
self.append(tag(bin_xml_escape(allcontent)))
124+
self.append(tag(bin_xml_escape(content)))
128125

129126
def append_pass(self, report):
130127
self.add_stats('passed')

_pytest/runner.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,22 @@ def longreprtext(self):
225225
exc = tw.stringio.getvalue()
226226
return exc.strip()
227227

228+
@property
229+
def capstdout(self):
230+
"""Return captured text from stdout, if capturing is enabled
231+
232+
.. versionadded:: 3.0
233+
"""
234+
return ''.join(content for (prefix, content) in self.get_sections('Captured stdout'))
235+
236+
@property
237+
def capstderr(self):
238+
"""Return captured text from stderr, if capturing is enabled
239+
240+
.. versionadded:: 3.0
241+
"""
242+
return ''.join(content for (prefix, content) in self.get_sections('Captured stderr'))
243+
228244
passed = property(lambda x: x.outcome == "passed")
229245
failed = property(lambda x: x.outcome == "failed")
230246
skipped = property(lambda x: x.outcome == "skipped")

testing/test_runner.py

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -672,18 +672,21 @@ def runtest(self):
672672

673673
class TestReportContents:
674674
"""
675-
Test ``longreprtext`` property of TestReport objects.
675+
Test user-level API of ``TestReport`` objects.
676676
"""
677677

678-
def test_pass(self, testdir):
678+
def getrunner(self):
679+
return lambda item: runner.runtestprotocol(item, log=False)
680+
681+
def test_longreprtext_pass(self, testdir):
679682
reports = testdir.runitem("""
680683
def test_func():
681684
pass
682685
""")
683686
rep = reports[1]
684687
assert rep.longreprtext == ''
685688

686-
def test_failure(self, testdir):
689+
def test_longreprtext_failure(self, testdir):
687690
reports = testdir.runitem("""
688691
def test_func():
689692
x = 1
@@ -692,5 +695,41 @@ def test_func():
692695
rep = reports[1]
693696
assert 'assert 1 == 4' in rep.longreprtext
694697

695-
def getrunner(self):
696-
return lambda item: runner.runtestprotocol(item, log=False)
698+
def test_captured_text(self, testdir):
699+
reports = testdir.runitem("""
700+
import pytest
701+
import sys
702+
703+
@pytest.fixture
704+
def fix():
705+
sys.stdout.write('setup: stdout\\n')
706+
sys.stderr.write('setup: stderr\\n')
707+
yield
708+
sys.stdout.write('teardown: stdout\\n')
709+
sys.stderr.write('teardown: stderr\\n')
710+
assert 0
711+
712+
def test_func(fix):
713+
sys.stdout.write('call: stdout\\n')
714+
sys.stderr.write('call: stderr\\n')
715+
assert 0
716+
""")
717+
setup, call, teardown = reports
718+
assert setup.capstdout == 'setup: stdout\n'
719+
assert call.capstdout == 'setup: stdout\ncall: stdout\n'
720+
assert teardown.capstdout == 'setup: stdout\ncall: stdout\nteardown: stdout\n'
721+
722+
assert setup.capstderr == 'setup: stderr\n'
723+
assert call.capstderr == 'setup: stderr\ncall: stderr\n'
724+
assert teardown.capstderr == 'setup: stderr\ncall: stderr\nteardown: stderr\n'
725+
726+
def test_no_captured_text(self, testdir):
727+
reports = testdir.runitem("""
728+
def test_func():
729+
pass
730+
""")
731+
rep = reports[1]
732+
assert rep.capstdout == ''
733+
assert rep.capstderr == ''
734+
735+

0 commit comments

Comments
 (0)