Merge pull request #3880 from jeffreyrack/3829-progress_display_mode
#3829 -- Add the ability to show test progress as number of tests completed instead of a percent.
This commit is contained in:
commit
a605ad4d11
|
@ -0,0 +1 @@
|
||||||
|
Added the ``count`` option to ``console_output_style`` to enable displaying the progress as a count instead of a percentage.
|
|
@ -940,6 +940,7 @@ passed multiple times. The expected format is ``name=value``. For example::
|
||||||
|
|
||||||
* ``classic``: classic pytest output.
|
* ``classic``: classic pytest output.
|
||||||
* ``progress``: like classic pytest output, but with a progress indicator.
|
* ``progress``: like classic pytest output, but with a progress indicator.
|
||||||
|
* ``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
|
The default is ``progress``, but you can fallback to ``classic`` if you prefer or
|
||||||
the new mode is causing unexpected problems:
|
the new mode is causing unexpected problems:
|
||||||
|
|
|
@ -254,7 +254,7 @@ class TerminalReporter(object):
|
||||||
# do not show progress if we are showing fixture setup/teardown
|
# do not show progress if we are showing fixture setup/teardown
|
||||||
if self.config.getoption("setupshow"):
|
if self.config.getoption("setupshow"):
|
||||||
return False
|
return False
|
||||||
return self.config.getini("console_output_style") == "progress"
|
return self.config.getini("console_output_style") in ("progress", "count")
|
||||||
|
|
||||||
def hasopt(self, char):
|
def hasopt(self, char):
|
||||||
char = {"xfailed": "x", "skipped": "s"}.get(char, char)
|
char = {"xfailed": "x", "skipped": "s"}.get(char, char)
|
||||||
|
@ -404,6 +404,12 @@ class TerminalReporter(object):
|
||||||
self.currentfspath = -2
|
self.currentfspath = -2
|
||||||
|
|
||||||
def pytest_runtest_logfinish(self, nodeid):
|
def pytest_runtest_logfinish(self, nodeid):
|
||||||
|
if self.config.getini("console_output_style") == "count":
|
||||||
|
num_tests = self._session.testscollected
|
||||||
|
progress_length = len(" [{}/{}]".format(str(num_tests), str(num_tests)))
|
||||||
|
else:
|
||||||
|
progress_length = len(" [100%]")
|
||||||
|
|
||||||
if self.verbosity <= 0 and self._show_progress_info:
|
if self.verbosity <= 0 and self._show_progress_info:
|
||||||
self._progress_nodeids_reported.add(nodeid)
|
self._progress_nodeids_reported.add(nodeid)
|
||||||
last_item = (
|
last_item = (
|
||||||
|
@ -413,23 +419,29 @@ class TerminalReporter(object):
|
||||||
self._write_progress_information_filling_space()
|
self._write_progress_information_filling_space()
|
||||||
else:
|
else:
|
||||||
past_edge = (
|
past_edge = (
|
||||||
self._tw.chars_on_current_line + self._PROGRESS_LENGTH + 1
|
self._tw.chars_on_current_line + progress_length + 1
|
||||||
>= self._screen_width
|
>= self._screen_width
|
||||||
)
|
)
|
||||||
if past_edge:
|
if past_edge:
|
||||||
msg = self._get_progress_information_message()
|
msg = self._get_progress_information_message()
|
||||||
self._tw.write(msg + "\n", cyan=True)
|
self._tw.write(msg + "\n", cyan=True)
|
||||||
|
|
||||||
_PROGRESS_LENGTH = len(" [100%]")
|
|
||||||
|
|
||||||
def _get_progress_information_message(self):
|
def _get_progress_information_message(self):
|
||||||
if self.config.getoption("capture") == "no":
|
if self.config.getoption("capture") == "no":
|
||||||
return ""
|
return ""
|
||||||
collected = self._session.testscollected
|
collected = self._session.testscollected
|
||||||
if collected:
|
if self.config.getini("console_output_style") == "count":
|
||||||
progress = len(self._progress_nodeids_reported) * 100 // collected
|
if collected:
|
||||||
return " [{:3d}%]".format(progress)
|
progress = self._progress_nodeids_reported
|
||||||
return " [100%]"
|
counter_format = "{{:{}d}}".format(len(str(collected)))
|
||||||
|
format_string = " [{}/{{}}]".format(counter_format)
|
||||||
|
return format_string.format(len(progress), collected)
|
||||||
|
return " [ {} / {} ]".format(collected, collected)
|
||||||
|
else:
|
||||||
|
if collected:
|
||||||
|
progress = len(self._progress_nodeids_reported) * 100 // collected
|
||||||
|
return " [{:3d}%]".format(progress)
|
||||||
|
return " [100%]"
|
||||||
|
|
||||||
def _write_progress_information_filling_space(self):
|
def _write_progress_information_filling_space(self):
|
||||||
msg = self._get_progress_information_message()
|
msg = self._get_progress_information_message()
|
||||||
|
|
|
@ -1183,6 +1183,22 @@ class TestProgress(object):
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_count(self, many_tests_files, testdir):
|
||||||
|
testdir.makeini(
|
||||||
|
"""
|
||||||
|
[pytest]
|
||||||
|
console_output_style = count
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
output = testdir.runpytest()
|
||||||
|
output.stdout.re_match_lines(
|
||||||
|
[
|
||||||
|
r"test_bar.py \.{10} \s+ \[10/20\]",
|
||||||
|
r"test_foo.py \.{5} \s+ \[15/20\]",
|
||||||
|
r"test_foobar.py \.{5} \s+ \[20/20\]",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
def test_verbose(self, many_tests_files, testdir):
|
def test_verbose(self, many_tests_files, testdir):
|
||||||
output = testdir.runpytest("-v")
|
output = testdir.runpytest("-v")
|
||||||
output.stdout.re_match_lines(
|
output.stdout.re_match_lines(
|
||||||
|
@ -1193,11 +1209,38 @@ class TestProgress(object):
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_verbose_count(self, many_tests_files, testdir):
|
||||||
|
testdir.makeini(
|
||||||
|
"""
|
||||||
|
[pytest]
|
||||||
|
console_output_style = count
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
output = testdir.runpytest("-v")
|
||||||
|
output.stdout.re_match_lines(
|
||||||
|
[
|
||||||
|
r"test_bar.py::test_bar\[0\] PASSED \s+ \[ 1/20\]",
|
||||||
|
r"test_foo.py::test_foo\[4\] PASSED \s+ \[15/20\]",
|
||||||
|
r"test_foobar.py::test_foobar\[4\] PASSED \s+ \[20/20\]",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
def test_xdist_normal(self, many_tests_files, testdir):
|
def test_xdist_normal(self, many_tests_files, testdir):
|
||||||
pytest.importorskip("xdist")
|
pytest.importorskip("xdist")
|
||||||
output = testdir.runpytest("-n2")
|
output = testdir.runpytest("-n2")
|
||||||
output.stdout.re_match_lines([r"\.{20} \s+ \[100%\]"])
|
output.stdout.re_match_lines([r"\.{20} \s+ \[100%\]"])
|
||||||
|
|
||||||
|
def test_xdist_normal_count(self, many_tests_files, testdir):
|
||||||
|
pytest.importorskip("xdist")
|
||||||
|
testdir.makeini(
|
||||||
|
"""
|
||||||
|
[pytest]
|
||||||
|
console_output_style = count
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
output = testdir.runpytest("-n2")
|
||||||
|
output.stdout.re_match_lines([r"\.{20} \s+ \[20/20\]"])
|
||||||
|
|
||||||
def test_xdist_verbose(self, many_tests_files, testdir):
|
def test_xdist_verbose(self, many_tests_files, testdir):
|
||||||
pytest.importorskip("xdist")
|
pytest.importorskip("xdist")
|
||||||
output = testdir.runpytest("-n2", "-v")
|
output = testdir.runpytest("-n2", "-v")
|
||||||
|
|
Loading…
Reference in New Issue