-
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
/
test_unraisableexception.py
133 lines (112 loc) · 3.83 KB
/
test_unraisableexception.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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::pytest.PytestUnraisableExceptionWarning")
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::pytest.PytestUnraisableExceptionWarning")
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::pytest.PytestUnraisableExceptionWarning")
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}