przetestujmy coś – Spock – #02

Potrzebowałam funkcji, która dla podanej daty zwróci mi datę ostatniej soboty (jeśli data jest sobotnia, powinna zwrócić samą siebie). Uznałam, że jest to dobra okazja żeby napisać sobie unit test. Metoda nie powinna być duża, algorytm nie jest złożony. Zróbmy to TDD.

W pracy do pisania testów używam frameworka Spock, który jest prosty do czytania i bardzo potężny jeśli chodzi o parametryzację testów, więc nic dziwnego, że postanowiłam z niego skorzystać tym razem.

Okazało się, że o ile ani metoda, ani algorytm nie nastręczały problemu to wyłożyłam się na połączeniu Androida ze Spockiem. Przeglądałam stackOverflow, githuba, blogi i nie znalazłam nic działającego. W akcie desperacji zajrzałam na slacka na kanał #android. Przeszukałam wpisy pod kątem Spocka i jest – znalazłam, był tam człowiek, któremu udało się to odpalić (Jakub, dzięki jeszcze raz za pomoc).

Po tym przydługim wstępie pokażmy trochę kodu. Na początek konfiguracja

  1. do pliku top-level build.gradle w sekcji dependencies dodajemy linijkę:
     classpath 'org.codehaus.groovy:groovy-android-gradle-plugin:1.1.0'
  2. do modułowego pliku build.gradle dorzucamy:
    apply plugin: 'groovyx.android'
    testOptions {
        unitTests.returnDefaultValues = true
    }
    testCompile 'org.codehaus.groovy:groovy-all:2.4.3'
    testCompile 'org.spockframework:spock-core:1.0-groovy-2.4'

Przy TDD zaczynamy od napisania testu, który ma się wywalić – załóżmy, że zaczynam tak: Inicjalizuję swoją klasę MealListHelper w sekcji setup. Odpalam z niej metodę getSaturdayDate, która przyjmuje parametr date i zwraca mi date resultDate. Odpalmy na razie taką sytuacje, nie podałam daty, ale chcę żeby wynik nie był nullem nawet w takiej sytuacji.

https://gist.github.com/jezinka/cf6b07344bb3c6ae122aef6b848a2b72

Nie mam jeszcze metody w getSaturdayDate(date), więc nie odpalę. Napiszmy ją. Wiemy tylko jak się nazywa, co przyjmuje i co ma zwracać. Zacznijmy od zwrócenia nulla.

https://gist.github.com/jezinka/35db417b72be2f19e7399c19fbf528c3

Test się odpalił i wywalił. O to chodziło 😀

W tym momencie zwróćmy coś:

https://gist.github.com/jezinka/e9513e2fcedd547ec0c8a9fabb4f80a0

Odpalam – mamy zielone światło i pierwszy test. Czas na kolejny test, który się wywali – przekażmy sobotnią datę i oczekujmy, że zwróci ją bez zmian. Wykorzystajmy tu sekcję where i parametryzację zmiennych:

https://gist.github.com/jezinka/9a38dfa11c035bbcd275a9daae118d5d

Zrzut ekranu z 2017-03-06 14-44-46.png

Test się wywalił, czyli czas na kod. Nie powinno się już korzystać z metod na klasie date, więc żeby sprawdzić, czy podana data jest sobotnią datą stworzę klasę Calendar, której powinno się używać. Przypadek dla „nie-soboty” na razie odłożę.

https://gist.github.com/jezinka/5ca59ea255ca1d7f7b3c107e74722f67

Przeszło – idziemy dalej 😉 Pojawia nam się potencjalny problem związany z użyciem Calendar. W linijce nr 3 ustawiamy mu wartość na podstawie parametru przekazanego przez użytkownika – pobawmy się w prawdziwego testera i dorzućmy jeden osobny test:

https://gist.github.com/jezinka/fbb6ea3807011b9a392132ce90b73bf6

Odpalamy i widzimy:

no_exception_throw.png

Ustalmy, że jeśli użytkownik nie podał parametru, to bierzemy dzisiejszą datę, zapiszmy to w dokumentacji i napiszmy kawałek kodu, który poprawi naszą sytuację.

https://gist.github.com/jezinka/3966059dc6217b24b9e0a793693d4f08

Powzdychajmy przez chwilę nad tym, że Java nie obsługuje default parameters.

Wracamy do kodu, został nam test pt. daję dowolną datę chcę soboty. Otwieramy kalendarz, patrzymy i wybieramy jako datę wejściową 13 marca, jako oczekiwaną 11 marca.

https://gist.github.com/jezinka/989980cc557b6ab59142965241d8be3f

Ładne czerwone, bo zwraca nam datę dzisiejszą. Pomyślmy nad tym – dni numerowane są od 1, gdzie 1 jest niedzielą, 7 sobotą. Czyli wystarczy odjąć od daty tyle dni ile zwróci nam

Calendar.DAY_OF_WEEK

Sprawdźmy to:

https://gist.github.com/jezinka/b80c4d46a438081048c06a8dfb192f1b

Działa – ale dla ustalenia, czy dla każdego dnia tygodnia działa, co mi szkodzi dorzucić testy dla całego tego tygodnia. Tak to widzę w Spocku:

https://gist.github.com/jezinka/505d251a75f2b7e0c9c601491dc66585

Dorzucę jeszcze test dla soboty w innym miesiącu i innym roku:

https://gist.github.com/jezinka/113daf210764574c8aa363f4e13ed798

pass.png

Działa – działa 😉

Jeszcze tylko zamienimy podwójne pobieranie dnia tygodnia z daty i prace nad tą metodą uznaję za zakończone:

https://gist.github.com/jezinka/e5e97e78244c96fed2dc0ae9b7134b67

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.