Fixtures

Fixtures are reusable data recipes. Register them once, use them everywhere.

Basic fixture

# features/environment.py
from behave_data import data_fixture


@data_fixture("admin_user")
def admin_user():
    return {
        "name": "Admin User",
        "role": "admin",
        "email": "admin@example.com",
    }

Use in a feature:

@needs_data:admin_user
Scenario: Admin can access dashboard
  Given I am logged in as admin
  Then I see the admin dashboard

In the step:

@given("I am logged in as admin")
def step_admin_login(context):
    user = context.admin_user
    assert user["role"] == "admin"

Manual registration

from behave_data import DataManager

dm = DataManager()
dm.fixtures.register("guest", lambda: {"name": "Guest", "role": "guest"})
user = dm.fixture("guest")

Nested fixtures with ref

Reference another fixture inside a fixture:

@data_fixture("address")
def address():
    return {"street": "123 Main St", "city": "NYC"}


@data_fixture("user_with_address")
def user_with_address():
    return {
        "name": "Alice",
        "address": "ref:address",
    }

Result:

context.user_with_address == {
    "name": "Alice",
    "address": {"street": "123 Main St", "city": "NYC"},
}

Parametrized fixtures

@data_fixture("regular_user", params=["alice", "bob"])
def regular_user(name):
    return {"name": name, "role": "user"}

Use the param variant:

@needs_data:regular_user:alice
Scenario: Alice logs in
  Given I am logged in
  Then my name is "alice"

Fixture overrides

Override fields when retrieving:

user = context.data.fixture("admin_user", email="custom@example.com")
# {"name": "Admin User", "role": "admin", "email": "custom@example.com"}

Circular reference detection

Self-references raise an error:

@data_fixture("loop")
def loop():
    return {"self": "ref:loop"}

# raises BehaveDataError: Circular fixture reference

Scope

You can specify scope (ignored by current implementation, reserved for future):

@data_fixture("config", scope="feature")
def config():
    return {"timeout": 30}

With DataManager

from behave_data import DataManager

dm = DataManager()
dm.fixtures.register("item", lambda: {"name": "Book", "price": 10})
item = dm.fixture("item")