[TIP] py.test: Best way of having a fixture autoused "almost all of the time"

holger krekel holger at merlinux.eu
Fri Aug 8 05:52:08 PDT 2014


On Fri, Aug 08, 2014 at 13:41 +0100, Paul Moore wrote:
> I've got a situation where I want to use a py.test autouse fixture to
> make sure my tests run in a clean environment. The idea is that I have
> a fixture marked as autouse which uses application features to isolate
> the test environment from the user's config files. But obviously I
> don't want that fixture to activate when actually testing the
> functionality it uses!
> 
> The simple approach would be to have a structure
> 
> tests
>     tests/isolation
>         test_isolation.py
>     tests/the_rest
>         conftest.py
>             @fixture(autouse=True)
>             def isolate_env():
>         ... all the rest of the application tests
> 
> but I'm not a huge fan of the extra directory level, for a single
> file. Is it possible to say that I *don't* want isolate_env activated
> in the test_isolation.py file?

One common approach is to read a marker from the autouse fixture like this:

    @fixture(autouse=True)
    def isolate_env(request):
        marker = request.node.get_marker("no_isolate_env")
        if marker is None:
            # do the isolation

and have a test like this:

    import pytest

    @pytest.mark.no_isolate_env
    def test_isolate_env():
        ...

you can also mark a test class this way.  Or even a whole module:

    # all tests in this module inhibit the autouse isolate_env fixture
    pytestmark = pytest.mark.no_isolate_env
   
This module syntax is the workaround for the fact that you can't decorate
a module in Python.  See also: https://pytest.org/latest/example/markers.html#marking-whole-classes-or-modules

HTH,
holger



More information about the testing-in-python mailing list