Hogyan teszteljük az RxJava-t?
1. Áttekintés
Ebben a cikkben megvizsgáljuk az RxJava használatával írt kód tesztelési módjait.
Az RxJava-val létrehozott tipikus áramlás egy Megfigyelhető és egy Megfigyelő. A megfigyelhető adatforrás, amely elemsorozat. Egy vagy több megfigyelő feliratkozik rá a kibocsátott események fogadására.
Jellemzően a megfigyelőt és a megfigyelhetőeket külön szálakban hajtják végre aszinkron módon - ez megnehezíti a kód hagyományos tesztelését.
Szerencsére, Az RxJava a TestSubscriber osztály, amely lehetővé teszi számunkra az aszinkron, eseményvezérelt áramlás tesztelését.
2. Az RxJava tesztelése - a hagyományos módszer
Kezdjük egy példával - van egy betűsorunk, amelyet össze akarunk pakolni 1-től kezdődő egész számok sorozatával.
Tesztünknek azt kell állítania, hogy egy előfizető, aki meghallgatja a cipzárral megfigyelhető, által kibocsátott eseményeket, egész számokkal cipzárolt betűket kap.
Egy ilyen teszt hagyományos módon történő megírása azt jelenti, hogy vezetnünk kell az eredmények listáját, és ezt a listát egy megfigyelőtől frissítenünk kell. Az elemek hozzáadása az egész számok listájához azt jelenti, hogy a megfigyelhető és a megfigyelőknek ugyanabban a szálban kell dolgozniuk - nem tudnak aszinkron módon működni.
Így hiányozna az RxJava egyik legnagyobb előnye - az események külön szálakban történő feldolgozása.
Így néz ki a teszt korlátozott verziója:
Lista betűk = Arrays.asList ("A", "B", "C", "D", "E"); Eredménylista = new ArrayList (); Megfigyelhető megfigyelhető = Megfigyelhető .from (betűk) .zipWith (Megfigyelhető.tartomány (1, Egész.MAX_VALUE), (karakterlánc, index) -> index + "-" + karakterlánc); megfigyelhető.feliratkozás (eredmények :: hozzáadás); assertThat (results, notNullValue ()); assertThat (eredmények, hasSize (5)); assertThat (eredmények, hasItems ("1-A", "2-B", "3-C", "4-D", "5-E");
Összegezzük egy megfigyelő eredményeit azáltal, hogy elemeket adunk a eredmények lista. A megfigyelő és a megfigyelhető munka ugyanabban a szálban, így állításunk megfelelően blokkol és várja a Iratkozz fel() módszer a befejezéshez.
3. Az RxJava tesztelése a TestSubscriber
RxJava jön a TestSubsriber osztály, amely lehetővé teszi számunkra az események aszinkron feldolgozásával működő tesztek írását. Ez egy normális megfigyelő, aki feliratkozik a megfigyelhetőre.
Egy teszt során megvizsgálhatjuk az a állapotát TestSubscriber és állításokat tegyen erről az állapotról:
Lista betűk = Arrays.asList ("A", "B", "C", "D", "E"); TestSubscriber előfizető = new TestSubscriber (); Megfigyelhető megfigyelhető = Megfigyelhető .from (betűkből) .zipWith (Megfigyelhető.tartomány (1, Egész.MAX_VALUE), ((karakterlánc, index) -> index + "-" + karakterlánc)); megfigyelhető.feliratkozás (előfizető); subscriber.assertCompleted (); subscriber.assertNoErrors (); subscriber.assertValueCount (5); assertThat (előfizető.getOnNextEvents (), hasItems ("1-A", "2-B", "3-C", "4-D", "5-E");
Elhaladunk a TestSubscriber példány a Iratkozz fel() módszer a megfigyelhető. Ezután megvizsgálhatjuk az előfizető állapotát.
TestSubscriber nagyon hasznos állítási módszerekkel rendelkezik hogy felhasználjuk az elvárásaink érvényesítésére. Az előfizetőnek 5 kibocsátott elemet kell kapnia egy megfigyelőtől, és mi ezt állítjuk a assertValueCount () módszer.
Megvizsgálhatunk minden olyan eseményt, amelyet az előfizető a getOnNextEvents () módszer.
Felhívás a assertCompleted () A módszer ellenőrzi, hogy befejeződött-e egy adatfolyam, amelyre a megfigyelő feliratkozott. A assertNoErrors () A módszer azt állítja, hogy nem voltak hibák a folyamra való feliratkozás során.
4. A várható kivételek tesztelése
Néha feldolgozásunk során hiba lép fel, amikor egy megfigyelhető eseményeket bocsát ki, vagy egy megfigyelő feldolgozza az eseményeket. A TestSubscriber rendelkezik egy speciális módszerrel a hibaállapot vizsgálatára - a assertError () metódus, amely a kivétel típusát veszi érvként:
Lista betűk = Arrays.asList ("A", "B", "C", "D", "E"); TestSubscriber előfizető = new TestSubscriber (); Megfigyelhető megfigyelhető = Figyelhető. "hiba a megfigyelhetőben"))); megfigyelhető.feliratkozás (előfizető); subscriber.assertError (RuntimeException.class); subscriber.assertNotCompleted ();
Létrehozzuk azt a megfigyelhetőt, amely összekapcsolódik egy másik megfigyelhetővel a concatWith () módszer. A második megfigyelhető dobás a RuntimeException miközben kibocsátja a következő eseményt. Megvizsgálhatjuk a kivétel egy típusát a TestSubsciber felhívásával a assertError () módszer.
A hibát kapó megfigyelő leállítja a feldolgozást és befejezetlen állapotba kerül. Ezt az állapotot a assertNotCompleted () módszer.
5. Időalapú tesztelés Megfigyelhető
Tegyük fel, hogy van egy Megfigyelhető amely másodpercenként egy eseményt bocsát ki, és ezt a viselkedést a TestSubsciber.
Meghatározhatunk időalapú Megfigyelhető használni a Observable.interval () módszer és adja át a TimeUnit érvként:
Lista betűk = Arrays.asList ("A", "B", "C", "D", "E"); TestScheduler ütemező = új TestScheduler (); TestSubscriber előfizető = new TestSubscriber (); Megfigyelhető pipa = Megfigyelhető.interval (1, TimeUnit.SECONDS, ütemező); Megfigyelhető megfigyelhető = Megfigyelhető.-tól (betűk) .zipWith (pipa, (karakterlánc, index) -> index + "-" + karakterlánc); megfigyelhető.subscribeOn (ütemező) .subscribe (előfizető);
A ketyegés a megfigyelhető másodpercenként új értéket bocsát ki.
A teszt elején a nulla időpontban vagyunk, tehát a mi TestSubscriber nem készül el:
előfizető.assertNoValues (); subscriber.assertNotCompleted ();
A tesztünk során eltelt idő utánzásához használnunk kell a TestScheduler osztály. Szimulálhatjuk azt az egy másodperces áthaladást a avatarTimeBy () módszer a TestScheduler:
ütemező.advanceTimeBy (1, TimeUnit.SECONDS);
A avanceTimeBy () módszerrel megfigyelhető lesz egy esemény. Azt állíthatjuk, hogy egy eseményt egy assertValueCount () módszer:
subscriber.assertNoErrors (); subscriber.assertValueCount (1); subscriber.assertValues ("0-A");
A mi listánk leveleket 5 elem van benne, tehát amikor megfigyelhetõvé akarjuk tenni az összes esemény kibocsátását, 6 másodperc feldolgozásnak kell eltelnie. A 6 másodperc utánzásához a advanceTimeTo () módszer:
ütemező.advanceTimeTo (6, TimeUnit.SECONDS); subscriber.assertCompleted (); subscriber.assertNoErrors (); subscriber.assertValueCount (5); assertThat (előfizető.getOnNextEvents (), hasItems ("0-A", "1-B", "2-C", "3-D", "4-E");
Az eltelt idő utánzása után állításokat hajthatunk végre a TestSubscriber. Azt állíthatjuk, hogy az összes esemény a assertValueCount () módszer.
6. Következtetés
Ebben a cikkben megvizsgáltuk a megfigyelők és megfigyelhetőek tesztelési módszereit az RxJava-ban. Megvizsgáltuk a kibocsátott események, hibák és időalapú megfigyelhetőség tesztelésének módját.
Ezeknek a példáknak és kódrészleteknek a megvalósítása megtalálható a GitHub projektben - ez egy Maven projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.