diff --git a/src/_pytest/capture.py b/src/_pytest/capture.py index 6d98676be5f..33659fac952 100644 --- a/src/_pytest/capture.py +++ b/src/_pytest/capture.py @@ -1049,14 +1049,20 @@ def test_output(capteesys): assert captured.out == "hello\n" """ capman: CaptureManager = request.config.pluginmanager.getplugin("capturemanager") - capture_fixture = CaptureFixture( - SysCapture, request, config=dict(tee=True), _ispytest=True - ) - capman.set_fixture(capture_fixture) - capture_fixture._start() - yield capture_fixture - capture_fixture.close() - capman.unset_fixture() + if capman.is_globally_capturing(): + capture_fixture = CaptureFixture( + SysCapture, request, config=dict(tee=True), _ispytest=True + ) + capman.set_fixture(capture_fixture) + capture_fixture._start() + yield capture_fixture + capture_fixture.close() + capman.unset_fixture() + else: + # capteesys does nothing when global capturing is disabled. + # This is so that the "tee" part of cap-tee-sys is not + # implemented without the "cap" part. + yield CaptureFixture(SysCapture, request, _ispytest=True) @fixture diff --git a/testing/test_capteesys_issue.py b/testing/test_capteesys_issue.py new file mode 100644 index 00000000000..b06f217470f --- /dev/null +++ b/testing/test_capteesys_issue.py @@ -0,0 +1,16 @@ +from __future__ import annotations + +import sys +from typing import TYPE_CHECKING + + +if TYPE_CHECKING: + from _pytest.capture import CaptureFixture + from _pytest.fixtures import SubRequest + + +def test_dummy_test_with_traceback( + request: SubRequest, capteesys: CaptureFixture[str] +) -> None: + print("Hello world stdout", flush=True) + print("Hello world stderr", file=sys.stderr, flush=True)