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:
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?
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.
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.
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)
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))
...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With