Merge pull request #6927 from RonnyPfannschmidt/fix-6924-run-async-stdlib-unittests
running stdlib asyncio unittests again
This commit is contained in:
commit
2d9dac95ec
|
@ -0,0 +1 @@
|
||||||
|
Ensure a ``unittest.IsolatedAsyncioTestCase`` is actually awaited.
|
|
@ -175,15 +175,33 @@ def async_warn(nodeid: str) -> None:
|
||||||
@hookimpl(trylast=True)
|
@hookimpl(trylast=True)
|
||||||
def pytest_pyfunc_call(pyfuncitem: "Function"):
|
def pytest_pyfunc_call(pyfuncitem: "Function"):
|
||||||
testfunction = pyfuncitem.obj
|
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)
|
async_warn(pyfuncitem.nodeid)
|
||||||
funcargs = pyfuncitem.funcargs
|
funcargs = pyfuncitem.funcargs
|
||||||
testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames}
|
testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames}
|
||||||
result = testfunction(**testargs)
|
result = testfunction(**testargs)
|
||||||
if hasattr(result, "__await__") or hasattr(result, "__aiter__"):
|
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
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
[pytest]
|
||||||
|
# dummy pytest.ini to ease direct running of example scripts
|
|
@ -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)
|
|
@ -1129,3 +1129,11 @@ def test_trace(testdir, monkeypatch):
|
||||||
result = testdir.runpytest("--trace", str(p1))
|
result = testdir.runpytest("--trace", str(p1))
|
||||||
assert len(calls) == 2
|
assert len(calls) == 2
|
||||||
assert result.ret == 0
|
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)
|
||||||
|
|
Loading…
Reference in New Issue