diff --git a/_pytest/terminal.py b/_pytest/terminal.py index 8538ee6aa..c5cbe14a1 100644 --- a/_pytest/terminal.py +++ b/_pytest/terminal.py @@ -313,8 +313,11 @@ class TerminalReporter: _PROGRESS_LENGTH = len(' [100%]') def _get_progress_information_message(self): - progress = self._progress_items_reported * 100 // self._session.testscollected - return ' [{:3d}%]'.format(progress) + collected = self._session.testscollected + if collected: + progress = self._progress_items_reported * 100 // collected + return ' [{:3d}%]'.format(progress) + return ' [100%]' def _write_progress_information_filling_space(self): if not self._show_progress_info: diff --git a/changelog/2971.bugfix b/changelog/2971.bugfix new file mode 100644 index 000000000..36684e8c8 --- /dev/null +++ b/changelog/2971.bugfix @@ -0,0 +1 @@ +Fix ``ZeroDivisionError`` when using the ``testmon`` plugin when no tests were actually collected. diff --git a/testing/test_terminal.py b/testing/test_terminal.py index 98a8ca121..97c2f71fb 100644 --- a/testing/test_terminal.py +++ b/testing/test_terminal.py @@ -988,6 +988,24 @@ class TestProgress: """, ) + def test_zero_tests_collected(self, testdir): + """Some plugins (testmon for example) might issue pytest_runtest_logreport without any tests being + actually collected (#2971).""" + testdir.makeconftest(""" + def pytest_collection_modifyitems(items, config): + from _pytest.runner import CollectReport + for node_id in ('nodeid1', 'nodeid2'): + rep = CollectReport(node_id, 'passed', None, None) + rep.when = 'passed' + rep.duration = 0.1 + config.hook.pytest_runtest_logreport(report=rep) + """) + output = testdir.runpytest() + assert 'ZeroDivisionError' not in output.stdout.str() + output.stdout.fnmatch_lines([ + '=* 2 passed in *=', + ]) + def test_normal(self, many_tests_file, testdir): output = testdir.runpytest() output.stdout.re_match_lines([