מבוא לחוזה ענן האביב

1. הקדמה

Spring Cloud Contract הוא פרויקט שבאופן פשוט, עוזר לנו לכתוב חוזים מונחים על ידי הצרכן (CDC).

זה מבטיח את החוזה בין א יַצרָן ו צרכן, במערכת מבוזרת - הן עבור אינטראקציות מבוססות HTTP והן על סמך אינטראקציות.

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

2. מפיק - צד השרת

אנחנו הולכים לכתוב CDC בצד המפיק, בצורה של EvenOddController - שמספר רק אם מספר הפרמטר הוא שווה או אי זוגי:

@RestController מחלקה ציבורית EvenOddController {@GetMapping ("/ validate / prime-number") מחרוזת ציבורית isNumberPrime (@RequestParam ("number") מספר שלם) {return Integer.parseInt (number)% 2 == 0? "זוגי אי - זוגי"; }}

2.1. תלות Maven

לצד המפיק שלנו נצטרך את אביב-ענן-מתנע-חוזה-מאמת תלות:

 org.springframework.cloud spring-cloud-starter-contract-verifier verifier 2.1.1.RELEASE test 

ונצטרך להגדיר אביב-ענן-חוזה-maven-plugin עם שם מחלקת הבדיקה הבסיסית שלנו, שתיארנו בסעיף הבא:

 org.springframework.cloud spring-cloud-contract-maven-plugin 2.1.1.RELEASE com com.baeldung.spring.cloud.springcloudcontractproducer.BaseTestClass 

2.2. מערך צד של המפיק

עלינו להוסיף כיתת בסיס בחבילת הבדיקה הטוענת את הקשר האביב שלנו:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = SpringBootTest.WebEnvironment.MOCK) @DirtiesContext @ AutoConfigureMessageVerifier מחלקה ציבורית BaseTestClass {@ ממונע פרטי EvenOddController אפילוOddController; @ לפני התקנת החלל הציבורי () {StandaloneMockMvcBuilder standaloneMockMvcBuilder = MockMvcBuilders.standaloneSetup (evenOddController); RestAssuredMockMvc.standaloneSetup (standaloneMockMvcBuilder); }}

בתוך ה / src / test / משאבים / חוזים / חבילה, נוסיף את תאי הבדיקה, כמו זה בקובץ shouldReturnEvenWhenRequestParamIsEven.groovy:

יבוא org.springframework.cloud.contract.spec.Contract Contract.make {תיאור "אמור לחזור גם כאשר קלט המספר הוא אפילו" בקשה {method GET () url ("/ validate / prime-number") {queryParameters {parameter (" מספר "," 2 ")}}} תגובה {גוף (" אפילו ") 200}} 

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

שמות שיטות הבדיקה נגזרים מהקידומת "לְאַמֵת_" משורשר עם שמות תאי הבדיקה הגרוביים שלנו. עבור קובץ Groovy הנ"ל, שם השיטה שנוצר יהיה "Validate_shouldReturnEvenWhenRequestParamIsEven".

בואו נסתכל על מחלקת הבדיקה שנוצרה אוטומטית:

class class ContractVerifierTest מרחיב את BaseTestClass {@Test public void validate_shouldReturnEvenWhenRequestParamIsEven () זורק חריג {// נתון: MockMvcRequestSpecification בקשה = נתון (); // מתי: ResponseOptions response = given (). spec (בקשה). queryParam ("number", "2") .get ("/ validate / prime-number"); // ואז: assertThat (response.statusCode ()). isEqualTo (200); // ו-: String responseBody = response.getBody (). asString (); assertThat (responseBody) .isEqualTo ("אפילו"); } 

המבנה יוסיף גם את צנצנת הדל במאגר Maven המקומי שלנו, כך שהוא יוכל לשמש את הצרכן שלנו.

תלויים יהיו בתיקיית הפלט תחת תלים / מיפוי /.

3. צרכן - צד הלקוח

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

נוסיף BasicMathController, אשר תגיש בקשת HTTP לקבלת התגובה מהסטובים שנוצרו:

@RestController מחלקה ציבורית BasicMathController {@Autowired פרטי RestTemplate restTemplate; @GetMapping ("/ calc") ציבורי מחרוזת checkOddAndEven (@RequestParam ("number") מספר שלם) {HttpHeaders httpHeaders = HttpHeaders חדש (); httpHeaders.add ("סוג תוכן", "application / json"); ResponseEntity responseEntity = restTemplate.exchange ("// localhost: 8090 / validate / prime-number? Number =" + number, HttpMethod.GET, HttpEntity חדש (httpHeaders), String.class); return responseEntity.getBody (); }}

3.1. התלות של Maven

עבור הצרכן שלנו, נצטרך להוסיף את ה- אביב-ענן-חוזה-wiremock ו אביב-ענן-חוזה-בדל-רץ תלות:

 org.springframework.cloud אביב-ענן-חוזה-wiremock 2.1.1.בדיקת שחרור org.springframework.cloud אביב-ענן-חוזה-stub-runner 2.1.1.בדיקת שחרור 

3.2. הגדרת צד הצרכן

עכשיו הגיע הזמן להגדיר את רץ הבדים שלנו, שיידע את הצרכן שלנו בנושאים הזמינים במאגר Maven המקומי שלנו:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = SpringBootTest.WebEnvironment.MOCK) @AutoConfigureMockMvc @AutoConfigureJsonTesters @AutoConfigureStubRunner (stubsMode = StubRunnerProperties.StubsMode.LOC. מפיק: +: stubs: 8090 ") מחלקה ציבורית BasicMathControllerIntegrationTest {@ MowMvc פרטי mowMvc פרטי; @Test ציבורי בטל given_WhenPassEvenNumberInQueryParam_ThenReturnEven () זורק חריגה {mockMvc.perform (MockMvcRequestBuilders.get ("/ לחשב? מספר = 2") .contentType (MediaType.APPLICATION_JSON))) .andExpect (. (). מיתר ("אפילו")); }}

שים לב שה- מזהים הקניין של @ AutoConfigureStubRunner ביאור מציין:

  • com.baeldung.spring.cloud - ה groupId של החפץ שלנו
  • אביב-ענן-חוזה-מפיק - ה artifactId של צנצנת בדל המפיק
  • 8090 - הנמל שעליו יפעלו הבדים שנוצרו

4. כאשר החוזה נשבר

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

לדוגמה, נניח שנשנה את ה- EvenOddController לבקש URI ל / לאמת / לשנות / מספר ראשוני בצד המפיק שלנו.

אם לא ניידע את הצרכן שלנו על שינוי זה, הצרכן עדיין ישלח את בקשתו ל / אמת / מספר ראשוני URI, ומקרי הבדיקה בצד הצרכן יזרקו org.springframework.web.client.HttpClientErrorException: 404 לא נמצא.

5. סיכום

ראינו כיצד Spring Cloud Contract יכול לעזור לנו לקיים חוזים בין צרכן שירות למפיק, כך שנוכל לדחוף קוד חדש בלי לדאוג להפר את החוזים.

וכמו תמיד, ניתן למצוא את היישום המלא של מדריך זה ב- GitHub.


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