From 9c4be4fd58f405af4f90ce62a45d40c33e9e986e Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Mon, 20 Feb 2023 16:19:27 -0600 Subject: [PATCH] allow a progress bar even when capture=no --- src/_pytest/terminal.py | 14 ++++++++++---- testing/test_terminal.py | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/_pytest/terminal.py b/src/_pytest/terminal.py index 1b73da89b..a58c28a2f 100644 --- a/src/_pytest/terminal.py +++ b/src/_pytest/terminal.py @@ -229,7 +229,8 @@ def pytest_addoption(parser: Parser) -> None: parser.addini( "console_output_style", help='Console output: "classic", or with additional progress information ' - '("progress" (percentage) | "count")', + '("progress" (percentage) | "count" | "progress-even-when-capture-no" (forces ' + 'progress even when capture=no)', default="progress", ) @@ -346,14 +347,19 @@ class TerminalReporter: def _determine_show_progress_info(self) -> "Literal['progress', 'count', False]": """Return whether we should display progress information based on the current config.""" - # do not show progress if we are not capturing output (#3038) - if self.config.getoption("capture", "no") == "no": + # do not show progress if we are not capturing output (#3038) unless explicitly + # overridden by progress-even-when-capture-no + if ( + self.config.getoption("capture", "no") == "no" + and self.config.getini("console_output_style") + != "progress-even-when-capture-no" + ): return False # do not show progress if we are showing fixture setup/teardown if self.config.getoption("setupshow", False): return False cfg: str = self.config.getini("console_output_style") - if cfg == "progress": + if cfg == "progress" or cfg == "progress-even-when-capture-no": return "progress" elif cfg == "count": return "count" diff --git a/testing/test_terminal.py b/testing/test_terminal.py index 453f18323..8a77e107d 100644 --- a/testing/test_terminal.py +++ b/testing/test_terminal.py @@ -2213,6 +2213,24 @@ class TestProgressOutputStyle: output = pytester.runpytest("--capture=no") output.stdout.no_fnmatch_line("*%]*") + def test_capture_no_progress_enabled( + self, many_tests_files, pytester: Pytester + ) -> None: + pytester.makeini( + """ + [pytest] + console_output_style = progress-even-when-capture-no + """ + ) + output = pytester.runpytest("-s") + output.stdout.re_match_lines( + [ + r"test_bar.py \.{10} \s+ \[ 50%\]", + r"test_foo.py \.{5} \s+ \[ 75%\]", + r"test_foobar.py \.{5} \s+ \[100%\]", + ] + ) + class TestProgressWithTeardown: """Ensure we show the correct percentages for tests that fail during teardown (#3088)"""