question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

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

See original GitHub issue

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

https://github.com/aio-libs/aiohttp/issues/4626

Issue Analytics

  • State:closed
  • Created 4 years ago
  • Reactions:7
  • Comments:16 (6 by maintainers)

github_iconTop GitHub Comments

3reactions
nicoddemuscommented, Mar 13, 2020

5.4.1 is out, thanks everyone!

1reaction
nicoddemuscommented, Mar 13, 2020

Thanks everyone for the report!

This was intended to remove what we assumed was “surprising” behavior, but as things always goes with projects used by many many people, “surprising” often becomes “used and expected”. 😁

@RonnyPfannschmidt I propose we just revert that change, and make it part of the expected behavior of fixtures. What do you think?

Read more comments on GitHub >

github_iconTop Results From Across the Web

Parametrizing tests — pytest documentation
Indirect parametrization¶. Using the indirect=True parameter when parametrizing a test allows to parametrize a test with a fixture receiving the values before ...
Read more >
pytest parametrize with indirect - Raphael Pierzina
You can pass a keyword argument named indirect to parametrize to change how its parameters are being passed to the underlying test function....
Read more >
Pass a parameter to a fixture function - Stack Overflow
But I need to the parametrization directly in the test module. Is it possible to access the params attribute of the fixture from...
Read more >
pytest fixtures: explicit, modular, scalable
fixtures have explicit names and are activated by declaring their use from test functions, modules, classes or whole projects. fixtures are implemented in...
Read more >
Armstrong Pump, Inc. v. Hartman, 10-CV-446S - Casetext
Thus, systems using the Hartman LOOP technology maximize their cooling efficiency ... simply makes the JACE itself functional, as Mr. Matthys testified.
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found