כיצד לבדוק את RxJava?

1. סקירה כללית

במאמר זה נבחן דרכים לבדיקת קוד שנכתב באמצעות RxJava.

הזרימה האופיינית שאנו יוצרים עם RxJava מורכבת מ- נצפה ו מַשׁקִיף. הנצפה הוא מקור לנתונים המהווים רצף של אלמנטים. אחד או יותר משקיפים מנויים עליו לקבלת אירועים שנפלטו.

בדרך כלל, הצופה והתצפיות מבוצעות בשרשור נפרד באופן אסינכרוני - מה שמקשה על הקוד בצורה מסורתית.

לְמַרְבֶּה הַמַזָל, RxJava מספקת TestSubscriber מחלקה המעניקה לנו את היכולת לבדוק זרימה אסינכרונית ומונעת אירועים.

2. בדיקת RxJava - הדרך המסורתית

נתחיל בדוגמא - יש לנו רצף של אותיות שאנחנו רוצים לרכוס ברצף של מספרים שלמים מ -1 כולל.

הבדיקה שלנו צריכה לקבוע כי מנוי שמאזין לאירועים שנפלטים על ידי תצפית מרוכזת מקבל אותיות מרוכזות במספרים שלמים.

כתיבת מבחן כזה בצורה מסורתית פירושה שעלינו לשמור רשימת תוצאות ולעדכן את הרשימה ממשקיף. הוספת אלמנטים לרשימת מספרים שלמים פירושה שהתצפיתנים והמתבוננים שלנו צריכים לעבוד באותו שרשור - הם לא יכולים לעבוד בצורה אסינכרונית.

וכך יחסר לנו אחד היתרונות הגדולים ביותר של RxJava - עיבוד אירועים בשרשורים נפרדים.

הנה איך תיראה אותה גרסה מוגבלת של הבדיקה:

אותיות רשימה = Arrays.asList ("A", "B", "C", "D", "E"); תוצאות רשימה = ArrayList חדש (); נצפה נצפה = נצפה. מ (אותיות). ZipWith (Observable.range (1, Integer.MAX_VALUE), (מחרוזת, אינדקס) -> אינדקס + "-" + מחרוזת); observable.subscribe (תוצאות :: הוסף); assertThat (תוצאות, notNullValue ()); assertThat (תוצאות, יש גודל (5)); assertThat (תוצאות, hasItems ("1-A", "2-B", "3-C", "4-D", "5-E"));

אנו צוברים תוצאות מתצפית על ידי הוספת אלמנטים ל- a תוצאות רשימה. המתבונן והמתבונן עובדים באותו חוט כך שהקביעה שלנו נחסמת כראוי ומחכה ל- הירשם () שיטה לסיום.

3. בדיקת RxJava באמצעות TestSubscriber

RxJava מגיע עם TestSubsriber בכיתה המאפשרת לנו לכתוב מבחנים שעובדים עם עיבוד אסינכרוני של אירועים. זהו צופה רגיל המנוי לצפייה.

במבחן נוכל לבחון את מצבו של א TestSubscriber ולהצהיר על מדינה זו:

אותיות רשימה = Arrays.asList ("A", "B", "C", "D", "E"); מנוי TestSubscriber = חדש TestSubscriber (); נצפה נצפה = נצפה. מאת (אותיות) .zipWith (Observable.range (1, Integer.MAX_VALUE), ((מחרוזת, אינדקס) -> אינדקס + "-" + מחרוזת)); לצפייה. מנוי (מנוי); subscriber.assertCompleted (); subscriber.assertNoErrors (); subscriber.assertValueCount (5); assertThat (subscriber.getOnNextEvents (), hasItems ("1-A", "2-B", "3-C", "4-D", "5-E"));

אנחנו עוברים א TestSubscriber מופע לא הירשם () שיטה על הנצפה. אז נוכל לבחון את מצבו של מנוי זה.

TestSubscriber יש כמה שיטות קביעה שימושיות מאוד שבה נשתמש כדי לאמת את הציפיות שלנו. על המנוי לקבל 5 אלמנטים שנפלטו על ידי צופה ואנו טוענים כי על ידי קריאה ל assertValueCount () שיטה.

אנו יכולים לבחון את כל האירועים שקיבל מנוי על ידי התקשרות ל getOnNextEvents () שיטה.

