Migration Guide

From raw Behave to behave-kit

behave-kit is designed as a drop-in enhancement — no breaking changes to your existing Behave suite. You can adopt features incrementally.

Step 1: Install

pip install behave-kit

Step 2: Wire automatic features (optional)

Add to environment.py:

from behave_kit import setup, teardown

def before_all(context):
    setup(context, env="staging")

def after_scenario(context, scenario):
    teardown(context)

This enables:

  • Soft assertion collector (reset per scenario)

  • Context dump on failure

  • Step suggestions for undefined steps

  • Fixture manager

  • Scoped attribute cleanup

Step 3: Replace raw asserts with soft asserts

Before:

@then("the response should be valid")
def step(context):
    assert context.response.status_code == 200
    assert context.response.body["count"] > 0

After:

from behave_kit import assert_soft

@then("the response should be valid")
def step(context):
    assert_soft(context.response.status_code == 200)
    assert_soft(context.response.body["count"] > 0)

Soft asserts collect all failures and report them together at teardown, instead of stopping at the first one.

Step 4: Add typed context (optional)

Before:

@given("I have a browser")
def step(context):
    context.driver = "chrome"
    context.base_url = "https://test.com"

@then('the driver should be "{driver}"')
def step(context, driver):
    assert context.driver == driver  # no IDE autocompletion

After:

from behave_kit import TypedContext

class MySchema:
    driver: str
    base_url: str

@given("I have a browser")
def step(context):
    ctx = TypedContext(context, MySchema)
    ctx.setup(driver="chrome", base_url="https://test.com")

@then('the driver should be "{driver}"')
def step(context, driver):
    ctx = TypedContext(context, MySchema)
    assert ctx.driver == driver  # IDE autocompletion + mypy validation

Step 5: Replace manual env reads

Before:

import os
api_key = os.environ.get("API_KEY")
if api_key is None:
    raise ValueError("API_KEY is not set")

After:

from behave_kit import env
api_key = env("API_KEY", required=True)

Step 6: Add tag-based fixtures (optional)

Before:

def before_scenario(context, scenario):
    if "browser" in scenario.tags:
        context.browser = start_browser()

def after_scenario(context, scenario):
    if hasattr(context, "browser"):
        context.browser.quit()

After:

from behave_kit import fixture

@fixture("browser")
def browser_fixture(context):
    def setup(ctx):
        ctx.browser = start_browser()
    def teardown(ctx):
        ctx.browser.quit()
    return (setup, teardown)

# In environment.py:
from behave_kit.fixtures import FixtureManager
fixtures = FixtureManager()

def before_scenario(context, scenario):
    fixtures.setup_for_scenario(context, scenario)

def after_scenario(context, scenario):
    fixtures.teardown_scenario(context)

Compatibility

  • behave-kit works with Behave >= 1.2.6

  • Python >= 3.11

  • No monkey-patching — all features are opt-in

  • Existing step definitions continue to work unchanged