Skip to content

Commit

Permalink
Merge pull request #7068 from RonnyPfannschmidt/backport-6927-run-asy…
Browse files Browse the repository at this point in the history
…nc-unittest

backport #6927: run async testcase methods
  • Loading branch information
RonnyPfannschmidt committed Apr 10, 2020
2 parents 57a95b3 + f5e430f commit a600e7a
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 4 deletions.
1 change: 1 addition & 0 deletions changelog/6924.bugfix.rst
@@ -0,0 +1 @@
Ensure a ``unittest.IsolatedAsyncioTestCase`` is actually awaited.
26 changes: 22 additions & 4 deletions src/_pytest/python.py
Expand Up @@ -175,15 +175,33 @@ def async_warn(nodeid: str) -> None:
@hookimpl(trylast=True)
def pytest_pyfunc_call(pyfuncitem: "Function"):
testfunction = pyfuncitem.obj
if iscoroutinefunction(testfunction) or (
sys.version_info >= (3, 6) and inspect.isasyncgenfunction(testfunction)
):

try:
# ignoring type as the import is invalid in py37 and mypy thinks its a error
from unittest import IsolatedAsyncioTestCase # type: ignore
except ImportError:
async_ok_in_stdlib = False
else:
async_ok_in_stdlib = isinstance(
getattr(testfunction, "__self__", None), IsolatedAsyncioTestCase
)

if (
iscoroutinefunction(testfunction)
or (sys.version_info >= (3, 6) and inspect.isasyncgenfunction(testfunction))
) and not async_ok_in_stdlib:
async_warn(pyfuncitem.nodeid)
funcargs = pyfuncitem.funcargs
testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames}
result = testfunction(**testargs)
if hasattr(result, "__await__") or hasattr(result, "__aiter__"):
async_warn(pyfuncitem.nodeid)
if async_ok_in_stdlib:
# todo: investigate moving this to the unittest plugin
# by a test call result hook
testcase = testfunction.__self__
testcase._callMaybeAsync(lambda: result)
else:
async_warn(pyfuncitem.nodeid)
return True


Expand Down
2 changes: 2 additions & 0 deletions testing/example_scripts/pytest.ini
@@ -0,0 +1,2 @@
[pytest]
# dummy pytest.ini to ease direct running of example scripts
15 changes: 15 additions & 0 deletions testing/example_scripts/unittest/test_unittest_asyncio.py
@@ -0,0 +1,15 @@
from unittest import IsolatedAsyncioTestCase # type: ignore


class AsyncArguments(IsolatedAsyncioTestCase):
async def test_something_async(self):
async def addition(x, y):
return x + y

self.assertEqual(await addition(2, 2), 4)

async def test_something_async_fails(self):
async def addition(x, y):
return x + y

self.assertEqual(await addition(2, 2), 3)
8 changes: 8 additions & 0 deletions testing/test_unittest.py
Expand Up @@ -1129,3 +1129,11 @@ def test(self):
result = testdir.runpytest("--trace", str(p1))
assert len(calls) == 2
assert result.ret == 0


def test_async_support(testdir):
pytest.importorskip("unittest.async_case")

testdir.copy_example("unittest/test_unittest_asyncio.py")
reprec = testdir.inline_run()
reprec.assertoutcome(failed=1, passed=1)

0 comments on commit a600e7a

Please sign in to comment.