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