11import asyncio
2- import gc
32import unittest
3+ from test import support
44
55
66class MyException (Exception ):
@@ -14,6 +14,11 @@ def tearDownModule():
1414class TestAsyncCase (unittest .TestCase ):
1515 maxDiff = None
1616
17+ def tearDown (self ):
18+ # Ensure that IsolatedAsyncioTestCase instances are destroyed before
19+ # starting a new event loop
20+ support .gc_collect ()
21+
1722 def test_full_cycle (self ):
1823 class Test (unittest .IsolatedAsyncioTestCase ):
1924 def setUp (self ):
@@ -23,12 +28,13 @@ def setUp(self):
2328 async def asyncSetUp (self ):
2429 self .assertEqual (events , ['setUp' ])
2530 events .append ('asyncSetUp' )
31+ self .addAsyncCleanup (self .on_cleanup1 )
2632
2733 async def test_func (self ):
2834 self .assertEqual (events , ['setUp' ,
2935 'asyncSetUp' ])
3036 events .append ('test' )
31- self .addAsyncCleanup (self .on_cleanup )
37+ self .addAsyncCleanup (self .on_cleanup2 )
3238
3339 async def asyncTearDown (self ):
3440 self .assertEqual (events , ['setUp' ,
@@ -43,19 +49,30 @@ def tearDown(self):
4349 'asyncTearDown' ])
4450 events .append ('tearDown' )
4551
46- 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 ):
4762 self .assertEqual (events , ['setUp' ,
4863 'asyncSetUp' ,
4964 'test' ,
5065 'asyncTearDown' ,
5166 'tearDown' ])
52- events .append ('cleanup ' )
67+ events .append ('cleanup2 ' )
5368
5469 events = []
5570 test = Test ("test_func" )
56- test .run ()
71+ result = test .run ()
72+ self .assertEqual (result .errors , [])
73+ self .assertEqual (result .failures , [])
5774 expected = ['setUp' , 'asyncSetUp' , 'test' ,
58- 'asyncTearDown' , 'tearDown' , 'cleanup ' ]
75+ 'asyncTearDown' , 'tearDown' , 'cleanup2' , 'cleanup1 ' ]
5976 self .assertEqual (events , expected )
6077
6178 events = []
@@ -69,11 +86,11 @@ def test_exception_in_setup(self):
6986 class Test (unittest .IsolatedAsyncioTestCase ):
7087 async def asyncSetUp (self ):
7188 events .append ('asyncSetUp' )
89+ self .addAsyncCleanup (self .on_cleanup )
7290 raise MyException ()
7391
7492 async def test_func (self ):
7593 events .append ('test' )
76- self .addAsyncCleanup (self .on_cleanup )
7794
7895 async def asyncTearDown (self ):
7996 events .append ('asyncTearDown' )
@@ -85,7 +102,7 @@ async def on_cleanup(self):
85102 events = []
86103 test = Test ("test_func" )
87104 result = test .run ()
88- self .assertEqual (events , ['asyncSetUp' ])
105+ self .assertEqual (events , ['asyncSetUp' , 'cleanup' ])
89106 self .assertIs (result .errors [0 ][0 ], test )
90107 self .assertIn ('MyException' , result .errors [0 ][1 ])
91108
@@ -99,48 +116,9 @@ async def on_cleanup(self):
99116 self .fail ('Expected a MyException exception' )
100117 self .assertEqual (events , ['asyncSetUp' ])
101118 test .doCleanups ()
102- self .assertEqual (events , ['asyncSetUp' ])
103- del test
104- gc .collect ()
119+ self .assertEqual (events , ['asyncSetUp' , 'cleanup' ])
105120
106121 def test_exception_in_test (self ):
107- class Test (unittest .IsolatedAsyncioTestCase ):
108- async def asyncSetUp (self ):
109- events .append ('asyncSetUp' )
110-
111- async def test_func (self ):
112- events .append ('test' )
113- raise MyException ()
114- self .addAsyncCleanup (self .on_cleanup )
115-
116- async def asyncTearDown (self ):
117- events .append ('asyncTearDown' )
118-
119- async def on_cleanup (self ):
120- events .append ('cleanup' )
121-
122- events = []
123- test = Test ("test_func" )
124- result = test .run ()
125- self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' ])
126- self .assertIs (result .errors [0 ][0 ], test )
127- self .assertIn ('MyException' , result .errors [0 ][1 ])
128-
129- events = []
130- test = Test ("test_func" )
131- try :
132- test .debug ()
133- except MyException :
134- pass
135- else :
136- self .fail ('Expected a MyException exception' )
137- self .assertEqual (events , ['asyncSetUp' , 'test' ])
138- test .doCleanups ()
139- self .assertEqual (events , ['asyncSetUp' , 'test' ])
140- del test
141- gc .collect ()
142-
143- def test_exception_in_test_after_adding_cleanup (self ):
144122 class Test (unittest .IsolatedAsyncioTestCase ):
145123 async def asyncSetUp (self ):
146124 events .append ('asyncSetUp' )
@@ -174,8 +152,6 @@ async def on_cleanup(self):
174152 self .assertEqual (events , ['asyncSetUp' , 'test' ])
175153 test .doCleanups ()
176154 self .assertEqual (events , ['asyncSetUp' , 'test' , 'cleanup' ])
177- del test
178- gc .collect ()
179155
180156 def test_exception_in_tear_down (self ):
181157 class Test (unittest .IsolatedAsyncioTestCase ):
@@ -211,8 +187,6 @@ async def on_cleanup(self):
211187 self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' ])
212188 test .doCleanups ()
213189 self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' , 'cleanup' ])
214- del test
215- gc .collect ()
216190
217191 def test_exception_in_tear_clean_up (self ):
218192 class Test (unittest .IsolatedAsyncioTestCase ):
@@ -221,21 +195,27 @@ async def asyncSetUp(self):
221195
222196 async def test_func (self ):
223197 events .append ('test' )
224- self .addAsyncCleanup (self .on_cleanup )
198+ self .addAsyncCleanup (self .on_cleanup1 )
199+ self .addAsyncCleanup (self .on_cleanup2 )
225200
226201 async def asyncTearDown (self ):
227202 events .append ('asyncTearDown' )
228203
229- async def on_cleanup (self ):
230- events .append ('cleanup' )
231- raise MyException ()
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' )
232211
233212 events = []
234213 test = Test ("test_func" )
235214 result = test .run ()
236- self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' , 'cleanup ' ])
215+ self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' , 'cleanup2' , 'cleanup1 ' ])
237216 self .assertIs (result .errors [0 ][0 ], test )
238- self .assertIn ('MyException' , result .errors [0 ][1 ])
217+ self .assertIn ('MyException: other error' , result .errors [0 ][1 ])
218+ self .assertIn ('MyException: some error' , result .errors [1 ][1 ])
239219
240220 events = []
241221 test = Test ("test_func" )
@@ -245,11 +225,9 @@ async def on_cleanup(self):
245225 pass
246226 else :
247227 self .fail ('Expected a MyException exception' )
248- self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' , 'cleanup ' ])
228+ self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' , 'cleanup2 ' ])
249229 test .doCleanups ()
250- self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' , 'cleanup' ])
251- del test
252- gc .collect ()
230+ self .assertEqual (events , ['asyncSetUp' , 'test' , 'asyncTearDown' , 'cleanup2' , 'cleanup1' ])
253231
254232 def test_deprecation_of_return_val_from_test (self ):
255233 # Issue 41322 - deprecate return of value!=None from a test
@@ -382,8 +360,6 @@ async def cleanup(self, fut):
382360 self .assertEqual (events , ['asyncSetUp' , 'test' ])
383361 test .doCleanups ()
384362 self .assertEqual (events , ['asyncSetUp' , 'test' , 'cleanup' ])
385- del test
386- gc .collect ()
387363
388364
389365if __name__ == "__main__" :
0 commit comments