RSpec für Python

Code-Stücke können hier veröffentlicht werden.
Antworten
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Angenommen, ich möchte testen, ob ein Konstruktor funktioniert:

Code: Alles auswählen

    import unittest
    class PlayerTest(unittest.TestCase):
        def test_player_no(self):
            assert Player(1).no == 0
dann geht der eigentliche Test nicht nur in jeder Menge Boilerplate-Code unter, sondern ich erhalte auch keine gute Fehlermeldung. Ein `assertEqual` gibt ebenfalls keine wirklich gute Fehlermeldung und ist zudem noch nicht kompatibel mit PEP8.

Wäre es nicht schick, wenn man dies schreiben könnte?

Code: Alles auswählen

    describe Player:
        it should have a `no` property:
            Player(1).no should == 1
Der folgende Code lässt diesen Traum Wirklichkeit werden: http://gist.github.com/160726

Doof? Gute Idee? Geht es einfacher?

Stefan
BlackJack

@sma: Mit `py.test` und folgendem Quelltext:

Code: Alles auswählen

class Player(object):
    def __init__(self, no):
        self.no = no


def test_player_no():
    assert Player(1).no == 0
erhalte ich folgendes Testergebnis:

Code: Alles auswählen

    def test_player_no():
E       assert Player(1).no == 0
>       assert 1 == 0
         +  where 1 = <forum4.Player object at 0xb7ab66ec>.no
         +    where <forum4.Player object at 0xb7ab66ec> = Player(1)

[/home/bj/forum4.py:10]
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Das sind zwar zugegeben bessere Fehlermeldungen - py.test muss da dann ja auch was umschreiben - Quelltext oder Bytecode? - doch es liest sich immer noch nicht so gut.

Wenn schon, dann

Code: Alles auswählen

def test_that_Player_has_a_property_no():
    assert Player(1).no == 1
aber mit ein bisschen Syntaxhighlighting im Editor finde ich meine Ruby-inspirierte Version immer noch besser. Daraus kann man zudem auch (wieder von RSpec inspiriert) eine Dokumentation ziehen. Das fällt bei `py.test` schwer.

Stefan
Antworten