How and where does py.test find fixtures
Here is the order and where py.test looks for fixtures (and tests) (taken from here):
py.test loads plugin modules at tool startup in the following way:
by loading all builtin plugins
by loading all plugins registered through setuptools entry points.
by pre-scanning the command line for the
-p name
option and loading the specified plugin before actual command line parsing.by loading all
conftest.py
files as inferred by the command line invocation (test files and all of its parent directories). Note thatconftest.py
files from sub directories are by default not loaded at tool startup.by recursively loading all plugins specified by the pytest_plugins variable in
conftest.py
files
I had the same issue and spent a lot of time to find out a simple solution, this example is for others that have a similar situation as I had.
- conftest.py:
import pytest
pytest_plugins = [
"some_package.sonoftest"
]
def pytest_addoption(parser):
parser.addoption("--cmdopt", action="store", default="type1",
help="my option: type1 or type2")
@pytest.fixture
def cmdopt(request):
return request.config.getoption("--cmdopt")
- some_package/sonoftest.py:
import pytest
@pytest.fixture
def sono_cmdopt(request):
return request.config.getoption("--cmdopt")
- some_package/test_sample.py
def test_answer1(cmdopt):
if cmdopt == "type1":
print ("first")
elif cmdopt == "type2":
print ("second")
assert 0 # to see what was printed
def test_answer2(sono_cmdopt):
if sono_cmdopt == "type1":
print ("first")
elif sono_cmdopt == "type2":
print ("second")
assert 0 # to see what was printed
You can find a similar example here: https://github.com/pytest-dev/pytest/issues/3039#issuecomment-464489204 and other here https://stackoverflow.com/a/54736376/6655459
Description from official pytest documentation: https://docs.pytest.org/en/latest/reference.html?highlight=pytest_plugins#pytest-plugins
As a note that the respective directories referred to in
some_package.test_sample"
need to have__init__.py
files for the plugins to be loaded bypytest
py.test will import conftest.py
and all Python files that match the python_files
pattern, by default test_*.py
. If you have a test fixture, you need to include or import it from conftest.py
or from the test files that depend on it:
from sonoftest import pytest_addoption, cmdopt