קורא ל assertCompleted () שיטה בודקת אם הושלם זרם אליו צופה מנוי. ה assertNoErrors () השיטה טוענת כי לא היו שגיאות במהלך המנוי לזרם.

4. בדיקת חריגים צפויים

לפעמים בעיבוד שלנו, כאשר נצפה הוא פולט אירועים או צופה מעבד אירועים, מתרחשת שגיאה. ה TestSubscriber יש שיטה מיוחדת לבחינת מצב שגיאה - assertError () שיטה שלוקחת את סוג החריג כטיעון:

אותיות רשימה = Arrays.asList ("A", "B", "C", "D", "E"); מנוי TestSubscriber = חדש TestSubscriber (); נצפה נצפה = נצפה. מ (אותיות). ZipWith (Observable.range (1, Integer.MAX_VALUE), ((מחרוזת, אינדקס) -> אינדקס + "-" + מחרוזת)) .concatWith (Observable.error (RuntimeException חדש) "שגיאה בתצפית"))); לצפייה. מנוי (מנוי); subscriber.assertError (RuntimeException.class); subscriber.assertNotCompleted ();

אנו יוצרים את הנצפה שמצטרף לצפייה אחרת באמצעות ה- concatWith () שיטה. השני שנצפה זורק א חריגת זמן ריצה תוך כדי פליטת האירוע הבא. אנו יכולים לבחון סוג של חריג זה ב- TestSubsciber על ידי קריאה ל assertError () שיטה.

הצופה שמקבל שגיאה מפסיק את העיבוד ומסתיים במצב שלא הושלם. ניתן לבדוק את המצב הזה על ידי assertNotCompleted () שיטה.

5. בדיקה מבוססת זמן נצפה

בואו נגיד שיש לנו נצפה שפולט אירוע אחד בשנייה ואנחנו רוצים לבדוק את ההתנהגות הזו עם TestSubsciber.

אנו יכולים להגדיר זמן מבוסס נצפה משתמש ב Observable.interval () שיטה ולהעביר א TimeUnit כטיעון:

אותיות רשימה = Arrays.asList ("A", "B", "C", "D", "E"); מתזמן TestScheduler = TestScheduler חדש (); מנוי TestSubscriber = חדש TestSubscriber (); סמן נצפה = Observable.interval (1, TimeUnit.SECONDS, מתזמן); נצפה נצפה = Observable.from (אותיות) .zipWith (סמן, (מחרוזת, אינדקס) -> אינדקס + "-" + מחרוזת); observable.subscribeOn (מתזמן). subscribe (מנוי);

ה תִקתוּק נצפה יפלט ערך חדש בכל שנייה.

בתחילת מבחן אנחנו בזמן אפס, אז שלנו TestSubscriber לא יושלם:

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

כדי לחקות את הזמן שעובר במבחן שלנו עלינו להשתמש ב- TestScheduler מעמד. אנו יכולים לדמות את המעבר של שנייה על ידי קריאה ל advanceTimeBy () שיטה על א TestScheduler:

scheduler.advanceTimeBy (1, TimeUnit.SECONDS);

ה advanceTimeBy () השיטה תהפוך אירוע אחד לצפייה. אנו יכולים לטעון כי אירוע אחד הופק על ידי קריאה ל- assertValueCount () שיטה:

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

הרשימה שלנו אותיות יש בו 5 אלמנטים ולכן כאשר אנו רוצים לגרום לצפייה לפלוט את כל האירועים, 6 שניות עיבוד צריכות לעבור. כדי לחקות את שש השניות האלה, אנו משתמשים ב- advanceTimeTo () שיטה:

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

לאחר חיקוי הזמן שעבר, נוכל לבצע קביעות על א TestSubscriber. אנו יכולים לטעון כי כל האירועים הופקו באמצעות קריאה ל assertValueCount () שיטה.

6. מסקנה

במאמר זה, בחנו דרכים לבדיקת משקיפים ונצפים ב- RxJava. בדקנו דרך לבחון אירועים נפלטים, שגיאות ותצפיות מבוססות זמן.

ניתן למצוא את היישום של כל הדוגמאות וקטעי הקוד בפרויקט GitHub - זהו פרויקט Maven, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.


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