Skip to content

Commit f606077

Browse files
committed
terminal: fix progress report with duplicate nodeids
Fixes #6597.
1 parent a8fc056 commit f606077

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
@@ -1597,6 +1597,31 @@ def test_normal(self, many_tests_files, testdir):
15971597
]
15981598
)
15991599

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

0 commit comments

Comments
 (0)