Hyppää sisältöön

Behave

Huomautus

Short English summary at the end of article.

Behaviour driven development (BDD) on muunnelma tai erikoistapaus testivetoisesta kehityksestä (TDD, test driven development). BDD:ssä keskitytään nimenomaisesti ominaisuuksien kautta tapahtuvaan ohjelmiston kehitykseen. Ideana on määritellä ensin omainaisuus ja sitten testitapaukset, joilla ominaisuus voidaan todentaa. Testitapaukset toteutetaan niin, että ne voidaan ajaa ja tulokset tarkistaa automaattisesti.

Behave on Pythonilla toteutettu ohjelma, joka tukee BDD:n mukaista kehittämistä. Behavessa vaatimukset ja testitapaukset määritellään Gherkin-kielellä, joka on normaalia englantia (tai jotain muuta kieltä, kuten suomea), mutta riittävän formaalisti kirjoitettu, jotta siitä voidaan ohjelmallisesti tunnistaa rakenne.

Saadakseni paremman mielikuvan ohjelman toiminnasta, tein vaatimukset ja testitapaukset Hello World -ohjelmalle.

Ensin kuitenkin tarvittavien ohjelmien asennukset. Behaven (ja nosen) asennus onnistuu virtualenviin easy_install-komennolla.

virtualenv -p python3 env
. env/bin/activate
easy_install behave
easy_install nose

Varsinainen vaatimus määritellään tiedostoon features/sample.feature.

Feature: Sample hello world program.

Scenario: Default output.
    When I run the program without arguments
    then it should print "Hello world!".

Scenario Outline: Output with an argument.
    When I run the program with the argument "<argument>"
    then it should print "<output>".

Examples: Sample outputs
    | argument    | output            |
    | universe    | Hello universe!   |
    | hello hello | Hello hello hello!|

Tässä Feature-sanalla merkitään vaatimus ja Scenario-sanalla testitapaukset. Testitapauksessa erotetaan when- ja then-sanoilla testiaskeleet.

Jotta testitapaukset voidaan ajaa, pitää testitapauksen askeleille määritellä koodi. Esimerkissäni tein toteutuksen niin, että niissä ajetaan python hello.py-komentoa argumentin kera ja ilman sitä. Testitapausten toteutuksen määritellään pythonilla features/steps-hakemistoon, esim. features/steps/steps.py:

import subprocess
from nose.tools import *

def run(*args):
    return subprocess.check_output(args, universal_newlines=True)

@when('I run the program without arguments')
def impl(context):
    context.output_text = run("python3", "hello.py")

@when('I run the program with the argument "{arg}"')
def impl(context, arg):
    context.output_text = run("python3", "hello.py", arg)

@then('it should print "{text}".')
def impl(context, text):
    assert_equals(text + '\n', context.output_text)

Toteutukset merkitään @when- ja @then-dekoraattoreilla.

Toteutus hello.py voisi sitten tässä tapauksessa olla seuraavanlainen.

import sys

def main():
    world = sys.argv[1] if len(sys.argv) > 1 else 'world'
    print("Hello {}!".format(world))

if __name__ == '__main__':
    main()

Kun nyt ajetaan behave-komento, saadaan seuraavanlainen tulostus.

Feature: Sample hello world program. # features/sample.feature:2

  Scenario: Default output.                  # features/sample.feature:4
    When I run the program without arguments # <string>:9
    Then it should print "Hello world!".     # <string>:17

  Scenario Outline: Output with an argument.            # features/sample.feature:8
    When I run the program with the argument "universe" # <string>:13
    Then it should print "Hello universe!".             # <string>:17

  Scenario Outline: Output with an argument.               # features/sample.feature:8
    When I run the program with the argument "hello hello" # <string>:13
    Then it should print "Hello hello hello!".             # <string>:17


1 feature passed, 0 failed, 0 skipped
3 scenarios passed, 0 failed, 0 skipped
6 steps passed, 0 failed, 0 skipped, 0 undefined
Took 0m0.1s

Tämä nyt oli yksinkertainen kokeilu, josta eivät kaikki behaven ominaisuudet tule esille, mutta tätä muokkailemalla pääsee kokeilemaan ohjelmaa.

Ystävällisin terveisin

Timo Kankare


English Summary

This is my quick experiment to behaviour driven development with Behave program. I just implemented Hello World program first making specification and then implementation for the scenarios and finally the program.

Kommentit