diff --git a/changelog/9626.bugfix.rst b/changelog/9626.bugfix.rst new file mode 100644 index 0000000000..44d3734a1d --- /dev/null +++ b/changelog/9626.bugfix.rst @@ -0,0 +1,3 @@ +Fixed count of selected tests on terminal collection summary when there were errors or skipped modules. + +If there were errors or skipped modules on collection, pytest would mistakenly subtract those from the selected count. diff --git a/src/_pytest/terminal.py b/src/_pytest/terminal.py index 4bcc968d10..b4848c48ab 100644 --- a/src/_pytest/terminal.py +++ b/src/_pytest/terminal.py @@ -663,7 +663,7 @@ def report_collect(self, final: bool = False) -> None: errors = len(self.stats.get("error", [])) skipped = len(self.stats.get("skipped", [])) deselected = len(self.stats.get("deselected", [])) - selected = self._numcollected - errors - skipped - deselected + selected = self._numcollected - deselected line = "collected " if final else "collecting " line += ( str(self._numcollected) + " item" + ("" if self._numcollected == 1 else "s") @@ -674,7 +674,7 @@ def report_collect(self, final: bool = False) -> None: line += " / %d deselected" % deselected if skipped: line += " / %d skipped" % skipped - if self._numcollected > selected > 0: + if self._numcollected > selected: line += " / %d selected" % selected if self.isatty: self.rewrite(line, bold=True, erase=True) diff --git a/testing/test_cacheprovider.py b/testing/test_cacheprovider.py index cc6d547dfb..2baa3c8f18 100644 --- a/testing/test_cacheprovider.py +++ b/testing/test_cacheprovider.py @@ -773,7 +773,7 @@ def pytest_sessionfinish(): result = pytester.runpytest("--lf", "--lfnf", "none") result.stdout.fnmatch_lines( [ - "collected 2 items / 2 deselected", + "collected 2 items / 2 deselected / 0 selected", "run-last-failure: no previously failed tests, deselecting all items.", "deselected=2", "* 2 deselected in *", diff --git a/testing/test_terminal.py b/testing/test_terminal.py index e5f4126628..f0e58e5b4c 100644 --- a/testing/test_terminal.py +++ b/testing/test_terminal.py @@ -783,6 +783,33 @@ def test_pass(): result.stdout.no_fnmatch_line("*= 1 deselected =*") assert result.ret == 0 + def test_selected_count_with_error(self, pytester: Pytester) -> None: + pytester.makepyfile( + test_selected_count_3=""" + def test_one(): + pass + def test_two(): + pass + def test_three(): + pass + """, + test_selected_count_error=""" + 5/0 + def test_foo(): + pass + def test_bar(): + pass + """, + ) + result = pytester.runpytest("-k", "test_t") + result.stdout.fnmatch_lines( + [ + "collected 3 items / 1 error / 1 deselected / 2 selected", + "* ERROR collecting test_selected_count_error.py *", + ] + ) + assert result.ret == ExitCode.INTERRUPTED + def test_no_skip_summary_if_failure(self, pytester: Pytester) -> None: pytester.makepyfile( """