From a869141b3de68ea5bb3ad7b9d1935e94fc54b78b Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Wed, 8 Mar 2023 04:49:37 +0800 Subject: [PATCH] New option to allow a progress report even when capture=no (#10755) --- changelog/10755.feature.rst | 1 + doc/en/reference/reference.rst | 1 + src/_pytest/terminal.py | 14 ++++++++++---- testing/test_terminal.py | 18 ++++++++++++++++++ 4 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 changelog/10755.feature.rst diff --git a/changelog/10755.feature.rst b/changelog/10755.feature.rst new file mode 100644 index 000000000..5fb5a97d4 --- /dev/null +++ b/changelog/10755.feature.rst @@ -0,0 +1 @@ +:confval:`console_output_style` now supports ``progress-even-when-capture-no`` to force the use of the progress output even when capture is disabled. This is useful in large test suites where capture may have significant performance impact. diff --git a/doc/en/reference/reference.rst b/doc/en/reference/reference.rst index c882157ee..f92b443f3 100644 --- a/doc/en/reference/reference.rst +++ b/doc/en/reference/reference.rst @@ -1220,6 +1220,7 @@ passed multiple times. The expected format is ``name=value``. For example:: * ``classic``: classic pytest output. * ``progress``: like classic pytest output, but with a progress indicator. + * ``progress-even-when-capture-no``: allows the use of the progress indicator even when ``capture=no``. * ``count``: like progress, but shows progress as the number of tests completed instead of a percent. The default is ``progress``, but you can fallback to ``classic`` if you prefer or diff --git a/src/_pytest/terminal.py b/src/_pytest/terminal.py index 1b73da89b..323c118e4 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)"""