Skip to content

Commit f70ae66

Browse files
committed
terminal: fix progress report with duplicate nodeids
Fixes pytest-dev#6597.
1 parent 18ac7e0 commit f70ae66

File tree

3 files changed

+33
-12
lines changed

3 files changed

+33
-12
lines changed

changelog/6597.bugfix.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix percentage progress report with duplicate nodeids.

src/_pytest/terminal.py

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
from typing import List
1616
from typing import Mapping
1717
from typing import Optional
18-
from typing import Set
1918
from typing import Tuple
2019

2120
import attr
@@ -258,7 +257,7 @@ def __init__(self, config: Config, file=None) -> None:
258257
self.reportchars = getreportopt(config)
259258
self.hasmarkup = self._tw.hasmarkup
260259
self.isatty = file.isatty()
261-
self._progress_nodeids_reported = set() # type: Set[str]
260+
self._numreported = 0
262261
self._show_progress_info = self._determine_show_progress_info()
263262
self._collect_report_last_write = None # type: Optional[float]
264263

@@ -437,7 +436,8 @@ def pytest_runtest_logreport(self, report: TestReport) -> None:
437436
else:
438437
self._tw.write(letter, **markup)
439438
else:
440-
self._progress_nodeids_reported.add(rep.nodeid)
439+
if rep.when == "call":
440+
self._numreported += 1
441441
line = self._locationline(rep.nodeid, *rep.location)
442442
if not running_xdist:
443443
self.write_ensure_prefix(line, word, **markup)
@@ -467,10 +467,8 @@ def pytest_runtest_logfinish(self, nodeid):
467467

468468
main_color, _ = _get_main_color(self.stats)
469469

470-
self._progress_nodeids_reported.add(nodeid)
471-
is_last_item = (
472-
len(self._progress_nodeids_reported) == self._session.testscollected
473-
)
470+
self._numreported += 1
471+
is_last_item = self._numreported == self._session.testscollected
474472
if is_last_item:
475473
self._write_progress_information_filling_space(color=main_color)
476474
else:
@@ -485,16 +483,13 @@ def _get_progress_information_message(self) -> str:
485483
collected = self._session.testscollected
486484
if self._show_progress_info == "count":
487485
if collected:
488-
progress = self._progress_nodeids_reported
489486
counter_format = "{{:{}d}}".format(len(str(collected)))
490487
format_string = " [{}/{{}}]".format(counter_format)
491-
return format_string.format(len(progress), collected)
488+
return format_string.format(self._numreported, collected)
492489
return " [ {} / {} ]".format(collected, collected)
493490
else:
494491
if collected:
495-
return " [{:3d}%]".format(
496-
len(self._progress_nodeids_reported) * 100 // collected
497-
)
492+
return " [{:3d}%]".format(self._numreported * 100 // collected)
498493
return " [100%]"
499494

500495
def _write_progress_information_filling_space(self, color=None):

testing/test_terminal.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1593,6 +1593,31 @@ def test_normal(self, many_tests_files, testdir):
15931593
]
15941594
)
15951595

1596+
def test_same_nodeids(self, testdir: Testdir) -> None:
1597+
p1 = testdir.makepyfile(
1598+
"""
1599+
import pytest
1600+
1601+
@pytest.mark.parametrize("v", ["", " "])
1602+
@pytest.mark.parametrize("w", ["", " "])
1603+
def test(v, w):
1604+
pass
1605+
"""
1606+
)
1607+
result = testdir.runpytest("-v", str(p1))
1608+
trans = str.maketrans({"[": "[[]", "]": "[]]"})
1609+
result.stdout.fnmatch_lines(
1610+
[
1611+
line.translate(trans)
1612+
for line in [
1613+
"test_same_nodeids.py::test[] PASSED * [ 25%]",
1614+
"test_same_nodeids.py::test[ ] PASSED * [ 50%]",
1615+
"test_same_nodeids.py::test[ ] PASSED * [ 75%]",
1616+
"test_same_nodeids.py::test[ - ] PASSED * [100%]",
1617+
]
1618+
]
1619+
)
1620+
15961621
def test_colored_progress(self, testdir, monkeypatch):
15971622
monkeypatch.setenv("PY_COLORS", "1")
15981623
testdir.makepyfile(

0 commit comments

Comments
 (0)