Testiranje softvera Mock objekti Mock objekti u optem
Testiranje softvera
Mock objekti • Mock objekti – u opštem slučaju lažni objekti koji imaju mogućnost da odrede da li je test passed ili failed, na osnovu interakcija između objekta (može se raditi na jediničnom nivou)
Mock objekti • Stab vs Mock? • Stab samo vraća podatke objektu koji se testira • Jedinični test direktno radi assert u klasi koja se testira, da bi se proverio rezultat • Mock čeka da bude pozvan od strane klase koja se testira (A) • Može imati više metoda koje A može da poziva • Proverava da li je pozvan na ispravan način • Ukoliko A interaguje sa B na očekivan način, test je prošao
Upotreba mock i stabova zajedno • Primer – Log. Analyzer čita iz web servisa. Ukoliko web servis ne loguje grešku, analyzer mora da pošalje mejl • Kako verifikovati da se ovo ponašanje zaista dešava • Napravi se stab za web servis koji će namerno fejlovati • Napravi se mock za email servis koji će verifikovati da ga analyzer zaista kontaktira kako bi poslao email
Mock objekti • Proste stabove je najčešće moguće ručno pisati u IDE • Mockovi su veoma teški za manuelno kreiranje • Postoji više Mock frejmvorka koji mogu pomoći u procesu – Android-mock, Easy. Mock, j. Mock, Mockito (Java) – Simple. Test, PHPUnit (PHP) … • Frejmvork obično pruža: – Automatsko generisanje mock objekata koji implementiraju zadati interfejs – Logovanje poziva koji su upućeni mock objektu – Metode za deklarisanje i assert očekivanih rezultata
j. Mock objekat
j. Mock API • j. Mock ima specifičan API, baziran na test sintaksi • Specificiranje objekata i poziva: – – one. Of(mock), exactly(count). of(mock), at. Least(count). of(mock), at. Most(count). of(mock), between(min, max). of(mock) allowing(mock), never(mock) • Gore pomenute metode prihvataju mock objekat i vraćaju deskriptor koji se može koristiti za pozivanje metoda – at. Least(3). of(mock. B). method 1(); • Očekujemo da će method 1 biti pozvan na mock. B bar 3 puta
JMock API • . will(action) – akcije: return. Value(v), throw. Exception(e) • vrednosti: – equal(value), same(value), any(type), a. Null(type), a. Non. Null(type), not(value), any. Of(value 1, . . , value. N) – one. Of(mock. B). method 1(); will(return. Value(any. Of(1, 4, -3))); • Očekujem da će method 1 biti pozvan na objektu mock. B jedanput, i da će vratiti ili 1, ili 4 ili -3
j. Mock API • Najsvežija verzija j. Mock 2. 6. 1 • Kako bi se moglo koristiti u okviru Net. Beans projekta, neophodno je dodati sledeće JAR fajlove u projekat – – jmock-2. 6. 1. jar hamcrest-core-1. 3. jar hamcrest-library-1. 3. jar jmock-junit 4
j. Mock API • Primer – posmatramo publish/subscribe sistem poruka • Publisher šalje poruku proizvoljnom broju Subscriber-a (0 ili više) • Želimo da testiramo Publisher klasu, koja uključuje interakciju sa objektima Subscriber klase • Test će uključivati scenario gde Publisher šalje poruku jednom registrovanom Subscriber-u
j. Mock API • Interfejs Subscriber
j. Mock API • Publisher:
j. Mock API • Pošto želimo da testiramo Publisher klasu, a klasa Subscriber nije implementirana, koristićemo mock objekat za Subscriber klasu • Prvo je neophodno importovati j. Mock klase, definisati našu test klasu, i kreirati Mockery, koji predstavlja kontekst u kome Publisher postoji • Kontekst mock-uje objekte sa kojima Publisher radi zajedno (u ovom slučaju Subscriber)
j. Mock API
j. Mock API • Potrebno je da napišemo metodu koja će izvršiti test
j. Mock API • Unutar testa, prvo je potrebno set up-ovati kontekst u kome će se test izvršiti • Kreira se Publisher koji se testira • Zatim se kreira mock Subscriber koji će primiti poruku • Zatim se mock Subscriber registruje kod Publisher-a • Na kraju, kreira se poruka koju je potrebno publishovati
j. Mock API
j. Mock API • Zatim se definišu očekivanja (expectations) od mock Subscriber-a koja specificiraju metode koje očekujemo da će biti pozvane za vreme testa • Očekujemo da će receive metoda biti pozvana jedanput sa jednim argumentom (message koji treba da se pošalje)
j. Mock API
j. Mock API
j. Mock API • Specifikacija očekivanja se definiše sa blokom sa duplim vitičastim zagradama, u kome su definisana očekivanja u kontekstu Mockery testa • U opštem slučaju, test izgleda:
j. Mock API • U bloku definisanja očekivanja, može se nalaziti proizvoljan broj očekivanja, gde svako očekivanje ima sledeću strukturu
j. Mock API • Drugi primer – Calculator. Service • Klasa koja treba da ima osnovne funkcionalnosti kalkulatora • Nju treba da koristi klasa Math. Application • Klasa Calculator. Service ne postoji još uvek • Prvo se kreira interfejs
j. Mock API
j. Mock API
j. Mock API
j. Mock API
- Slides: 27