Kako testirati RxJavu?

1. Pregled

U ovom ćemo članku razmotriti načine testiranja koda napisanog pomoću RxJave.

Tipični tok koji stvaramo s RxJavom sastoji se od Uočljiv i an Posmatrač. Promatrano je izvor podataka koji je slijed elemenata. Jedan ili više promatrača pretplaćuju se na njega da bi primali emitirane događaje.

Obično se promatrač i opazivi izvršavaju u odvojenim nitima na asinkroni način - što otežava testiranje koda na tradicionalan način.

Srećom, RxJava pruža a TestSubscriber klase koja nam daje mogućnost testiranja asinkronog toka vođenog događajima.

2. Testiranje RxJave - tradicionalni način

Krenimo od primjera - imamo niz slova koje želimo komprimirati s nizom cijelih brojeva od 1 zaključno.

Naš bi test trebao ustvrditi da pretplatnik koji sluša događaje emitirane sa zipped observable prima slova zipirana s cijelim brojevima.

Pisanje takvog testa na tradicionalan način znači da moramo voditi popis rezultata i taj popis ažurirati od promatrača. Dodavanje elemenata na popis cijelih brojeva znači da naši promatrači i promatrači trebaju raditi u istoj niti - oni ne mogu raditi asinkrono.

I tako bi nam nedostajala jedna od najvećih prednosti RxJave - obrada događaja u odvojenim nitima.

Evo kako bi izgledala ta ograničena verzija testa:

Slova s ​​popisa = Arrays.asList ("A", "B", "C", "D", "E"); Rezultati popisa = novi ArrayList (); Observable observable = Observable .from (slova) .zipWith (Observable.range (1, Integer.MAX_VALUE), (string, index) -> index + "-" + string); observable.subscribe (rezultati :: dodaj); assertThat (results, notNullValue ()); assertThat (rezultati, hasSize (5)); assertThat (rezultati, hasItems ("1-A", "2-B", "3-C", "4-D", "5-E"));

Rezultate promatrača agregiramo dodavanjem elemenata u rezultatima popis. Promatrač i uočljivi djeluju u istoj niti pa naša tvrdnja pravilno blokira i čeka a pretplatite se () metoda dovršiti.

3. Testiranje RxJave pomoću a TestSubscriber

RxJava dolazi s TestSubsriber klasa koja nam omogućuje pisanje testova koji rade s asinkronom obradom događaja. Ovo je normalan promatrač koji se pretplaćuje na vidljivo.

U testu možemo ispitati stanje a TestSubscriber i iznijeti tvrdnje o tom stanju:

Slova s ​​popisa = Arrays.asList ("A", "B", "C", "D", "E"); Pretplatnik na TestSubscriber = novi TestSubscriber (); Observable observable = Observable .from (slova) .zipWith (Observable.range (1, Integer.MAX_VALUE), ((string, index) -> index + "-" + string)); observable.subscribe (pretplatnik); pretplatnik.assertCompleted (); pretplatnik.assertNoErrors (); pretplatnik.assertValueCount (5); assertThat (subscriber.getOnNextEvents (), hasItems ("1-A", "2-B", "3-C", "4-D", "5-E"));

Prolazimo pored TestSubscriber primjer na a pretplatite se () metoda na uočljivom. Tada možemo ispitati stanje ovog pretplatnika.

TestSubscriber ima nekoliko vrlo korisnih metoda tvrđenja koje ćemo koristiti za potvrđivanje svojih očekivanja. Pretplatnik bi trebao primiti 5 emitiranih elemenata od strane promatrača, a mi to tvrdimo pozivom na assertValueCount () metoda.

Možemo ispitati sve događaje koje je pretplatnik primio pozivom na getOnNextEvents () metoda.

Pozivanje assertCompleted () metoda provjerava je li dovršen tok na koji je promatrač pretplaćen. The assertNoErrors () metoda tvrdi da nije bilo pogrešaka tijekom pretplate na stream.

4. Testiranje očekivanih iznimaka

