Skip to content

Commit

Permalink
Improve error message when pytest.warns fail
Browse files Browse the repository at this point in the history
The error message contains the expected type of warnings and the
warnings that were captured. Add tests.
  • Loading branch information
lesteve committed Dec 20, 2016
1 parent da40bcf commit c5f0b75
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 6 deletions.
5 changes: 4 additions & 1 deletion _pytest/recwarn.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,4 +223,7 @@ def __exit__(self, *exc_info):
if self.expected_warning is not None:
if not any(r.category in self.expected_warning for r in self):
__tracebackhide__ = True
pytest.fail("DID NOT WARN")
pytest.fail("DID NOT WARN. No warnings of type {0} was emitted. "
"The list of emitted warnings is: {1}.".format(
self.expected_warning,
[each.message for each in self]))
33 changes: 28 additions & 5 deletions testing/test_recwarn.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import warnings
import re
import py
import pytest
from _pytest.recwarn import WarningsRecorder
Expand Down Expand Up @@ -114,7 +115,7 @@ def test_deprecated_call_as_context_manager_no_warning(self):
with pytest.raises(pytest.fail.Exception) as ex:
with pytest.deprecated_call():
self.dep(1)
assert str(ex.value) == "DID NOT WARN"
assert str(ex.value).startswith("DID NOT WARN")

def test_deprecated_call_as_context_manager(self):
with pytest.deprecated_call():
Expand Down Expand Up @@ -185,16 +186,38 @@ def test_as_contextmanager(self):
with pytest.warns(RuntimeWarning):
warnings.warn("runtime", RuntimeWarning)

with pytest.raises(pytest.fail.Exception):
with pytest.warns(UserWarning):
warnings.warn("user", UserWarning)

with pytest.raises(pytest.fail.Exception) as excinfo:
with pytest.warns(RuntimeWarning):
warnings.warn("user", UserWarning)
excinfo.match(r"DID NOT WARN. No warnings of type \(.+RuntimeWarning.+,\) was emitted. "
r"The list of emitted warnings is: \[UserWarning\('user',\)\].")

with pytest.raises(pytest.fail.Exception):
with pytest.raises(pytest.fail.Exception) as excinfo:
with pytest.warns(UserWarning):
warnings.warn("runtime", RuntimeWarning)
excinfo.match(r"DID NOT WARN. No warnings of type \(.+UserWarning.+,\) was emitted. "
r"The list of emitted warnings is: \[RuntimeWarning\('runtime',\)\].")

with pytest.raises(pytest.fail.Exception) as excinfo:
with pytest.warns(UserWarning):
pass
excinfo.match(r"DID NOT WARN. No warnings of type \(.+UserWarning.+,\) was emitted. "
r"The list of emitted warnings is: \[\].")

warning_classes = (UserWarning, FutureWarning)
with pytest.raises(pytest.fail.Exception) as excinfo:
with pytest.warns(warning_classes) as warninfo:
warnings.warn("runtime", RuntimeWarning)
warnings.warn("import", ImportWarning)

message_template = ("DID NOT WARN. No warnings of type {0} was emitted. "
"The list of emitted warnings is: {1}.")
excinfo.match(re.escape(message_template.format(warning_classes,
[each.message for each in warninfo])))

with pytest.warns(UserWarning):
warnings.warn("user", UserWarning)

def test_record(self):
with pytest.warns(UserWarning) as record:
Expand Down

0 comments on commit c5f0b75

Please sign in to comment.