מדריך לבטיחות מנוחה

ג'קסון טופ

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

1. הקדמה

REST-assured תוכנן לפשט את הבדיקה והאימות של ממשקי ה- API של REST ומושפע מאוד מטכניקות בדיקה המשמשות בשפות דינמיות כגון Ruby ו- Groovy.

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

במדריך זה אנו הולכים לחקור את המנוחות ואנחנו נשתמש בהמקסט כדי לבצע קביעה. אם אתה עדיין לא מכיר את Hamcrest, תחילה עליך לצחצח עם המדריך: Testing with Hamcrest.

כמו כן, כדי ללמוד על מקרי שימוש מתקדמים יותר של בטוחים ב- REST, עיין במאמרים האחרים שלנו:

  • סמוך ובטוח עם גרובי
  • אימות סכמת JSON עם מבטיח REST
  • פרמטרים, כותרות ועוגיות עם REST מובטח

עכשיו בואו נצלול פנימה עם דוגמה פשוטה.

2. מבחן דוגמה פשוטה

לפני שנתחיל, בואו נוודא שהבדיקות שלנו כוללות את הייבוא ​​הסטטי הבא:

io.restassured.RestAssured. * io.restassured.matcher.RestAssuredMatchers. * org.hamcrest.Matchers. *

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

עכשיו בואו נתחיל עם הדוגמה הפשוטה - מערכת הימורים בסיסית שחושפת כמה נתונים למשחקים:

{"id": "390", "data": {"leagueId": 35, "homeTeam": "Norway", "visitingTeam": "England",}, "odds": [{"price": "1.30 "," name ":" 1 "}, {" price ":" 5.25 "," name ":" X "}}}

בואו נגיד שזו תגובת JSON מפגיעה בממשק ה- API הפרוס - // localhost: 8080 / אירועים? id = 390. :

בואו עכשיו נשתמש ב- REST בטוח כדי לאמת כמה תכונות מעניינות של התגובה JSON:

@ מבט הריק פומבי שניתןUrl_whenSuccessOnGetsResponseAndJsonHasRequiredKV_thenCorrect () {get ("/ events? Id = 390"). ואז (). StatusCode (200) .assertThat () .body ("data.leagueId", שווה ל- (35)); }

אז מה שעשינו כאן הוא - אימתנו את השיחה לנקודת הסיום / אירועים? id = 390 מגיב בגוף המכיל a מחרוזת JSON של מי leagueId של ה נתונים האובייקט הוא 35.

בואו נסתכל על דוגמא מעניינת יותר. נניח שתרצה לאמת שה- קְטָטָה למערך יש רשומות עם מחירים 1.30 ו 5.25:

@ מבט פומבי בטל שניתןUrl_whenJsonResponseHasArrayWithGivenValuesUnderKey_thenCorrect () {get ("/ events? Id = 390"). ואז (). AssertThat () .body ("odds.price", hasItems ("1.30", "5.25")); }

3. התקנה מובטחת

אם כלי התלות המועדף עליך הוא Maven, אנו מוסיפים את התלות הבאה ב- pom.xml קוֹבֶץ:

 מבחן io. בטוח סמוך ובטוח 3.3.0 

לקבלת הגרסה האחרונה, לחץ על קישור זה.

מבטיח REST מנצל את כוחם של תואמי המיקרסט לבצע את טענותיו, ולכן עלינו לכלול גם את התלות הזו:

 org.hamcrest hamcrest-all 2.1 

הגרסה האחרונה תמיד תהיה זמינה בקישור זה.

4. אימות שורש אנונימי JSON

שקול מערך הכולל פרימיטיבים ולא אובייקטים:

[1, 2, 3]

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

אנו יכולים להפעיל אימות בתרחיש כזה באמצעות ה- $ סמל או מחרוזת ריקה ("") כנתיב. נניח שאנחנו חושפים את השירות הנ"ל באמצעות // localhost: 8080 / json אז נוכל לאמת את זה ככה עם REST בטוח:

כאשר (). get ("/ json"). ואז (). body ("$", hasItems (1, 2, 3));

או ככה:

כאשר (). get ("/ json"). ואז (). body ("", hasItems (1, 2, 3));

5. צפים וזוגות

כאשר אנו מתחילים להשתמש ב- REST בטוח לבדיקת שירותי ה- REST שלנו, עלינו להבין שמספרי נקודות צפות בתגובות JSON ממופים לסוג פרימיטיבי לָצוּף.

השימוש של לָצוּף סוג אינו ניתן להחלפה עם לְהַכפִּיל כפי שקורה לתרחישים רבים בג'אווה.

דוגמא לכך היא תגובה זו:

{"odd": {"price": "1.30", "ck": 12.2, "name": "1"}}

נניח שאנחנו מבצעים את הבדיקה הבאה על הערך של ck:

