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