Search code examples
pythonbddpython-behave

Behave: How to import steps from another file?


I have just started using behave, a Pythonic BDD framework using Gherkin syntax. behave takes a feature, e.g.:

Scenario: Calling the metadata API
   Given A matching server
   When I call metadata
   Then metadata response is JSON
   And response status code is 200

And a steps file, e.g.:

...
@then('response status code is {expected_status_code}')
def step_impl(context, expected_status_code):
    assert_equals(context.response.status_code, int(expected_status_code))

@then('metadata response is JSON')
def step_impl(context):
    json.loads(context.metadata_response.data)
...

And combines them to a beautiful test resport:

Test results

Some of these steps - like:

  • metadata response is JSON
  • response status code is {expected_status_code}

Are used in many of my projects, and I would like to group them into a general steps file which I can import and reuse.

I tried extracting useful steps to a separate file and importing it, but received the following error:

@then('response status code is {expected_status_code}')
NameError: name 'then' is not defined

How do I create a generic steps file and import it?


Solution

  • In the imported file, the behave decorators (like then) must be imported:

    from behave import then
    from nose.tools import assert_equals
    
    @then('response status code is {expected_status_code}')
    def step_impl(context, expected_status_code):
        assert_equals(context.response.status_code, int(expected_status_code))
    
    ...