@@ -207,6 +207,60 @@ def test_succeed(foo):
207
207
assert_outcomes (rr , {"passed" : 2 , "failed" : 1 })
208
208
209
209
210
+ @skip_if_no_async_await ()
211
+ def test_async_fixture_concurrent_teardown (testdir , cmd_opts ):
212
+ test_file = """
213
+ import time
214
+
215
+ from twisted.internet import reactor, defer
216
+ import pytest
217
+ import pytest_twisted
218
+
219
+ def sleep(seconds):
220
+ d = defer.Deferred()
221
+
222
+ reactor.callLater(seconds, d.callback, None)
223
+
224
+ return d
225
+
226
+ short_times = []
227
+ long_times = []
228
+
229
+ short_time = 0.100
230
+ long_time = 1
231
+
232
+ @pytest.fixture
233
+ async def short():
234
+ yield 42
235
+
236
+ short_times.append(time.time())
237
+ await sleep(short_time)
238
+ short_times.append(time.time())
239
+
240
+ @pytest.fixture
241
+ async def long():
242
+ yield 37
243
+
244
+ long_times.append(time.time())
245
+ await sleep(short_time)
246
+ long_times.append(time.time())
247
+
248
+ assert len(short_times) == 2
249
+
250
+ # long should start before short finishes
251
+ assert long_times[0] < short_times[1]
252
+ # short should finish before long finishes
253
+ assert short_times[1] < long_times[1]
254
+
255
+ @pytest_twisted.inlineCallbacks
256
+ def test_succeed(short, long):
257
+ yield sleep(0)
258
+ """
259
+ testdir .makepyfile (test_file )
260
+ rr = testdir .run (sys .executable , "-m" , "pytest" , "-v" , * cmd_opts )
261
+ assert_outcomes (rr , {"passed" : 1 })
262
+
263
+
210
264
@skip_if_no_async_generators ()
211
265
def test_async_fixture_yield (testdir , cmd_opts ):
212
266
test_file = """
0 commit comments