bpo-32972: Async test case by asvetlov · Pull Request #13386 · python/cpython (original) (raw)

Add explicit asyncSetUp and asyncTearDown methods.
The rest is the same as for #13228

AsyncTestCase create a loop instance for every test for the sake of test isolation.
Sometimes a loop shared between all tests can speed up tests execution time a lot but it requires control of closed resources after every test finish. Basically, it requires nested supervisors support that was discussed with @1st1 many times. Sorry, asyncio supervisors have no chance to land on Python 3.8.

The PR intentionally does not provide API for changing the used event loop or getting the test loop: use asyncio.set_event_loop_policy() and asyncio.get_event_loop() instead.

The PR adds four overridable methods to base unittest.TestCase class:

    def _callSetUp(self):
        self.setUp()

    def _callTestMethod(self, method):
        method()

    def _callTearDown(self):
        self.tearDown()

    def _callCleanup(self, function, /, *args, **kwargs):
        function(*args, **kwargs)

It allows using asyncio facilities with minimal influence on the unittest code.

The last but not least: the PR respects contextvars. The context variable installed by asyncSetUp is available on test, tearDown and a coroutine scheduled by addCleanup.

https://bugs.python.org/issue32972