12 Stimmen

Erster TDD-Test ohne Behauptung/erwartete Ausnahme. Ist es das wert?

Nehmen wir an, ich fange an, ein Spiel mit TDD zu entwickeln. Ist dies ein guter erster Test?

[TestMethod]
public void Can_Start_And_End_Game()
{
    Tetris tetris = new Tetris();
    tetris.Start();
    tetris.End();
}

Sie zwingt mich im Wesentlichen dazu, 3 Dinge zu definieren: die Tetris Klasse und ihre Start() y End() Methoden, aber ansonsten ist es ziemlich nutzlos. Es mag zwar sofort von Interesse sein, da ich damit die Klasse und die Methoden definieren kann, aber später wird es wahrscheinlich keinen Zweck mehr erfüllen. Ihr einziger Zweck wäre vielleicht zu zeigen, dass es möglich sein muss, ein Spiel zu starten und zu beenden, ohne eine Exception in der Mitte zu bekommen.

Was denken Sie darüber?

19voto

S.Lott Punkte 371691

Es zwingt mich im Grunde, 3 Dinge zu definieren: die Tetris-Klasse und ihre Start()- und End()-Methoden,

Das stimmt.

aber ansonsten ist es ziemlich nutzlos.

Falsch.

später wird es wahrscheinlich keinen Zweck mehr erfüllen

Auch falsch.

Ihr ... Zweck [ist] zu zeigen, dass es möglich sein muss, ein Spiel zu beginnen und zu beenden, ohne dass in der Mitte eine Ausnahme auftritt

Und das ist RIESIG. Episch. Monumental.

Dieser Test wird sogar so oft fehlschlagen, dass Sie ihn hassen werden. Jede unbehandelte, nicht abgefangene Ausnahme von allen möglichen zufälligen Stellen in Ihrem Programm wird diesen Test nicht bestehen. Sie werden wegen dieses Tests eine sorgfältige Protokollierung und Fehlersuche aufbauen.

Dieser Test ist EPIC.

7voto

Skilldrick Punkte 66961

Sie treiben die Entwicklung der Tetris-Klasse mit diesem Test nicht wirklich voran - Sie haben entschieden, wie die API aussehen soll, was in Ordnung ist, aber warum schreiben Sie nicht einen Test, der etwas testet, was sie tatsächlich tun sollte?

Die Tests sollten die API informieren, nicht umgekehrt. (imho).

3voto

Jerod Houghtelling Punkte 4599

Ich bin kein großer Fan von diesem Test. Ja, er hat geholfen, die Schnittstelle zu definieren, aber er ist nicht sehr gut geeignet, um Verhalten zu definieren (und zu testen).

Ich denke, es wäre besser, einen Test zu haben, der den Startvorgang abwickelt. Er würde wahrscheinlich die Standardeinstellungen oder die Wertungswerte bestätigen. Dann würde ich zusätzliche Tests haben, um zu sehen, ob man ein Spiel beenden kann.

Idealerweise sollte jede Testmethode ein Verhalten ausführen.

1voto

Fredrik Mörk Punkte 151006

Ich denke, dass der Zweck des Tests deutlicher gemacht werden kann, indem alle Ausnahmen abgefangen werden und der Test explizit fehlschlägt, wenn dies der Fall ist:

[TestMethod]
public void Can_Start_And_End_Game()
{
    try
    {
        Tetris tetris = new Tetris();
        tetris.Start();
        tetris.End();
    }
    catch (Exception ex)
    {
        Assert.Fail("Unexpected exception thrown: " + ex.ToString());
    }
}

1voto

Manfred Punkte 4874

Ja, der Test bestätigt, dass im Konstruktor keine Ausnahme ausgelöst wird, die Start() y el Stop() Methode.

Ich sehe wenig Nutzen in einem zusätzlichen try/catch-Block innerhalb des Tests, um Ausnahmen abzufangen. Das Werkzeug, das den Test ausführt, wird diese abfangen und melden. Nach dem Prinzip TSTTCPW kann der Test ohne den try/catch-Block auskommen.

Sie können den Test etwas aussagekräftiger gestalten, indem Sie am Ende Behauptungen hinzufügen, z. B. die Validierung des Werts von Eigenschaften auf der Registerkarte tetris Objekt.

Bitte beachten Sie den Unterschied zwischen dem Schreiben eines Einheitstests und der Anwendung von TDD. Der Wert ergibt sich aus dem Verständnis dieses Unterschieds.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X