====== Behave ======
In Behave the user story is called Feature, it contains scenarios which are executed by steps. Steps are tests placed into a "steps" folder inside the working directory. Those tests are writen in a python script file (.py), whereas features are writen in a .feature file. We associate steps with features using "given", "when", and "then" clauses and decorators. There also are "and" and "but" clauses and decorators, however they shadow their previous step. It means, for instance, an “and” following a “given” will become a “given” internally and use a “give” decorated step.
From the tutorial example we can observe it:
Feature: showing off behave
Scenario: run a simple test
Given we have behave installed
when we implement a test
then behave will test it for us!
This is the tutorial.feature file which contains the user story (aka feature). The steps/tutorial.py file contains:
from behave import *
@given('we have behave installed')
def step_impl(context):
pass
@when('we implement a test')
def step_impl(context):
assert True is not False
@then('behave will test it for us!')
def step_impl(context):
assert context.failed is False
As you can see, step clauses match with function decorators. Function steps receive a context argument, this corresponds to the data that Behave shares. Now, to run tests it's only required to execute Behave in the working directory:
$ behave
Although Behave works fine using default configuration, in http://pythonhosted.org/behave/behave.html you can find how to apply an advance configuration or execute it with other arguments.
There also is a Django app test examble in: http://pythonhosted.org/behave/django.html
===== Install =====
$ pip install behave
===== Using Behave =====
==== What can you do in feature files? ====
=== You can execute steps for each case in a defined table ===
Next example will run the tests for "red fox - animal", "firefox - navigator", and "chrome - navigator":
Scenario Outline: Blenders
Given I installed in my computer,
when I execute
then I realize it is a
Examples: Living things
| name | result |
| firefox | animal |
| firefox | navigator |
Examples: Other things
| name | result |
| chrome | navigator |
=== You can pass text to the step ===
It can be accessed into the context.text property:
Scenario: some scenario
Given a sample text loaded into the frobulator
"""
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua.
"""
When we activate the frobulator
Then we will find it similar to English
=== You can pass a table to the step ===
It can be accessed into the context.table property, it's a dictionary of its rows which colum names are the keys:
Scenario: some scenario
Given a set of specific users
| name | department |
| Barry | Beer Cans |
| Pudey | Silly Walks |
| Two-Lumps | Silly Walks |
When we count the number of people in each department
Then we will find two people in "Silly Walks"
But we will find one person in "Beer Cans"
==== What can you do inside steps code? ====
=== You can receive parameters===
Defining a text pattern into the step decorator you can access to a variable value:
Scenario: look up a book
Given I search for a valid book
Then the result page will include "success"
Scenario: look up an invalid book
Given I search for a invalid book
Then the result page will include "failure"
@then('the result page will include "{text}"')
def step_impl(context, text):
if text not in context.response:
fail('%r not in %r' % (message, context.response))
There are other options to define the pattern in an advanced way: http://pythonhosted.org/behave/tutorial.html#step-parameters
=== You can run code at some point of the execution ===
There are several predefined functions that you can code to execute rutines, for example, before an step, after all the steps, etc. You can see
them in http://pythonhosted.org/behave/tutorial.html#environmental-controls
Links
http://pythonhosted.org/behave/
http://jenisys.github.io/behave.example/
http://pythonhosted.org/behave/api.html