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