Gdy półtora miesiąca temu popełniłem pierwszy tekst poświęcony w całości Kotlinowi zamieściłem tam testy napisane na modłę xUnita. Dziś wrócimy do tamtego tematu, ale testy napiszemy z wykorzystaniem Spek. Framework ten jest czymś pomiędzy podejściem TDD, a BDD. Sami twórcy mocno bronią się przed zakwalifikowaniem go jako narzędzia BDD. Swoją drogą Spek to po holendersku boczek, zatem BDD można rozwinąć do Becon Driven Development. Dla mnie koszerne.

Specyfikacja

Pisząc testy w Spek, używamy DSLa, zdefiniowanego przez ten framework. Sam zestaw testów jest specyfikacją, która pozwala na opisanie zachowania i spodziewanych wyników.

Listing 1. Prosta specyfikacja

class SpekVersionTest : Spek({

    describe("When we have Version 0") {
        val v0 = Version(0)

        it("Should return new object after incrementation") {
            val v1 = +v0;
            assertEquals(1, v1.version)
            assertNotEquals(v0, v1)
        }

    }
})

Mamy tu kilka elementów. Po pierwsze nasza klasa testowa musi rozszerzać Spek. Konstruktor jako parametr przyjmuje opis testu (technikaliom tego wyrażenia przyjrzymy się kiedy indziej). W sekcji describe umieszczamy kod przygotowujący stan początkowy. Ma ona sens metody setUp. Może występować wielokrotnie. Sekcja it ma sens pojedynczego testu. Służy do weryfikacji zachowania. Może być wiele sekcji tego typu w ramach jednej sekcji description.

W stylu BDD

Spek udostępnia też trochę inną notację, która jest oparta o model given/when/then. Przy czym nazywa ją given/on/it. Powyższy test przepisany na takie podejście będzie wyglądał następująco:

Listing 2. Inny sposób zapisu

class SpekVersionTest2 : Spek({

    given("Version 0") {
        val v0 = Version(0)
        on(" Increment ") {
            val v1 = +v0;
            it(" returns new version 1") {
                assertEquals(1, v1.version)
            }

            it(" are not equals ") {
                assertNotEquals(v0, v1)
            }
        }
    }
}

Pomiędzy tymi dwoma podejściami nie ma większych różnic technicznych. Różnica polega na sposobie prezentacji danych (dodałem kilka testów):


specVT

spekVT2

W przypadku drugiej wersji mamy „głębsze” drzewo, co przekłada się na trochę inny sposób organizacji testów.

Podsumowanie

Spek jest ciekawym i prostym rozwiązaniem, które pozwala na pisanie testów w trochę inny sposób. Ma przyjazny DSL, który może też być wykorzystany w Javie. To, co zauważyłem, to błędy w dokumentacji, które na początku mogą powodować problemy ze zrozumieniem zasady działania całości.