4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piotr Kiebasiński
Transcript of 4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piotr Kiebasiński
Kilka słów o testowaniu dla programistów
czyli o testach, BDD, Spocku i kilku innych
drobiazgach
20 kwietnia, 2015 Warszawa, 4dev
Piotr Kiebasiński
Kto jest kim?
Piotr Kiebasiński,
Absolwent IF UJ, z zamiłowania i wyboru konsultant i
kontraktor w IT
Java, Linux, Bash, Python i parę innych
j-labs competences
• Over 80 engineers in Cracow office
• On market since 2008
• Member of ASPIRE – association of IT and BPO centers
• Main technology areas: Java / JEE, .NET / ASP.NET, QA
• Reliable partner for international organizations
Jak to zwykle wygląda na samym początku?
• Nowy pracownik na praktykach -> czyli napisz mi tutaj
testy, bo pokrycie kiepskie
Jak to zwykle wygląda na początku?
•NUDA!
Pierwszy porządny bug – czyli NullPointerException
• Tylko że rzadko jest tak:
Pierwszy porządny bug – czyli NullPointerException
• Częściej tak:
Po co testy?
• Dlaczego pisać testy przy tak prostych błędach?
• Bo pewność
• Bo powtarzalność (automatyzacja)
• Bo refaktoring
• Bo kod żyje dużo dłużej po napisaniu niż nam się wydaje
• Bo można sprawdzić kiedy się zepsuje znowu
Pierwszy porządny bug – czyli NullPointerException
• Ale jak to przetestować?
• Czyli skąd wziąć:
• UserDao
• AuthorDao
• I jeszcze być pewnym że zwrócą to co chcemy?
Pierwszy porządny bug – czyli NullPointerException
• Metoda I – użyć prawdziwych obiektów i porobić
odpowiednie wpisy w bazie (testy integracyjne)
• Metoda II – czyli zasymulować – zamockować zachowanie
na którym nam zależy
• Mockito, PowerMock, Jmockit etc
• Spock
Spock - wprowadzenie
• Link: https://code.google.com/p/spock/
• „Spock is a testing and specification framework for Java and Groovy applications. What makes it stand out from the crowd is its beautiful and highly expressive specification language. Thanks to its JUnit runner, Spock is compatible with most IDEs, build tools, and continuous integration servers. Spock is inspired from JUnit, RSpec, jMock, Mockito, Groovy, Scala, Vulcans, and other fascinating life forms.”
Spock - wprowadzenie
• Łatwy do nauczenia –wymaga w zasadzie JUnita
• Stworzony w Groovym - z całym dobrodziejstwem
inwentarza
• Eliminuje niepotrzebną pracę – na przykład pisanie asercji
• Szczegółowe informacje – choćby w opisowych nazwach
metod albo w komunikatach błędów
Spock - wprowadzenie
• Nie narzuca metodyki pisania testów
• Czytelny kod – chyba że ktoś się mocno postara
• Elastyczny i rozszerzalny – Spring, transakcje etc – żaden
problem
• Kompatybilny z JUnitem
Spock - wprowadzenie
Spock - uniezależnienie się od zewnętrznych systemów
• Story: Należy stworzyć mechanizm, który zapisze incydent
w przypadku kiedy w bazie danych mamy problemy z
odświeżeniem się widoku
Spock - uniezależnienie się od zewnętrznych systemów
Spock - uniezależnienie się od zewnętrznych systemów
• Czemu testy przecież kod jest banalny na oko?
Po co testy?
• Dlaczego pisać testy przy tak prostym kodzie?
• Bo pewność
• Bo powtarzalność (automatyzacja)
• Bo refaktoring
• Bo kod żyje dużo dłużej po napisaniu niż nam się wydaje
• Bo można sprawdzić kiedy się zepsuje znowu
• Bo jakość
Spock - uniezależnienie się od zewnętrznych systemów
Spock - wprowadzenie
Spock - wprowadzenie
Spock - wprowadzenie
Spock - given-when-then-where
Po co testy?
• Dlaczego pisać testy w taki sposób?
• Bo pewność
• Bo powtarzalność (automatyzacja)
• Bo refaktoring
• Bo kod żyje dużo dłużej po napisaniu niż nam się wydaje
• Bo można sprawdzić kiedy się zepsuje znowu
• Bo jakość
• Bo porządkuje nam myślenie
Spock - given-when-then-where
Spock - given-when-then-where
Spock - given-when-then-where
Spock - uniezależnienie się od zewnętrznych systemów
• Story: Należy stworzyć kontroler obsługujący procedurę
bazodanową liczącą pewne statystyki (duży wolumen
danych) i zwracający w pozytywnym scenariuszu zawartość
pliku. Obsługa błędów w myśl specjalnego dokumentu.
Spock - Controller story
Spock - Controller story
Spock - Controller story
Spock - WOW features - podsumowanie
• Mockowanie:
def subscriber = Mock(Subscriber)
• Czytelność
when:
publisher.send("hello")
then:
1 * subscriber.receive("hello")
publisher.messageCount == 1
• where (dopisanie przypadku testowego)
Spock - WOW features - podsumowanie
• Wymuszenie porządku
given/when/then
• operacje kolekcjach (vide możliwości Groovego)
[], [:], <<, every
• czytelne asercje
• http://spock-framework.readthedocs.org/en/latest/interaction_based_testing.html
Spock - WOW features - podsumowanie
Pytania?
Dziękuję za uwagę!