1
1
import asyncio
2
2
import unittest
3
+ from test import support
4
+
5
+
6
+ class MyException (Exception ):
7
+ pass
3
8
4
9
5
10
def tearDownModule ():
6
11
asyncio .set_event_loop_policy (None )
7
12
8
13
9
14
class TestAsyncCase (unittest .TestCase ):
10
- def test_full_cycle (self ):
11
- events = []
15
+ maxDiff = None
16
+
17
+ def tearDown (self ):
18
+ # Ensure that IsolatedAsyncioTestCase instances are destroyed before
19
+ # starting a new event loop
20
+ support .gc_collect ()
12
21
22
+ def test_full_cycle (self ):
13
23
class Test (unittest .IsolatedAsyncioTestCase ):
14
24
def setUp (self ):
15
25
self .assertEqual (events , [])
@@ -18,12 +28,13 @@ def setUp(self):
18
28
async def asyncSetUp (self ):
19
29
self .assertEqual (events , ['setUp' ])
20
30
events .append ('asyncSetUp' )
31
+ self .addAsyncCleanup (self .on_cleanup1 )
21
32
22
33
async def test_func (self ):
23
34
self .assertEqual (events , ['setUp' ,
24
35
'asyncSetUp' ])
25
36
events .append ('test' )
26
- self .addAsyncCleanup (self .on_cleanup )
37
+ self .addAsyncCleanup (self .on_cleanup2 )
27
38
28
39
async def asyncTearDown (self ):
29
40
self .assertEqual (events , ['setUp' ,
@@ -38,34 +49,48 @@ def tearDown(self):
38
49
'asyncTearDown' ])
39
50
events .append ('tearDown' )
40
51
41
- async def on_cleanup (self ):
52
+ async def on_cleanup1 (self ):
53
+ self .assertEqual (events , ['setUp' ,
54
+ 'asyncSetUp' ,
55
+ 'test' ,
56
+ 'asyncTearDown' ,
57
+ 'tearDown' ,
58
+ 'cleanup2' ])
59
+ events .append ('cleanup1' )
60
+
61
+ async def on_cleanup2 (self ):
42
62
self .assertEqual (events , ['setUp' ,
43
63
'asyncSetUp' ,
44
64
'test' ,
45
65
'asyncTearDown' ,
46
66
'tearDown' ])
47
- events .append ('cleanup ' )
67
+ events .append ('cleanup2 ' )
48
68
69
+ events = []
49
70
test = Test ("test_func" )
50
- test .run ()
51
- self .assertEqual (events , ['setUp' ,
52
- 'asyncSetUp' ,
53
- 'test' ,
54
- 'asyncTearDown' ,
55
- 'tearDown' ,
56
- 'cleanup' ])
71
+ result = test .run ()
72
+ self .assertEqual (result .errors , [])
73
+ self .assertEqual (result .failures , [])
74
+ expected = ['setUp' , 'asyncSetUp' , 'test' ,
75
+ 'asyncTearDown' , 'tearDown' , 'cleanup2' , 'cleanup1' ]
76
+ self .assertEqual (events , expected )
57
77
58
- def test_exception_in_setup (self ):
59
78
events = []
79
+ test = Test ("test_func" )
80
+ test .debug ()
81
+ self .assertEqual (events , expected )
82
+ test .doCleanups ()
83
+ self .assertEqual (events , expected )
60
84
85
+ def test_exception_in_setup (self ):
61
86
class Test (unittest .IsolatedAsyncioTestCase ):
62
87
async def asyncSetUp (self ):
63
88
events .append ('asyncSetUp' )
64
- raise Exception ()
89
+ self .addAsyncCleanup (self .on_cleanup )
90
+ raise MyException ()
65
91
66
92
async def test_func (self ):
67
93
events .append ('test' )
68
- self .addAsyncCleanup (self .on_cleanup )
69
94
70
95
async def asyncTearDown (self ):
71
96
events .append ('asyncTearDown' )
@@ -74,98 +99,135 @@ async def on_cleanup(self):
74
99
events .append ('cleanup' )
75
100
76
101
102
+ events = []
77
103
test = Test ("test_func" )
78
- test .run ()
79
- self .assertEqual (events , ['asyncSetUp' ])
104
+ result = test .run ()
105
+ self .assertEqual (events , ['asyncSetUp' , 'cleanup' ])
106
+ self .assertIs (result .errors [0 ][0 ], test )
107
+ self .assertIn ('MyException' , result .errors [0 ][1 ])
80
108
81
- def test_exception_in_test (self ):
82
109
events = []
110
+ test = Test ("test_func" )
111
+ try :
112
+ test .debug ()
113
+ except MyException :
114
+ pass
115
+ else :
116
+ self .fail ('Expected a MyException exception' )
117
+ self .assertEqual (events , ['asyncSetUp' ])
118
+ test .doCleanups ()
119
+ self .assertEqual (events , ['asyncSetUp' , 'cleanup' ])
83
120
121
+ def test_exception_in_test (self ):
84
122
class Test (unittest .IsolatedAsyncioTestCase ):
85
123
async def asyncSetUp (self ):
86
124
events .append ('asyncSetUp' )
87
125
88
126
async def test_func (self ):
89
127
events .append ('test' )
90
- raise Exception ()
91
128
self .addAsyncCleanup (self .on_cleanup )
129
+ raise MyException ()
92
130
93
131
async def asyncTearDown (self ):
94
132
events .append ('asyncTearDown' )
95
133
96
134
async def on_cleanup (self ):
97
135
events .append ('cleanup' )
98
136
137
+ events = []
99
138
test = Test ("test_func" )
100
- test .run ()
101
- self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' ])
139
+ result = test .run ()
140
+ self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' , 'cleanup' ])
141
+ self .assertIs (result .errors [0 ][0 ], test )
142
+ self .assertIn ('MyException' , result .errors [0 ][1 ])
102
143
103
- def test_exception_in_test_after_adding_cleanup (self ):
104
144
events = []
145
+ test = Test ("test_func" )
146
+ try :
147
+ test .debug ()
148
+ except MyException :
149
+ pass
150
+ else :
151
+ self .fail ('Expected a MyException exception' )
152
+ self .assertEqual (events , ['asyncSetUp' , 'test' ])
153
+ test .doCleanups ()
154
+ self .assertEqual (events , ['asyncSetUp' , 'test' , 'cleanup' ])
105
155
156
+ def test_exception_in_tear_down (self ):
106
157
class Test (unittest .IsolatedAsyncioTestCase ):
107
158
async def asyncSetUp (self ):
108
159
events .append ('asyncSetUp' )
109
160
110
161
async def test_func (self ):
111
162
events .append ('test' )
112
163
self .addAsyncCleanup (self .on_cleanup )
113
- raise Exception ()
114
164
115
165
async def asyncTearDown (self ):
116
166
events .append ('asyncTearDown' )
167
+ raise MyException ()
117
168
118
169
async def on_cleanup (self ):
119
170
events .append ('cleanup' )
120
171
172
+ events = []
121
173
test = Test ("test_func" )
122
- test .run ()
174
+ result = test .run ()
123
175
self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' , 'cleanup' ])
176
+ self .assertIs (result .errors [0 ][0 ], test )
177
+ self .assertIn ('MyException' , result .errors [0 ][1 ])
124
178
125
- def test_exception_in_tear_down (self ):
126
179
events = []
127
-
128
- class Test (unittest .IsolatedAsyncioTestCase ):
129
- async def asyncSetUp (self ):
130
- events .append ('asyncSetUp' )
131
-
132
- async def test_func (self ):
133
- events .append ('test' )
134
- self .addAsyncCleanup (self .on_cleanup )
135
-
136
- async def asyncTearDown (self ):
137
- events .append ('asyncTearDown' )
138
- raise Exception ()
139
-
140
- async def on_cleanup (self ):
141
- events .append ('cleanup' )
142
-
143
180
test = Test ("test_func" )
144
- test .run ()
181
+ try :
182
+ test .debug ()
183
+ except MyException :
184
+ pass
185
+ else :
186
+ self .fail ('Expected a MyException exception' )
187
+ self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' ])
188
+ test .doCleanups ()
145
189
self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' , 'cleanup' ])
146
190
147
-
148
191
def test_exception_in_tear_clean_up (self ):
149
- events = []
150
-
151
192
class Test (unittest .IsolatedAsyncioTestCase ):
152
193
async def asyncSetUp (self ):
153
194
events .append ('asyncSetUp' )
154
195
155
196
async def test_func (self ):
156
197
events .append ('test' )
157
- self .addAsyncCleanup (self .on_cleanup )
198
+ self .addAsyncCleanup (self .on_cleanup1 )
199
+ self .addAsyncCleanup (self .on_cleanup2 )
158
200
159
201
async def asyncTearDown (self ):
160
202
events .append ('asyncTearDown' )
161
203
162
- async def on_cleanup (self ):
163
- events .append ('cleanup' )
164
- raise Exception ()
204
+ async def on_cleanup1 (self ):
205
+ events .append ('cleanup1' )
206
+ raise MyException ('some error' )
207
+
208
+ async def on_cleanup2 (self ):
209
+ events .append ('cleanup2' )
210
+ raise MyException ('other error' )
165
211
212
+ events = []
166
213
test = Test ("test_func" )
167
- test .run ()
168
- self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' , 'cleanup' ])
214
+ result = test .run ()
215
+ self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' , 'cleanup2' , 'cleanup1' ])
216
+ self .assertIs (result .errors [0 ][0 ], test )
217
+ self .assertIn ('MyException: other error' , result .errors [0 ][1 ])
218
+ self .assertIn ('MyException: some error' , result .errors [1 ][1 ])
219
+
220
+ events = []
221
+ test = Test ("test_func" )
222
+ try :
223
+ test .debug ()
224
+ except MyException :
225
+ pass
226
+ else :
227
+ self .fail ('Expected a MyException exception' )
228
+ self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' , 'cleanup2' ])
229
+ test .doCleanups ()
230
+ self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' , 'cleanup2' , 'cleanup1' ])
169
231
170
232
def test_deprecation_of_return_val_from_test (self ):
171
233
# Issue 41322 - deprecate return of value!=None from a test
@@ -255,7 +317,49 @@ async def coro():
255
317
output = test .run ()
256
318
self .assertTrue (cancelled )
257
319
320
+ def test_debug_cleanup_same_loop (self ):
321
+ class Test (unittest .IsolatedAsyncioTestCase ):
322
+ async def asyncSetUp (self ):
323
+ async def coro ():
324
+ await asyncio .sleep (0 )
325
+ fut = asyncio .ensure_future (coro ())
326
+ self .addAsyncCleanup (self .cleanup , fut )
327
+ events .append ('asyncSetUp' )
328
+
329
+ async def test_func (self ):
330
+ events .append ('test' )
331
+ raise MyException ()
258
332
333
+ async def asyncTearDown (self ):
334
+ events .append ('asyncTearDown' )
335
+
336
+ async def cleanup (self , fut ):
337
+ try :
338
+ # Raises an exception if in different loop
339
+ await asyncio .wait ([fut ])
340
+ events .append ('cleanup' )
341
+ except :
342
+ import traceback
343
+ traceback .print_exc ()
344
+ raise
345
+
346
+ events = []
347
+ test = Test ("test_func" )
348
+ result = test .run ()
349
+ self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' , 'cleanup' ])
350
+ self .assertIn ('MyException' , result .errors [0 ][1 ])
351
+
352
+ events = []
353
+ test = Test ("test_func" )
354
+ try :
355
+ test .debug ()
356
+ except MyException :
357
+ pass
358
+ else :
359
+ self .fail ('Expected a MyException exception' )
360
+ self .assertEqual (events , ['asyncSetUp' , 'test' ])
361
+ test .doCleanups ()
362
+ self .assertEqual (events , ['asyncSetUp' , 'test' , 'cleanup' ])
259
363
260
364
261
365
if __name__ == "__main__" :
0 commit comments