Gibt es sowas wie RSpec für Python?
Verfasst: Samstag 24. November 2007, 11:48
Ich finde die Idee von RSpec sehr interessant. Gibt es etwas vergleichbares in Python? Kann man etwas vergleichbares bauen?
RSpec kann Anforderungen derart in einer auf Ruby aufgebauten domain-spezifischen Sprache formulieren, dass es sich fast wie englisch liest, aber als Unit-Test ausgeführt werden können. RSpec kann "Examples" mittels "describe" und "it" beschreiben, "Expectations" mittels "should" definieren und mit Mocks und Stubs nicht für die Tests relevante Teile ersetzen.
RSpec fügt dazu der Ruby-Klasse "Object" einige Methoden hinzu. Hier sehe ich bei Python ein Problem. Ich finde (als relativer Python-Neuling) keinen Weg, "object" um weitere Methoden zu erweitern. Auch finde ich keine Syntax, die nicht umständlich unbeholfen aussieht.
Ich komme an die Attribute einer Klasse heran, daher ist dies ein guter Container für die "it"-Methoden. Mich stört, dass ich im Klassennamen - um ihn eindeutig zu machen - die Beschreibung wiederholen muss.
Meine Hoffnung ist, dass ich als hier "example" getauften Methoden (warum kennt Python keine anonymen Funktionen oder Methoden - das wäre nett hier) mit dem selben Namen versehen kann und in "it" dafür sorgen kann, dass sie besondere interne Namen bekommen.
Leider scheint Python nicht zu erlauben, dass ich diesen Trick auch für Klassen benutzen kann. @-Attribute für Klassen sind kein Sprachbestandteil.
Das "should" ist mein hilfloser Versuch, damit klar zu kommen, dass ich nicht einfach eine neue Methode für "object" definieren kann. Es muss eine globale Funktion sein, die man jetzt explizit importieren muss.
Eine andere Idee, die ich hatte ist, nach dem "before" einfach alles, was dann in __dict__ steht - also alle Exemplarvariablen - mit so einer Methode zu versehen:
Theoretisch müsste ich "Should" doch auch als Mixin hinzufügen können, doch das wollte mir - jedenfalls zusammen mit Django-Modellen - nicht gelingen.
Stefan
RSpec kann Anforderungen derart in einer auf Ruby aufgebauten domain-spezifischen Sprache formulieren, dass es sich fast wie englisch liest, aber als Unit-Test ausgeführt werden können. RSpec kann "Examples" mittels "describe" und "it" beschreiben, "Expectations" mittels "should" definieren und mit Mocks und Stubs nicht für die Tests relevante Teile ersetzen.
RSpec fügt dazu der Ruby-Klasse "Object" einige Methoden hinzu. Hier sehe ich bei Python ein Problem. Ich finde (als relativer Python-Neuling) keinen Weg, "object" um weitere Methoden zu erweitern. Auch finde ich keine Syntax, die nicht umständlich unbeholfen aussieht.
Code: Alles auswählen
describe Account, " when first created" do
before do
@account = Account.new
end
it "should have a balance of $0" do
@account.balance.should == 0
end
end
Code: Alles auswählen
class Account_when_first_created(Spec):
what = Account
when = "first created"
def before(self):
self.account = Account()
@it("should have a balance of $0")
def example(self):
should(self.account.balance) == 0
Meine Hoffnung ist, dass ich als hier "example" getauften Methoden (warum kennt Python keine anonymen Funktionen oder Methoden - das wäre nett hier) mit dem selben Namen versehen kann und in "it" dafür sorgen kann, dass sie besondere interne Namen bekommen.
Leider scheint Python nicht zu erlauben, dass ich diesen Trick auch für Klassen benutzen kann. @-Attribute für Klassen sind kein Sprachbestandteil.
Das "should" ist mein hilfloser Versuch, damit klar zu kommen, dass ich nicht einfach eine neue Methode für "object" definieren kann. Es muss eine globale Funktion sein, die man jetzt explizit importieren muss.
Eine andere Idee, die ich hatte ist, nach dem "before" einfach alles, was dann in __dict__ steht - also alle Exemplarvariablen - mit so einer Methode zu versehen:
Code: Alles auswählen
class Should:
def should(self): ...
...
for v in self.__dict__.values():
if is_real_object(v): v.should = Should.should
Stefan