Sobes.tech
Middle+

микросервистин келишимдик тестирүүсү жөнүндө айтыңыз.

sobes.tech AI

AIден жооп

Контракттык тестирлөө микросервисдердин API (контракт) деңгээлинде өз ара аракеттенүүсүн текшерүүгө багытталган. Максаты — керектүү (API колдонуп жаткан сервис) жана камсыздоочу (API берген сервис) белгилүү "контрактты" (суроо/жауап схемасы, маалымат форматы, күтүүлөр) сактаганына ишенимдүү болуу.

Негизги принциптер:

  • Керектүү-баалаган: Тесттер керектүүчүлөрдүн күтүүлөрүнө негизделген. Керектүүчү кайсы маалымат жана формат керек экенин аныктайт.
  • Ички эки тараптуу тестирлөө: Керектүүчү тарап (азыркы контрактка иштей алабы) жана камсыздоочу тарап (ишке ашырылышы керектүү күтүүлөргө жооп берет) текшерилет.
  • Ылдамдык: Тесттер тез аткарылат, көбүнчө CI/CD процесстеринде, анткени бардык көз каранды сервистерди жайгаштыруу талап кылынбайт.

Процесс төмөнкүдөй:

  1. Керектүүчү тесттер түзөт, алар камсыздоочунун APIсинен күтүүлөрүн сүрөттөйт. Бул тесттер "контрактты" түзөт.
  2. Контракт жарыяланат (мисалы, борборлоштурулган репозиторийде).
  3. Камсыздоочу жарыяланган контрактты колдонуп, APIнин ишке ашырылышын текшерет. Ал тесттерди (адатта камсыздоочунун тараптан) иштетет жана анын API контрактка туура келерин текшерет.
  4. Эгер керектүүчү күтүүлөр менен камсыздоочунун ишке ашырылышы айырмаланса, тест жыгылат жана контракт бузулушу белгиленет.

Куралдар:

  • Pact (ең популярдуу)
  • Spring Cloud Contract
  • Swagger/OpenAPI жана валидация инструменттери

Артыкчылыктары:

  • Ички каталардын эрте аныкталуы: Маселен, шайкештик маселелери жайгаштыруу алдында аныкталат.
  • Интеграциялык тесттердин керектүүлүгүн азайтуу: Кыйын жана узак жүрүүчү бүтүндүк тесттеринен көз каранды болууну азайтат.
  • Өзүнчө тестирлөө мүмкүнчүлүгү: кызматтарды бири-биринен көз карандысыз тестирлөөгө мүмкүндүк берет.
  • Күтүүлөрдүн так аныкталышы: кызматтар ортосундагы контрактты так аныктайт.

Кемчиликтери:

  • Толук эмес интеграциялык тесттерди алмаштырбайт (API деңгээлиндеги өз ара аракеттенүүнү гана текшерет).
  • Контракт версиялоодо дисциплина талап кылынат.
  • Өтө татаал контракттары бар кызматтар үчүн кыйын болушу мүмкүн.

Pact менен колдонуу мисалы:

  1. Керектүүчү (мисалы, 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 аркылуу
            // Күтүүлөрдү туура иштетип жатканын текшерүү
            HttpResponse response = Request.Get(mockServer.getUrl() + "/products/1").execute().returnResponse();
            assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
        }
    }
    
  2. Керектүүчү тараптын тесттерин аткарганда контракт файлы (.json) түзүлөт.
  3. Бул файл Pact Broker же башка борборлоштурулган репозиторийге жарыяланат.
  4. Камсыздоочу (Product Service) 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));
        }
    }
    
  5. Камсыздоочу тараптагы верификатор реалдуу API-га кайрылып, алынган жоопту күтүүлөр менен салыштырат.

Контракттык тестирлөө — микросервис негизделген системалардын ишенимдүүлүгүн жана колдоосун камсыз кылуу үчүн маанилүү практика.