Middle+
խոսեք միկրոսերվիսի պայմանագրային թեստավորման մասին։
sobes.tech AI
Պատասխան AI-ից
Կոնտակտային թեստավորումը կենտրոնացած է միկրոսերվիսների փոխազդեցության ստուգման վրա նրանց API (կոնտակտ) մակարդակում: Մտադրությունը՝ համոզվել, որ սպառողը (ծառայություն, որը օգտագործում է API-ն) և մատակարարն (ծառայություն, որը տրամադրում է API-ն) պահպանում են որոշակի "կոնտակտ" (հարցման/պատասխանների սխեմա, տվյալների ձևաչափ, սպասումներ):
Հիմնական սկզբունքներ՝
- Սպառող-ուղղորդված: Թեստերը հիմնված են սպառողի սպասումներին: Սպառողը որոշում է, թե ինչ տվյալներ և ձևաչափեր է անհրաժեշտ:
- Երկկողմանի թեստավորում: Ստուգվում է, թե ինչպես է սպառողի կողմը (կարող է աշխատել ներկայիս կոնտակտով), այնպես էլ մատակարարի կողմը (համապատասխան է նրա իրականացմանը սպառողի սպասումներին):
- Արագություն: Թեստերը արագ են կատարվում, հաճախ՝ CI/CD շղթայի շրջանակներում, քանի որ դրանք չեն պահանջում բոլոր կախված ծառայությունների տեղադրում:
Ընթացակարգը սովորաբար ներառում է՝
- Սպառողը ստեղծում է թեստեր, որոնք նկարագրում են իր սպասումները մատակարարի API-ից: Այս թեստերը ստեղծում են "կոնտակտ":
- Կոնտակտը հրապարակվում է (օրինակ՝ կենտրոնական պահոցում):
- Մատակարարը օգտագործում է հրապարակված կոնտակտը իր API-ի իրականացման վավերացման համար: Նա գործարկում է թեստեր (հաճախ՝ մատակարարի կողմից), որոնք ստուգում են, արդյոք նրա API-ն համապատասխանում է կոնտակտին:
- Եթե սպառողի սպասումներն ու մատակարարի իրականացումը չեն համընկնում, թեստը ձախողվում է՝ նշելով կոնտակտի խախտում:
Գործիքներ՝
- Pact (ամենահաճախ օգտագործվող)
- Spring Cloud Contract
- Swagger/OpenAPI և վավերացման գործիքներ
Առավելություններ՝
- Արագ հայտնաբերում սխալների՝ ինտեգրման ժամանակ՝ խնդիրները հայտնաբերվում են նախքան տեղադրումը:
- Համակցային թեստերի անհրաժեշտության նվազեցում: նվազեցնում է բարդ և դանդաղ ամբողջական թեստերի կախվածությունը:
- Անվտանգ թեստավորում: հնարավորություն է տալիս թեստավորել ծառայությունները անկախ մեկը մյուսից:
- Սպասումների հստակ սահմանում: հստակ սահմանում է կոնտակտը ծառայությունների միջև:
Անբավարարություններ՝
- Չի փոխարինում ամբողջական ինտեգրացիոն թեստերին (միայն ստուգում է API մակարդակով փոխազդեցությունը):
- Պահանջում է կոնտակտների վերսիաների վերահսկում՝ դիսցիպլինա:
- Կարող է ավելի բարդ լինել շատ բարդ կոնտակտներով ծառայությունների համար:
Օրինակ՝ Pact-ի օգտագործմամբ՝
- Սպառողը (օրինակ՝
Order Service) օգտագործում է Pact գրադարանը՝ ստեղծելու սպառողի կողմի թեստեր:// Սպառողի թեստի օրինակ Pact JVM-ով @ExtendWith(PactConsumerTestExt.class) @PactTestFor(providerName = "ProductService", port = "8080") public class ProductServiceContractTest { @Pact(consumer = "OrderService") public RequestResponsePact createPact(PactDslWithRequest r) { return r.given("a product with id 1 exists") .uponReceiving("a request for product by id") .path("/products/1") .method("GET") .willRespondWith() .status(200) .headers(Map.of("Content-Type", "application/json")) .body(new PactDslJsonBody() .stringValue("id", "1") .stringValue("name", "Laptop") .numberType("price", 1200.00)) .toPact(); } @Test void testGetProductById(MockServer mockServer) throws IOException { // API-ի կանչի տրամաբանություն՝ օգտագործելով mockServer // Ստուգում՝ արդյոք սպառողը ճիշտ է մշակել mock-պատասխանը HttpResponse response = Request.Get(mockServer.getUrl() + "/products/1").execute().returnResponse(); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); } } - Սպառողի թեստերի իրականացման ժամանակ ստեղծվում է կոնտակտային ֆայլ (
.json): - Այս ֆայլը հրապարակվում է Pact Broker կամ այլ կենտրոնական պահոց:
- Մատակարարը օգտագործում է Pact գրադարանը (օրինակ՝ Pact Provider Verifier)՝ իր API-ի իրականացման վավերացման համար՝ ստացված կոնտակտից:
// Մատակարարի թեստի օրինակ Pact Provider Verifier-ով @Provider("ProductService") @PactFolder("relative/path/to/pacts") // կամ Pact Broker public class ProductServiceVerificationTest { @TestTemplate @ExtendWith(PactVerificationInvocationContextProvider.class) public void verifyPact(PactVerificationContext context) { context.verifyInteraction(); } @State("a product with id 1 exists") public void productWithId1Exists() { // Տվյալների նախապատրաստման տրամաբանություն՝ ծառայության համար } // Տեղադրեք ծառայության URL՝ որտեղ աշխատում է թեստավորող ծառայությունը @BeforeEach void beforeEach(PactVerificationContext context) { context.setTarget(new HttpTestTarget("localhost", 8080)); } } - Մատակարարի կողմից վավերիչը իրական API-ին կանչում է կոնտակտի համաձայն՝ համեմատելով ստացված պատասխանն սպասվածի հետ:
Կոնտակտային թեստավորումը կարևոր է՝ ապահովելու հուսալիություն և սպասվող համակարգերի պահպանելիություն միկրոսերվիսների վրա հիմնված համակարգերում։