3.6. Step - 06 : Hooks

Let’s add some hooks to features/environment.py

# environment.py


import libmath

DEBUG = True

# Environmental Controls
#
# The environment.py module may define code to run before and after certain
# events during your testing:

# before_all(context), after_all(context)
#   These run before and after the whole shooting match.

# before_feature(context, feature), after_feature(context, feature)
#   These run before and after each feature file is exercised.

# before_scenario(context, scenario), after_scenario(context, scenario)
#   These run before and after each scenario is run.

# before_step(context, step), after_step(context, step)
#   These run before and after every step.

# before_tag(context, tag), after_tag(context, tag)
#   These run before and after a section tagged with the given name. They are
#   invoked for each tag encountered in the order they're found in the feature
#   file. See controlling things with tags.

def before_all(context):
    if DEBUG:
        print("DEBUG: before_all")

def after_all(context):
    if DEBUG:
        print("DEBUG: after_all")

def before_feature(context, feature):
    if DEBUG:
        print("DEBUG: before_feature %s"%feature)

def after_feature(context, feature):
    if DEBUG:
        print("DEBUG: after_feature %s"%feature)

def before_scenario(context, scenario):
    """ Let's start with a new clean object before every test. """
    if DEBUG:
        print("DEBUG: before_scenario")
        context.math = libmath.libMath()

def after_scenario(context, scenario):
    if DEBUG:
        print("DEBUG: after_scenario")

def before_step(context, step):
    # It's called but not shown without --no-capture
    # https://github.com/behave/behave/issues/653
    if DEBUG:
        print("DEBUG: before_step '%s'\n"%step)

def after_step(context, step):
    # It's called but not shown without --no-capture
    # https://github.com/behave/behave/issues/653
    if DEBUG:
        print("DEBUG: after_step '%s'\n"%step)

def before_tag(context, tag):
    if DEBUG:
        print("DEBUG: before_tag '%s'"%tag)

def after_tag(context, tag):
    if DEBUG:
        print("DEBUG: after_tag '%s'"%tag)

We have to run behave with --no-capture, so that console output from before_step and after_step are also shown:

behave --no-color --no-timings --no-capture --no-source

The output of the command is as follows:

DEBUG: before_all
DEBUG: before_feature <Feature "Simple Addition": 2 scenario(s)>
Feature: Simple Addition
  Showcase simple addition for the BDD Book.DEBUG: before_scenario

  Scenario: Addition of single digit numbers 
    Given I have '1' and '3'
DEBUG: before_step '<given "I have '1' and '3'">'

DEBUG: after_step '<given "I have '1' and '3'">'

    When I add them
DEBUG: before_step '<when "I add them">'

DEBUG: after_step '<when "I add them">'

    Then The result must be '4'
DEBUG: before_step '<then "The result must be '4'">'

DEBUG: after_step '<then "The result must be '4'">'

DEBUG: after_scenario
DEBUG: before_scenario

  Scenario: Addition of double digit numbers 
    Given I have '70' and '29'
DEBUG: before_step '<given "I have '70' and '29'">'

DEBUG: after_step '<given "I have '70' and '29'">'

    When I add them
DEBUG: before_step '<when "I add them">'

DEBUG: after_step '<when "I add them">'

    Then The result must be '99'
DEBUG: before_step '<then "The result must be '99'">'

DEBUG: after_step '<then "The result must be '99'">'

DEBUG: after_scenario
DEBUG: after_feature <Feature "Simple Addition": 2 scenario(s)>

DEBUG: before_feature <Feature "Tabulated maths": 1 scenario(s)>
Feature: Tabulated maths
DEBUG: before_scenario

  Scenario Outline: Table -- @1.1  
    Given I have '1' and '2'
DEBUG: before_step '<given "I have '1' and '2'">'

DEBUG: after_step '<given "I have '1' and '2'">'

    When I add them
DEBUG: before_step '<when "I add them">'

DEBUG: after_step '<when "I add them">'

    Then The result must be '3'
DEBUG: before_step '<then "The result must be '3'">'

DEBUG: after_step '<then "The result must be '3'">'

DEBUG: after_scenario
DEBUG: before_scenario

  Scenario Outline: Table -- @1.2  
    Given I have '10' and '20'
DEBUG: before_step '<given "I have '10' and '20'">'

DEBUG: after_step '<given "I have '10' and '20'">'

    When I add them
DEBUG: before_step '<when "I add them">'

DEBUG: after_step '<when "I add them">'

    Then The result must be '30'
DEBUG: before_step '<then "The result must be '30'">'

DEBUG: after_step '<then "The result must be '30'">'

DEBUG: after_scenario
DEBUG: before_scenario

  Scenario Outline: Table -- @1.3  
    Given I have '22' and '33'
DEBUG: before_step '<given "I have '22' and '33'">'

DEBUG: after_step '<given "I have '22' and '33'">'

    When I add them
DEBUG: before_step '<when "I add them">'

DEBUG: after_step '<when "I add them">'

    Then The result must be '55'
DEBUG: before_step '<then "The result must be '55'">'

DEBUG: after_step '<then "The result must be '55'">'

DEBUG: after_scenario
DEBUG: before_scenario

  Scenario Outline: Table -- @1.4  
    Given I have '22' and '33'
DEBUG: before_step '<given "I have '22' and '33'">'

DEBUG: after_step '<given "I have '22' and '33'">'

    When I add them
DEBUG: before_step '<when "I add them">'

DEBUG: after_step '<when "I add them">'

    Then The result must be '55'
DEBUG: before_step '<then "The result must be '55'">'

DEBUG: after_step '<then "The result must be '55'">'

DEBUG: after_scenario
DEBUG: after_feature <Feature "Tabulated maths": 1 scenario(s)>

DEBUG: after_all
2 features passed, 0 failed, 0 skipped
6 scenarios passed, 0 failed, 0 skipped
18 steps passed, 0 failed, 0 skipped, 0 undefined
Took 0m0.002s