summaryrefslogtreecommitdiff
path: root/testing/test_unraisableexception.py
diff options
context:
space:
mode:
authorRan Benita <ran@unusedvar.com>2020-11-13 23:47:19 +0200
committerRan Benita <ran@unusedvar.com>2020-11-21 21:11:48 +0200
commitd50df85e26b28e28ab5fb9a50df791068a051192 (patch)
treee2df53a03e1c66f75801c8b54cd2a230ab8a0210 /testing/test_unraisableexception.py
parent148e3c582afc6ae040d2ddcf09fade339a50dd1a (diff)
downloadpytest-d50df85e26b28e28ab5fb9a50df791068a051192.tar.gz
Add unraisableexception and threadexception plugins
Diffstat (limited to 'testing/test_unraisableexception.py')
-rw-r--r--testing/test_unraisableexception.py133
1 files changed, 133 insertions, 0 deletions
diff --git a/testing/test_unraisableexception.py b/testing/test_unraisableexception.py
new file mode 100644
index 000000000..32f890334
--- /dev/null
+++ b/testing/test_unraisableexception.py
@@ -0,0 +1,133 @@
+import sys
+
+import pytest
+from _pytest.pytester import Pytester
+
+
+if sys.version_info < (3, 8):
+ pytest.skip("unraisableexception plugin needs Python>=3.8", allow_module_level=True)
+
+
+@pytest.mark.filterwarnings("default")
+def test_unraisable(pytester: Pytester) -> None:
+ pytester.makepyfile(
+ test_it="""
+ class BrokenDel:
+ def __del__(self):
+ raise ValueError("del is broken")
+
+ def test_it():
+ obj = BrokenDel()
+ del obj
+
+ def test_2(): pass
+ """
+ )
+ result = pytester.runpytest()
+ assert result.ret == 0
+ assert result.parseoutcomes() == {"passed": 2, "warnings": 1}
+ result.stdout.fnmatch_lines(
+ [
+ "*= warnings summary =*",
+ "test_it.py::test_it",
+ " * PytestUnraisableExceptionWarning: Exception ignored in: <function BrokenDel.__del__ at *>",
+ " ",
+ " Traceback (most recent call last):",
+ " ValueError: del is broken",
+ " ",
+ " warnings.warn(pytest.PytestUnraisableExceptionWarning(msg))",
+ ]
+ )
+
+
+@pytest.mark.filterwarnings("default")
+def test_unraisable_in_setup(pytester: Pytester) -> None:
+ pytester.makepyfile(
+ test_it="""
+ import pytest
+
+ class BrokenDel:
+ def __del__(self):
+ raise ValueError("del is broken")
+
+ @pytest.fixture
+ def broken_del():
+ obj = BrokenDel()
+ del obj
+
+ def test_it(broken_del): pass
+ def test_2(): pass
+ """
+ )
+ result = pytester.runpytest()
+ assert result.ret == 0
+ assert result.parseoutcomes() == {"passed": 2, "warnings": 1}
+ result.stdout.fnmatch_lines(
+ [
+ "*= warnings summary =*",
+ "test_it.py::test_it",
+ " * PytestUnraisableExceptionWarning: Exception ignored in: <function BrokenDel.__del__ at *>",
+ " ",
+ " Traceback (most recent call last):",
+ " ValueError: del is broken",
+ " ",
+ " warnings.warn(pytest.PytestUnraisableExceptionWarning(msg))",
+ ]
+ )
+
+
+@pytest.mark.filterwarnings("default")
+def test_unraisable_in_teardown(pytester: Pytester) -> None:
+ pytester.makepyfile(
+ test_it="""
+ import pytest
+
+ class BrokenDel:
+ def __del__(self):
+ raise ValueError("del is broken")
+
+ @pytest.fixture
+ def broken_del():
+ yield
+ obj = BrokenDel()
+ del obj
+
+ def test_it(broken_del): pass
+ def test_2(): pass
+ """
+ )
+ result = pytester.runpytest()
+ assert result.ret == 0
+ assert result.parseoutcomes() == {"passed": 2, "warnings": 1}
+ result.stdout.fnmatch_lines(
+ [
+ "*= warnings summary =*",
+ "test_it.py::test_it",
+ " * PytestUnraisableExceptionWarning: Exception ignored in: <function BrokenDel.__del__ at *>",
+ " ",
+ " Traceback (most recent call last):",
+ " ValueError: del is broken",
+ " ",
+ " warnings.warn(pytest.PytestUnraisableExceptionWarning(msg))",
+ ]
+ )
+
+
+@pytest.mark.filterwarnings("error::pytest.PytestUnraisableExceptionWarning")
+def test_unraisable_warning_error(pytester: Pytester) -> None:
+ pytester.makepyfile(
+ test_it="""
+ class BrokenDel:
+ def __del__(self) -> None:
+ raise ValueError("del is broken")
+
+ def test_it() -> None:
+ obj = BrokenDel()
+ del obj
+
+ def test_2(): pass
+ """
+ )
+ result = pytester.runpytest()
+ assert result.ret == pytest.ExitCode.TESTS_FAILED
+ assert result.parseoutcomes() == {"passed": 1, "failed": 1}