fixtures.py


Overview

The [fixtures.py](/projects/286/67499) file is a core part of the testing framework's fixture management system. It provides the infrastructure required to declare, discover, resolve, execute, cache, parametrize, and finalize fixtures. Fixtures are reusable test resources or setup/teardown logic that tests can request declaratively by name.

This file implements:

The system tightly integrates with the test collection, test execution, and configuration components of the broader pytest system.


Detailed Explanation of Classes and Functions

Type Aliases and Data Classes

pytest_sessionstart(session: Session) -> None

Scope Helper Functions

Fixture Sorting Helpers

FuncFixtureInfo

FixtureRequest (Abstract Base Class)

Represents the context of a fixture request, e.g., the `request` object available inside fixtures and tests.

TopRequest(FixtureRequest)

SubRequest(FixtureRequest)

FixtureLookupError(LookupError)

call_fixture_func(fixturefunc, request, kwargs)

_teardown_yield_fixture(fixturefunc, it)

_eval_scope_callable(scope_callable, fixture_name, config)

FixtureDef

resolve_fixture_function(fixturedef, request)

pytest_fixture_setup(fixturedef, request)

FixtureFunctionMarker

FixtureFunctionDefinition

fixture(...)

Deprecated: yield_fixture

Built-in Fixtures

CLI and Config Integration

Fixture Info Utilities

FixtureManager

Fixtures Display Functions


Important Implementation Details and Algorithms


Interaction with Other System Components


Usage Examples

Defining a Fixture

import pytest

@pytest.fixture(scope="module", params=[1, 2, 3])
def sample_data(request):
    return request.param

Using a Fixture in Tests

def test_example(sample_data):
    assert sample_data in [1, 2, 3]

Accessing Fixtures Dynamically

def test_dynamic(request):
    value = request.getfixturevalue("sample_data")
    assert value in [1, 2, 3]

Adding a Finalizer

@pytest.fixture
def resource(request):
    res = acquire_resource()
    def cleanup():
        res.release()
    request.addfinalizer(cleanup)
    return res

Mermaid Diagram: Class Structure Overview

classDiagram
    class FixtureManager {
        +getfixtureinfo(node, func, cls)
        +parsefactories(node_or_obj, nodeid)
        +getfixturedefs(argname, node)
        +pytest_generate_tests(metafunc)
        +pytest_collection_modifyitems(items)
    }

    class FixtureDef {
        +argname: str
        +scope: str
        +func: callable
        +params: Sequence
        +cached_result
        +addfinalizer(finalizer)
        +execute(request)
        +finish(request)
    }

    class FixtureRequest {
        +fixturename: Optional[str]
        +param: Any
        +getfixturevalue(argname)
        +addfinalizer(finalizer)
        +applymarker(marker)
    }

    class TopRequest {
        +_scope: Scope
        +_fillfixtures()
    }

    class SubRequest {
        +_scope: Scope
        +_parent_request: FixtureRequest
        +param_index: int
    }

    class FixtureFunctionMarker {
        +scope
        +params
        +autouse
        +ids
        +name
        +__call__(function)
    }

    class FixtureFunctionDefinition {
        +__call__(*args, **kwargs)
        +__get__(instance, owner)
    }

    class FixtureLookupError {
        +argname
        +request
        +fixturestack
        +formatrepr()
    }

    FixtureManager "1" -- "*" FixtureDef : manages
    FixtureDef "1" -- "*" "Callable" : wraps
    FixtureRequest <|-- TopRequest
    FixtureRequest <|-- SubRequest
    FixtureFunctionMarker --> FixtureFunctionDefinition : creates

Summary

[fixtures.py](/projects/286/67499) is a comprehensive implementation of pytest’s fixture system, providing:

This file is foundational to pytest’s powerful fixture mechanism, enabling scalable, maintainable, and readable test suites.


End of documentation for fixtures.py