Nov 302013
 

“So einfach wie möglich. Aber nicht einfacher.” meint Albert Einstein. Ich bin überzeugt: Redundanzfreiheit ist eine Programmiertugend, die einfache, verständliche und vor allem änderbare Software begünstigt. Bekannt ist diese Tugend auch als DRY – Don’t repeat yourself. Das gilt natürlich auch für Softwaretests. Ich liebe das mächtige, einfache Jasmine-Test-Framework für JavaScript.

Jasmine strebt danach, verhaltensgetriebene Softwareentwicklung (BDD) zu unterstützen und liegt damit im Trend der testgetriebenen Softwareentwicklung (TDD). Wenn-Dann-Testfälle definieren das Softwareverhalten vor dessen Implementierung. Jasmine möchte insbesondere für lesbare Testfälle sorgen.

Meine Idee: Die absolute Reduktion eines Jasmine-Testfalls auf dessen Namen. Dies ist besonders nützlich für Testfälle die sich in den verwendeten Daten unterschieden – also mehrere Testfalldatensätze verwenden.  Die von jedem Test verwendete Testfunktion extrahiert sich Eingabedaten und erwartetes Ergebnis aus dem Testfallnamen.

Sieht wie folgt bei mir aus:

describe("taskEditCtrl", function() {

    function testDueInputDisplayByTestDesc() {

        var desc = jasmine.getEnv().currentSpec.description;

        var dueInput = desc.replace(/.+with '([.\w\s\d]+)'.*/, '$1');

        var expectedDueText = desc.replace(/.+to display '([.\w\s\d]+)'.*/, '$1');

        editDueAndSave(dueInput);

        expect(task.getDueText()).toBe(expectedDueText);

    }

 

    it("can edit and save due with '1 day' to get '2013-6-13'", testDueInputByTestDesc);

    it("can edit and save due with '1day' to get '2013-6-13'", testDueInputByTestDesc);

    it("can edit and save due with '1 days' to get '2013-6-13'", testDueInputByTestDesc);

    it("can edit and save due with '2 days' to get '2013-6-14'", testDueInputByTestDesc);

    it("can edit and save due with '2days' to get '2013-6-14'", testDueInputByTestDesc);

    it("can edit and save due with '32 days' to get '2013-7-14'", testDueInputByTestDesc);

    it("can edit and save due with '1 week' to get '2013-6-19'", testDueInputByTestDesc);

    it("can edit and save due with '1 weeks' to get '2013-6-19'", testDueInputByTestDesc);

    it("can edit and save due with '2 weeks' to get '2013-6-26'", testDueInputByTestDesc);

    it("can edit and save due with '5 weeks' to get '2013-7-17'", testDueInputByTestDesc);

});

Diese Testsuite für das Modul “taskEditCtrl” prüft die Änderung des Due-Datums mit verschiedenen Eingabewerten und erwarteten Ergebnissen. Als Due-Datum kann ein Nutzer z.B. “2 days” für das Datum zwei Tage von heute in der Zukunft abgeben. Die Testfunktion “testDueInputByTestDesc” wird einfach als Referenz in jedem Testfall angegeben. Der Erste Testfall entällt als Eingabe “1 day” und als erwarteter Ausgabewert “2013-6-13”.

Meine Jasmine-Testergebnisse zeigen anhand des Testfallnamens was der Test leistet – ohne dabei das Wissen über den Testfall redundant im Testnamen und im Testcode redundant zu halten. Bedeutet für mich: “So einfach wie möglich. Aber nicht einfacher.”

Eine Alternative zu meinem Vorgehen gibt’s von JP aus Frisco: http://blog.jphpsf.com/2012/08/30/drying-up-your-javascript-jasmine-tests. Liest sich wie “@Parameters” in JUnit und gefällt mir auch sehr gut.

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>