Skip to content

Parameter "loop_factory" should be declared explicitly via indirect or in function itself #6909

Closed
@dcramer

Description

@dcramer

As of pytest 5.4.0 there is an issue with async tests, at the very least when using aiohttp. Can confirm that downgrading pytest fixed the issue.

Here's the same details I submitted over there when I thought aiohttp was the culprit:

Parameter "loop_factory" should be declared explicitly via indirect or in function itself

The commonality it turns out were async functions, and it appears to be caused somewhere within aiohttp. I'm not that familiar with asyncio or aiohttp, so I'm happy to debug more with guidance, but I'm hoping someone might have more thoughts here.

Related packages:

aiohttp==3.6.2
pytest==5.4.0
pytest-aiohttp==0.3.0
pytest-cov==2.8.1
pytest-forked==1.1.3
pytest-mock==2.0.0
pytest-responses==0.4.0
pytest-xdist==1.31.0

Some detail around the callstack:

➜  ~/D/zeus (feat/increase-lru-cache) ✗ py.test -x --pdb
=========================================================================================== test session starts ============================================================================================
platform darwin -- Python 3.8.1, pytest-5.4.0, py-1.8.1, pluggy-0.13.1
rootdir: /Users/dcramer/Development/zeus, inifile: setup.cfg
plugins: mock-2.0.0, celery-4.1.1, xdist-1.31.0, aiohttp-0.3.0, forked-1.1.3, responses-0.4.0, cov-2.8.1
collecting 186 items
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> traceback >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
In function "test_health_check":
Parameter "loop_factory" should be declared explicitly via indirect or in function itself
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> entering PDB >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> PDB post_mortem (IO-capturing turned off) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> /Users/dcramer/Development/zeus/.venv/lib/python3.8/site-packages/_pytest/python.py(1144)_validate_explicit_parameters()
-> fail(msg, pytrace=False)
(Pdb) l
1139 	                func_name = self.function.__name__
1140 	                msg = (
1141 	                    'In function "{func_name}":\n'
1142 	                    'Parameter "{arg}" should be declared explicitly via indirect or in function itself'
1143 	                ).format(func_name=func_name, arg=arg)
1144 ->	                fail(msg, pytrace=False)
1145
1146
1147 	def _find_parametrized_scope(argnames, arg2fixturedefs, indirect):
1148 	    """Find the most appropriate scope for a parametrized call based on its arguments.
1149
(Pdb) u
> /Users/dcramer/Development/zeus/.venv/lib/python3.8/site-packages/_pytest/python.py(939)parametrize()
-> self._validate_explicit_parameters(argnames, indirect)
(Pdb) l
934
935  	        self._validate_if_using_arg_names(argnames, indirect)
936
937  	        arg_values_types = self._resolve_arg_value_types(argnames, indirect)
938
939  ->	        self._validate_explicit_parameters(argnames, indirect)
940
941  	        # Use any already (possibly) generated ids with parametrize Marks.
942  	        if _param_mark and _param_mark._param_ids_from:
943  	            generated_ids = _param_mark._param_ids_from._param_ids_generated
944  	            if generated_ids is not None:
(Pdb) u
> /Users/dcramer/Development/zeus/.venv/lib/python3.8/site-packages/aiohttp/pytest_plugin.py(203)pytest_generate_tests()
-> metafunc.parametrize("loop_factory",
(Pdb) l
198  	                    "Unknown loop '%s', available loops: %s" % (
199  	                        name, list(factories.keys())))
200  	            else:
201  	                continue
202  	        factories[name] = avail_factories[name]
203  ->	    metafunc.parametrize("loop_factory",
204  	                         list(factories.values()),
205  	                         ids=list(factories.keys()))
206
207
208  	@pytest.fixture

aio-libs/aiohttp#4626

Metadata

Metadata

Assignees

No one assigned

    Labels

    topic: fixturesanything involving fixtures directly or indirectlytype: bugproblem that needs to be addressedtype: regressionindicates a problem that was introduced in a release which was working previously

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions