# Steps vs Step Extensions A `@step` is _just_ a function that has implicit access to the `context` inside a `@script`. A `@step_extension` is a `@step` that is added as a type extension method onto some other type. ## Understanding `@step_extension` The intent of type extensions is to add methods to a type. We use this in `@step_extension` to enable syntax like: ```python @scripted_test def some_test(): When.http.my_thing() # this is a custom "http" step ``` ## How to extend the `http` steps for your tests Define a `test_steps.py` module. ```python from safetydance_django.steps import ( http_client, http_response, ) from safetydance_django.test import Http from safetydance_test.step_extension import step_extension @step_extension(target_type=Http) def my_thing(): ... assert http_response.status_code == 200 # example, you can just use it ... ``` This should enable you to use it in your tests ```python @scripted_test def test_some_thing(): ... When.http.my_thing() ... ```