Ponekad se u našoj obradi, kada promatrač emitira događaje ili promatrač obrađuje događaje, dogodi pogreška. The TestSubscriber ima posebnu metodu za ispitivanje stanja pogrešaka - assertError () metoda koja uzima tip iznimke kao argument:

Slova s ​​popisa = Arrays.asList ("A", "B", "C", "D", "E"); Pretplatnik na TestSubscriber = novi TestSubscriber (); Observable observable = Observable .from (words) .zipWith (Observable.range (1, Integer.MAX_VALUE), ((string, index) -> index + "-" + string)) .concatWith (Observable.error (novi RuntimeException (novi "pogreška u uočljivom"))); observable.subscribe (pretplatnik); pretplatnik.assertError (RuntimeException.class); subscriber.assertNotCompleted ();

Stvaramo opažljivo koje je spojeno s drugim vidljivim pomoću concatWith () metoda. Druga uočljiva baca a RuntimeException dok emitira sljedeći događaj. Vrstu te iznimke možemo ispitati na a TestSubsciber pozivom na assertError () metoda.

Promatrač koji primi pogrešku prestaje s obradom i završava u nedovršenom stanju. To stanje može provjeriti assertNotCompleted () metoda.

5. Testiranje temeljeno na vremenu Uočljiv

Recimo da imamo Uočljiv koji emitira jedan događaj u sekundi i želimo to ponašanje testirati s TestSubsciber.

Možemo definirati vremenski zasnovan Uočljiv koristiti Observable.interval () metoda i položiti a TimeUnit kao argument:

Slova s ​​popisa = Arrays.asList ("A", "B", "C", "D", "E"); TestScheduler planer = novi TestScheduler (); Pretplatnik na TestSubscriber = novi TestSubscriber (); Oznaka uočljiva = Observable.interval (1, TimeUnit.SECONDS, planer); Observable observable = Observable.from (slova) .zipWith (oznaka, (niz, indeks) -> indeks + "-" + niz); observable.subscribeOn (planer) .subscribe (pretplatnik);

The krpelj Observable emitirat će novu vrijednost svake sekunde.

Na početku testa mi smo u trenutku nula, dakle, naš TestSubscriber neće biti dovršeno:

pretplatnik.assertNoValues ​​(); subscriber.assertNotCompleted ();

Da bismo oponašali vrijeme koje prolazi u našem testu, moramo koristiti a TestScheduler razred. Prolazak jedne sekunde možemo simulirati pozivom advanceTimeBy () metoda na a TestScheduler:

planer.advanceTimeBy (1, TimeUnit.SECONDS);

The advanceTimeBy () metoda učinit će vidljivim jedan događaj. Možemo ustvrditi da je jedan događaj nastao pozivom na assertValueCount () metoda:

pretplatnik.assertNoErrors (); pretplatnik.assertValueCount (1); pretplatnik.assertValues ​​("0-A");

Naš popis slova sadrži 5 elemenata, pa kad želimo da promatrač emitira sve događaje, treba proći 6 sekundi obrade. Da bismo oponašali tih 6 sekundi, koristimo advanceTimeTo () metoda:

planer.advanceTimeTo (6, TimeUnit.SECONDS); pretplatnik.assertCompleted (); pretplatnik.assertNoErrors (); pretplatnik.assertValueCount (5); assertThat (subscriber.getOnNextEvents (), hasItems ("0-A", "1-B", "2-C", "3-D", "4-E"));

Nakon oponašanja proteklog vremena, možemo izvršavati tvrdnje na a TestSubscriber. Možemo ustvrditi da su svi događaji proizvedeni pozivom na assertValueCount () metoda.

6. Zaključak

U ovom smo članku ispitali načine testiranja promatrača i promatranih u RxJavi. Razmotrili smo način testiranja emitiranih događaja, pogrešaka i vremenski uočljivih.

Provedbu svih ovih primjera i isječaka koda možete pronaći u projektu GitHub - ovo je Maven projekt, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.


$config[zx-auto] not found$config[zx-overlay] not found