Skip to content
Home / Fundamentals

Pytest Fixtures

What is a Pytest Fixture?

In Pytest, a fixture is a function that is used to prepare the test environment before a test is run. Fixtures are a powerful tool in Pytest because they allow you to reuse code, and they provide a way to set up and clean up test resources.

Fixture Syntax

To define a fixture in Pytest, you can use the @pytest.fixture decorator. Here is an example of a simple fixture that creates a list:

import pytest

@pytest.fixture
def my_list():
    return [1, 2, 3]

You can also define fixtures with arguments. For example, here is a fixture that creates a list with a given number of elements:

import pytest

@pytest.fixture
def my_list(size):
    return [i for i in range(size)]

Using Fixtures in Tests

To use a fixture in a test, you can pass it as an argument to the test function. Here is an example of a test that uses the my_list fixture defined above:

def test_my_list(my_list):
    assert len(my_list) == 3

You can also use fixtures in test class methods by marking the fixture name as an argument in the @pytest.mark.usefixtures decorator. For example:

import pytest

@pytest.mark.usefixtures("my_list")
class TestClass:
    def test_method_1(self):
        assert len(self.my_list) == 3
    def test_method_2(self):
        assert self.my_list == [1, 2, 3]

Chaining Fixtures You can chain fixtures together by using one fixture as an argument to another fixture. For example, here is a fixture that creates a list of lists:

import pytest

@pytest.fixture
def nested_list(my_list):
    return [my_list, my_list]

In this case, the nested_list fixture depends on the my_list fixture. This means that the my_list fixture will be run before the nested_list fixture.

Fixture Scopes

Pytest fixtures have four possible scopes: function, class, module, and session.

  • The function scope is the default scope, and it means that the fixture is run before every test function that uses it.
  • The class scope means that the fixture is run once before the first test method in a class and once after the last test method in the class.
  • The module scope means that the fixture is run once before the first test in the module and once after the last test in the module.
  • The session scope means that the fixture is run once at the beginning of the test session and once at the end of the test session.

To specify a scope for a fixture, you can use the scope argument of the @pytest.fixture decorator. For example:

import pytest

@pytest.fixture(scope="module")
def my_module_fixture():
    # code to set up test resources
    yield
    # code to clean up test resources

@pytest.fixture(scope="session")
def my_session_fixture():
    # code to set up test resources
    yield
    # code to clean up test resources

conftest.py

You can use the conftest.py file to define fixtures that are available to all tests in a directory and its subdirectories. This is useful if you have a set of fixtures that you want to use in multiple test modules.

To define a fixture in the conftest.py file, you can use the same syntax as above. For example:

import pytest

@pytest.fixture
def my_common_fixture():
    # code to set up test resources
    yield
    # code to clean up test resources

Common Pitfalls to Avoid

Here are some common pitfalls to avoid when using Pytest fixtures:

  • Forgetting to use the yield statement: If you forget to use the yield statement in a fixture, the code after the yield statement will not be run. This means that any code you have to clean up test resources will not be run.
  • Using global variables to store fixture data: It is generally a good idea to avoid using global variables in your tests. Instead, use fixtures to pass data between tests.
  • Using fixtures with the wrong scope: Make sure to use the correct scope for your fixtures based on when you want them to run.

Best Practices

Here are some best practices for using Pytest fixtures:

  • Keep fixtures simple: Fixtures should be used to set up and clean up test resources, not to perform complex operations.
  • Use fixtures to reduce duplication: Use fixtures to avoid duplication of setup and cleanup code in your tests.
  • Use fixtures to make tests more readable: By using fixtures, you can make your tests more readable by reducing the amount of setup and cleanup code in your tests.