Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 697
Adam Matan Avatar asked Feb 03 '14 09:02

Adam Matan


People also ask

How do I run a specific feature file in behave?

You can run a feature file by using -i or --include flags and then the name of the feature file. For more information check the documentation for command line arguments. There's a lot of useful information hidden in their appendix section. NOTE: At the time I'm writing this it won't work with Python 3.6 and Behave 1.2.

How do you pass parameters in behave?

In the step implementation, we shall pass the parameter enclosed in {}. Also, the parameter is passed as one of the arguments to the implementation method. The output shows Shift is: day and Shift is: night printed. Here, the parameters day and night are passed from the step.


2 Answers

Just for all people out there, that are (like me) trying to import the single step-definition: Don't!

Simply import the whole module.

And here for all pepole (like me...) that still need more details:

If your project structure looks like this:

foo/bar.py
foo/behave/steps/bar_steps.py
foo/behave/bar.feature
foo/common_steps/baz.py

Just do

import foo.common_steps.baz

in foo/behave/steps/bar_steps.py (that is your regular step file)

like image 57
Fronk Avatar answered Sep 28 '22 13:09

Fronk


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))

...
like image 25
Adam Matan Avatar answered Sep 28 '22 12:09

Adam Matan