Merge pull request #6834 from RonnyPfannschmidt/fix-6833-summarize-warning-item-locations
summarize warning summaries if the number of locations is high
This commit is contained in:
commit
194b52145b
|
@ -0,0 +1 @@
|
||||||
|
Excess warning summaries are now collapsed per file to ensure readable display of warning summaries.
|
|
@ -837,16 +837,32 @@ class TerminalReporter:
|
||||||
for wr in warning_reports:
|
for wr in warning_reports:
|
||||||
reports_grouped_by_message.setdefault(wr.message, []).append(wr)
|
reports_grouped_by_message.setdefault(wr.message, []).append(wr)
|
||||||
|
|
||||||
title = "warnings summary (final)" if final else "warnings summary"
|
def collapsed_location_report(reports: List[WarningReport]):
|
||||||
self.write_sep("=", title, yellow=True, bold=False)
|
locations = []
|
||||||
for message, warning_reports in reports_grouped_by_message.items():
|
|
||||||
has_any_location = False
|
|
||||||
for w in warning_reports:
|
for w in warning_reports:
|
||||||
location = w.get_location(self.config)
|
location = w.get_location(self.config)
|
||||||
if location:
|
if location:
|
||||||
self._tw.line(str(location))
|
locations.append(location)
|
||||||
has_any_location = True
|
|
||||||
if has_any_location:
|
if len(locations) < 10:
|
||||||
|
return "\n".join(map(str, locations))
|
||||||
|
|
||||||
|
counts_by_filename = collections.Counter(
|
||||||
|
str(loc).split("::", 1)[0] for loc in locations
|
||||||
|
)
|
||||||
|
return "\n".join(
|
||||||
|
"{0}: {1} test{2} with warning{2}".format(
|
||||||
|
k, v, "s" if v > 1 else ""
|
||||||
|
)
|
||||||
|
for k, v in counts_by_filename.items()
|
||||||
|
)
|
||||||
|
|
||||||
|
title = "warnings summary (final)" if final else "warnings summary"
|
||||||
|
self.write_sep("=", title, yellow=True, bold=False)
|
||||||
|
for message, warning_reports in reports_grouped_by_message.items():
|
||||||
|
maybe_location = collapsed_location_report(warning_reports)
|
||||||
|
if maybe_location:
|
||||||
|
self._tw.line(maybe_location)
|
||||||
lines = message.splitlines()
|
lines = message.splitlines()
|
||||||
indented = "\n".join(" " + x for x in lines)
|
indented = "\n".join(" " + x for x in lines)
|
||||||
message = indented.rstrip()
|
message = indented.rstrip()
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
import warnings
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
def func():
|
||||||
|
warnings.warn(UserWarning("foo"))
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(params=range(20), autouse=True)
|
||||||
|
def repeat_hack(request):
|
||||||
|
return request.param
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("i", range(5))
|
||||||
|
def test_foo(i):
|
||||||
|
func()
|
||||||
|
|
||||||
|
|
||||||
|
def test_bar():
|
||||||
|
func()
|
|
@ -584,6 +584,24 @@ def test_group_warnings_by_message(testdir):
|
||||||
assert result.stdout.str().count(warning_code) == 1
|
assert result.stdout.str().count(warning_code) == 1
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.filterwarnings("ignore::pytest.PytestExperimentalApiWarning")
|
||||||
|
@pytest.mark.filterwarnings("always")
|
||||||
|
def test_group_warnings_by_message_summary(testdir):
|
||||||
|
testdir.copy_example("warnings/test_group_warnings_by_message_summary.py")
|
||||||
|
result = testdir.runpytest()
|
||||||
|
result.stdout.fnmatch_lines(
|
||||||
|
[
|
||||||
|
"*== %s ==*" % WARNINGS_SUMMARY_HEADER,
|
||||||
|
"test_group_warnings_by_message_summary.py: 120 tests with warnings",
|
||||||
|
"*test_group_warnings_by_message_summary.py:7: UserWarning: foo",
|
||||||
|
],
|
||||||
|
consecutive=True,
|
||||||
|
)
|
||||||
|
warning_code = 'warnings.warn(UserWarning("foo"))'
|
||||||
|
assert warning_code in result.stdout.str()
|
||||||
|
assert result.stdout.str().count(warning_code) == 1
|
||||||
|
|
||||||
|
|
||||||
def test_pytest_configure_warning(testdir, recwarn):
|
def test_pytest_configure_warning(testdir, recwarn):
|
||||||
"""Issue 5115."""
|
"""Issue 5115."""
|
||||||
testdir.makeconftest(
|
testdir.makeconftest(
|
||||||
|
|
Loading…
Reference in New Issue