Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

pytest fixtures in a separate directory

Tags:

I'm looking to create a pytest structure where I can separate the fixtures from the tests completely. The reason for this separation is that I want to include the fixtures directory as an external item in subversion and share it between multiple projects.

tree of desired structure

project |   conftest.py | +---fixtures |       __init__.py |       conftest.py |       fixture_cifs.py |       fixture_ftp.py |       fixture_service.py | \---tests     |   test_sometest1.py     |   test_sometest2.py     |     \---configurations             sometest1.conf             sometest2.conf 

I want to implement the functionality for each fixture in a separate file in order to avoid a single huge conftest.py. conftest.py would just include wrappers to return an instance of each fixture annotated with @pytest.fixture. There is no problem using a fixture together with a test when the conftest.py, fixture_*.py and test_*.py files are all in the same directory.

However, when the fixtures are separated in a subdirectory I get an error from pytest fixture 'cifs' not found, available fixtures: .... I haven't found any documentation explaining how to place fixtures outside of test_*.py or the conftest.py adjacent to test_*.py, but nothing to indicate that this shouldn't work either.

How can I place fixtures in their own subdirectory when using pytest?

like image 964
Jakob Pogulis Avatar asked Sep 14 '15 14:09

Jakob Pogulis


People also ask

Can we have multiple fixtures in pytest?

Fixtures can also be requested more than once during the same test, and pytest won't execute them again for that test. This means we can request fixtures in multiple fixtures that are dependent on them (and even again in the test itself) without those fixtures being executed more than once.

Can a pytest fixture use another fixture?

fixtures have explicit names and are activated by declaring their use from test functions, modules, classes or whole projects. fixtures are implemented in a modular manner, as each fixture name triggers a fixture function which can itself use other fixtures.

Where do you define pytest fixtures?

To access the fixture function, the tests have to mention the fixture name as input parameter. Pytest while the test is getting executed, will see the fixture name as input parameter. It then executes the fixture function and the returned value is stored to the input parameter, which can be used by the test.

Can I import pytest fixture from another file?

Use Pytest Fixtures Across Multiple Test Files With conftest.py. To make it easier on ourselves, we can define a fixture to use across multiple test files. These fixtures are defined by creating a file called conftest.py. Additionally, we can call separate files that also import the fixture from our configuration file.


1 Answers

Please add the following in your conftest.py

  import pytest    pytest_plugins = [    "fixtures.conftest",    "fixtures.fixture_cifs",    "fixtures.fixture_ftp",    "fixtures.fixture_service"   ] 

This ensures that all fixtures declared under fixtures/ will be found by pytest

As a note that the respective directories referred to in fixtures.conftest" need to have __init__.py files for the plugins to be loaded by pytest

A similar case can be seen here: https://stackoverflow.com/a/54736237/6655459

like image 82
rafalkasa Avatar answered Sep 19 '22 19:09

rafalkasa