get ("/ odd"). ואז (). assertThat (). body ("odd.ck", equalTo (12.2));

בדיקה זו תיכשל גם אם הערך שאנו בודקים שווה לערך בתגובה. הסיבה לכך היא שאנחנו משווים ל- a לְהַכפִּיל ולא ל לָצוּף.

כדי שזה יעבוד, עלינו לציין במפורש את האופראנד ל- שווה ל שיטת התאמה כ לָצוּף, ככה:

get ("/ odd"). ואז (). assertThat (). body ("odd.ck", equalTo (12.2f));

6. ציון שיטת הבקשה

בדרך כלל היינו מבצעים בקשה על ידי קריאה לשיטה כגון לקבל(), המתאים לשיטת הבקשה בה אנו רוצים להשתמש.

בנוסף, אנו יכולים גם לציין את הפועל HTTP באמצעות בַּקָשָׁה() שיטה:

@ מבחן ציבורי בטל כאשר RequestGet_thenOK () {when (). בקשה ("GET", "/users/eugenp").then().statusCode(200); }

הדוגמה לעיל מקבילה לשימוש לקבל() באופן ישיר.

באופן דומה, אנו יכולים לשלוח רֹאשׁ, לְחַבֵּר ו אפשרויות בקשות:

@ מבחן פומבי בטל כאשר RequestHead_thenOK () {when (). בקשה ("HEAD", "/users/eugenp").then().statusCode(200); }

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

לכן, ליצור חדש מוזר על ידי שליחת הודעה בַּקָשָׁה:

@ מבחן פומבי בטל כאשר RequestPost_thenCreated () {עם (). Body (חדש מוזר (5.25f, 1, 13.1f, "X")). When () .request ("POST", "/ odds / new") .then () .statusCode (201); }

ה מוזר האובייקט נשלח בתור גוּף יומר אוטומטית ל- JSON. אנחנו יכולים גם לעבור כל אחד מהם חוּט שאנחנו רוצים לשלוח כשלנו הודעהגוּף.

7. תצורת ערכי ברירת מחדל

אנו יכולים להגדיר הרבה ערכי ברירת מחדל לבדיקות:

@ לפני התקנת הריק הציבורי () {RestAssured.baseURI = "//api.github.com"; RestAssured.port = 443; }

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

הערה: אנו יכולים לאפס גם לברירות המחדל הסטנדרטיות המובטחות על ידי REST באמצעות:

RestAssured.reset ();

8. מדוד את זמן התגובה

בואו נראה איך אנחנו יכולים למדוד את זמן התגובה באמצעות זְמַן() ו timeIn () שיטות של תְגוּבָה לְהִתְנַגֵד:

@ מבחן ציבורי בטל whenMeasureResponseTime_thenOK () {תגובה תגובה = RestAssured.get ("/ משתמשים / eugenp"); longtimeInMS = response.time (); longtimeInS = response.timeIn (TimeUnit.SECONDS); assertEquals (timeInS, timeInMS / 1000); }

ציין זאת:

  • זְמַן() משמש לקבלת זמן תגובה באלפיות השנייה
  • timeIn () משמש לקבלת זמן תגובה ביחידת הזמן שצוינה

8.1. אמת את זמן התגובה

אנו יכולים לאמת את זמן התגובה - באלפיות השנייה - בעזרת פשוט ארוךהתאמה:

@Test הציבור בטל כאשרValidateResponseTime_thenSuccess () {כאשר (). קבל ("/ משתמשים / eugenp"). ואז (). זמן (lessThan (5000L)); }

אם אנו רוצים לאמת את זמן התגובה ביחידת זמן אחרת, נשתמש ב- זְמַן() שידוך עם שנייה TimeUnit פָּרָמֶטֶר:

@ מבחן ציבורי בטל כאשרValidateResponseTimeInSeconds_thenSuccess () {when (). Get ("/ users / eugenp"). ואז (). Time (lessThan (5L), TimeUnit.SECONDS); }

9. אימות תגובת XML

לא רק שהיא יכולה לאמת תגובת JSON, היא יכולה לאמת גם את ה- XML.

נניח שאנחנו מגישים בקשה // localhost: 8080 / עובדים ואנחנו מקבלים את התגובה הבאה:

  ג'יין דייזי f 

אנו יכולים לאמת שה- שם פרטי הוא ג'יין ככה:

@ מבחן הריק פומבי שניתןUrl_whenXmlResponseValueTestsEqual_thenCorrect () {פוסט ("/ עובדים"). ואז (). AssertThat (). גוף ("עובדים.עובד.ראשית-שם", שווה ל ("ג'יין")); }

אנו יכולים גם לאמת שכל הערכים תואמים לערכים הצפויים שלנו על ידי שרשור התאמות גוף יחד כך:

