Cucumber für Python?
Verfasst: Samstag 4. April 2009, 09:37
Cucumber ist ein IMHO interessanter Ansatz, Akzeptanztests zu schreiben. Leider muss man dazu Ruby benutzen. Gibt es etwas ähnliches auch für Python?
Cucumber ist eine externe DSL. Hier ist ein Beispiel:
Durch `Scenario:` wird ein Test eingeleitet. Mit `Given`, das wie jeder andere Abschnitt auch mit `And` verlängert werden kann, definiere ich ein Setup, mit `When` führe ich eine Aktion durch, deren Ergebnis ich dann mit `Then` überprüfe.
Man muss nun Cucumber sagen, was "I have entered 4 into the calculator" eigentlich bedeutet. In Ruby sieht das so aus:
Für die anderen Schritte geht man ähnlich vor. Man implementiert jetzt "testdriven" den eigentlichen Taschenrechner und freut sich, dass der Test schließlich fehlerfrei läuft.
In Python könnte ich so was schreiben:
Aber elegant sieht das IMHO nicht aus. Hat jemand einen besseren Vorschlag? Vielleicht auch hier noch eine externe DSL?
Ein Parser, der die oben erwähnten Schlüsselwörter erkennt, ist jedenfalls nicht weiter schwer. Mit jeder Zeile geht er dann in eine von drei Listen mit den durch die Dekoratoren registrieren Funktionen und führt sie dann im Kontext eines "World"-Objekts aus.
Wie würde man das "should" zusichern?
Das gibt leider sehr schlechte Fehlermeldungen. Statt einfach nur "AssertionError" sollte da natürlich etwas in der Art "expected 3, got 4" ausgegeben werden.
Stefan
Cucumber ist eine externe DSL. Hier ist ein Beispiel:
Code: Alles auswählen
Scenario: Add two numbers
Given I have entered 4 into the calculator
And I have entered 3 into the calculator
When I press add
Then I should see 7 as result
Man muss nun Cucumber sagen, was "I have entered 4 into the calculator" eigentlich bedeutet. In Ruby sieht das so aus:
Code: Alles auswählen
Given /I have entered (\d+) into the calculator/ do |n|
@calculator ||= Calculator.new
@calculator.push(n.to_i)
end
In Python könnte ich so was schreiben:
Code: Alles auswählen
@Given(r"I have entered (\d+) into the calculator")
def do(world, n):
if not hasattr(world, 'calculator'):
world.calculator = Calculator()
world.calculator.push(int(n))
Ein Parser, der die oben erwähnten Schlüsselwörter erkennt, ist jedenfalls nicht weiter schwer. Mit jeder Zeile geht er dann in eine von drei Listen mit den durch die Dekoratoren registrieren Funktionen und führt sie dann im Kontext eines "World"-Objekts aus.
Wie würde man das "should" zusichern?
Code: Alles auswählen
@Then(r"I should see (\d+) as result")
def do(world, n):
assert world.calculator.pop() == int(n)
Stefan