Builders

Builders construct test data. Unlike fixtures, they are designed for derived fields and batch generation.

Basic builder

# features/environment.py
from behave_data import data_builder


@data_builder("product")
def product(overrides):
    return {
        "name": "Widget",
        "price": 9.99,
        **overrides,
    }

Use in a step:

@when("I build a product")
def step_build_product(context):
    context.product = context.data.build("product")

Result:

{"name": "Widget", "price": 9.99}

With overrides

product = context.data.build(
    "product",
    overrides={"name": "Gadget", "price": 19.99},
)
# {"name": "Gadget", "price": 19.99}

Build multiple instances

products = context.data.build("product", count=3)
# 3 products with default values

Derived fields

Use previous overrides inside the builder:

@data_builder("user")
def user(overrides):
    base = {
        "first_name": "Alice",
        "last_name": "Smith",
    }
    base["full_name"] = f"{base['first_name']} {base['last_name']}"
    return {**base, **overrides}

Manual registration

from behave_data import DataManager

dm = DataManager()
dm.builders.register("order", lambda o: {"items": [], **o})
order = dm.build("order")

Builder not found

context.data.build("unknown")
# raises BuilderNotFoundError