@ מבחן חלל ציבורי שניתןUrl_whenMultipleXmlValuesTestEqual_thenCorrect () {פוסט ("/ עובדים"). ואז (). AssertThat (). גוף ("עובדים.עובד.ראשון", שווה ל ("ג'יין")). גוף ("עובדים.עובד . last-name ", equalTo (" Daisy ")) .body (" עובדים.עובד.sex ", equalTo (" f ")); }

או להשתמש בגרסת הקצר עם ארגומנטים משתנים:

@Test הציבור בטל שניתןUrl_whenMultipleXmlValuesTestEqualInShortHand_thenCorrect () {פוסט ("/ עובדים"). ואז (). AssertThat (). גוף ("עובדים.עובד.ראשית שם", שווה ל ("ג'יין"), "עובדים. name ", equalTo (" Daisy ")," workers.employee.sex ", equalTo (" f ")); }

10. XPath עבור XML

אנו יכולים גם לאמת את התגובות שלנו באמצעות XPath. שקול את הדוגמה שלהלן שמבצעת התאמה ב- שם פרטי:

@Test public void givenUrl_whenValidatesXmlUsingXpath_thenCorrect () {post ("/ workers"). ואז (). AssertThat (). גוף (hasXPath ("/ עובדים / עובד / שם פרטי", containString ("Ja"))); }

XPath גם מקבל דרך חלופית להפעלת ה- שווה ל שידוך:

@ מבחן חלל ציבורי שניתןUrl_whenValidatesXmlUsingXpath2_thenCorrect () {פוסט ("/ עובדים"). ואז (). AssertThat () .body (hasXPath ("/ עובדים / עובד / שם פרטי [text () = 'ג'יין']")); }

11. פרטי בדיקת רישום

11.1. פרטי בקשת יומן רישום

ראשית, בואו נראה איך רשום את פרטי הבקשה המלאה באמצעות יומן (). הכל ():

@ מבחן ציבורי בטל כאשר LogRequest_thenOK () {נתון (). יומן (). הכל (). כאשר (). קבל ("/ משתמשים / eugenp"). ואז (). StatusCode (200); }

פעולה זו תרשום משהו כזה:

שיטת בקשה: GET בקשת URI: //api.github.com:443/users/eugenp פרוקסי: בקש פראמרים: שאילתות פראמריות: טופס פראמסים: מסלולי נתיב: מרובות חלקים: כותרות: קבל = * / * עוגיות: גוף 

כדי לרשום רק חלקים ספציפיים בבקשה, יש לנו את עֵץ() שיטה בשילוב עם params (), body (), headers (), cookies (), method (), path () לְמָשָׁל log. (). params ().

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

11.2. פרטי תגובת יומן

באופן דומה, אנו יכולים לרשום את פרטי התגובה.

בדוגמה הבאה אנו רושמים את גוף התגובה בלבד:

@ מבחן ציבורי בטל כאשר LogResponse_thenOK () {מתי (). קבל ("/ repos / eugenp / tutorials") .then (). Log (). Body (). StatusCode (200); }

פלט לדוגמא:

{"id": 9754983, "name": "tutorials", "full_name": "eugenp / tutorials", "private": false, "html_url": "//github.com/eugenp/tutorials", "description" : "הקורס \" REST עם אביב \ "קורס:", "מזלג": false, "size": 72371, "license": {"key": "mit", "name": "MIT License", "spdx_id ":" MIT "," url ":" //api.github.com/licenses/mit "}, ...}

11.3. תגובת יומן אם התרחש מצב

יש לנו גם אפשרות לרשום את התגובה רק אם אירעה שגיאה או שקוד המצב תואם לערך נתון:

@ מבחן ציבורי בטל כאשרLogResponseIfErrorOccurred_thenSuccess () {when (). Get ("/ users / eugenp") .then (). Log (). IfError (); כאשר (). get ("/ users / eugenp") .then (). log (). ifStatusCodeIsEqualTo (500); כאשר (). get ("/ users / eugenp") .then (). log (). ifStatusCodeMatches (greaterThan (200)); }

11.4. היכנס אם האימות נכשל

אנחנו יכולים גם לרשום בקשה ותגובה רק אם האימות שלנו נכשל:

@ מבחן ציבורי בטל כאשרLogOnlyIfValidationFailed_thenSuccess () {when (). Get ("/ users / eugenp") .then (). Log (). IfValidationFails (). StatusCode (200); נתון (). יומן (). ifValidationFails (). When (). get ("/ משתמשים / eugenp") .then (). statusCode (200); }

בדוגמה זו, אנו רוצים לאמת שקוד הסטטוס הוא 200. רק אם זה נכשל, הבקשה והתגובה יירשמו.

12. מסקנה

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

את היישום המלא של כל הדוגמאות וקטעי הקוד ניתן למצוא בפרויקט GitHub המובטח על ידי REST.

תחתון ג'קסון

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס