Skip to content

Commit 1258ad6

Browse files
committed
config: Do not fail if a warning filter category cannot be imported
1 parent 5366cd2 commit 1258ad6

File tree

3 files changed

+33
-2
lines changed

3 files changed

+33
-2
lines changed

changelog/13732.contrib.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Do not fail when a warning category cannot be imported. Log a warning instead.

src/_pytest/config/__init__.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1965,6 +1965,8 @@ def parse_warning_filter(
19651965
raise UsageError(error_template.format(error=str(e))) from None
19661966
try:
19671967
category: type[Warning] = _resolve_warning_category(category_)
1968+
except ImportError:
1969+
raise
19681970
except Exception:
19691971
exc_info = ExceptionInfo.from_current()
19701972
exception_text = exc_info.getrepr(style="native")
@@ -2023,7 +2025,15 @@ def apply_warning_filters(
20232025
# Filters should have this precedence: cmdline options, config.
20242026
# Filters should be applied in the inverse order of precedence.
20252027
for arg in config_filters:
2026-
warnings.filterwarnings(*parse_warning_filter(arg, escape=False))
2028+
try:
2029+
warnings.filterwarnings(*parse_warning_filter(arg, escape=False))
2030+
except ImportError as e:
2031+
warnings.warn(f"Failed to import filter module '{e.name}': {arg}", PytestConfigWarning)
2032+
continue
20272033

20282034
for arg in cmdline_filters:
2029-
warnings.filterwarnings(*parse_warning_filter(arg, escape=True))
2035+
try:
2036+
warnings.filterwarnings(*parse_warning_filter(arg, escape=True))
2037+
except ImportError as e:
2038+
warnings.warn(f"Failed to import filter module '{e.name}': {arg}", PytestConfigWarning)
2039+
continue

testing/test_warnings.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,26 @@ def test():
424424
result.stdout.fnmatch_lines(["* 1 failed in*"])
425425

426426

427+
def test_accept_unknown_category(pytester: Pytester) -> None:
428+
"""Filters defined by marks should always take precedence (#3946)."""
429+
pytester.makeini(
430+
"""
431+
[pytest]
432+
filterwarnings =
433+
ignore:Failed to import filter module.*:pytest.PytestConfigWarning
434+
ignore::foobar.Foobar
435+
"""
436+
)
437+
pytester.makepyfile(
438+
"""
439+
def test():
440+
pass
441+
"""
442+
)
443+
result = pytester.runpytest("-W", "ignore::bizbaz.Bizbaz")
444+
result.stdout.fnmatch_lines(["* 1 passed in*"])
445+
446+
427447
class TestDeprecationWarningsByDefault:
428448
"""
429449
Note: all pytest runs are executed in a subprocess so we don't inherit warning filters

0 commit comments

Comments
 (0)