Middle+
Rääkige mikroteenuse lepingutestist.
sobes.tech AI
Vastus AI-lt
Sõlmitud testimine keskendub mikroteenuste vahelise vastastikuse toimimise kontrollimisele nende API (lepingu) tasandil. Eesmärk on veenduda, et tarbija (teenus, mis kasutab API-d) ja tarnija (teenus, mis pakub API-d) järgivad teatud "lepingut" (päringute/vastuste skeem, andmevorming, ootused).
Põhiprintsiibid:
- Tarbija juhitav: Testid põhinevad tarbija ootustel. Tarbija määrab, milliseid andmeid ja vorminguid talle vaja on.
- Kahepoolne testimine: Kontrollitakse nii tarbija poolt (kas ta suudab töötada praeguse lepinguga), kui ka tarnija poolt (kas tema rakendus vastab tarbija ootustele).
- Kiirus: Testid viiakse läbi kiiresti, sageli CI/CD torujuhtmes, kuna need ei nõua kõigi sõltuvate teenuste kasutuselevõttu.
Protsess hõlmab tavaliselt:
- Tarbija loob testid, mis kirjeldavad tema ootusi tarnija API suhtes. Need testid genereerivad "lepingu".
- Leping avaldatakse (näiteks tsentraliseeritud hoidlas).
- Tarnija kasutab avaldatud lepingut API rakendamise kontrollimiseks. Ta käivitab testid (tavaliselt tarnija poolel), mis kontrollivad, kas tema API vastab lepingule.
- Kui tarbija ootuste ja tarnija rakenduse vahel on erinevusi, siis test ebaõnnestub, näidates lepingurikkumist.
Tööriistad:
- Pact (populaarsim)
- Spring Cloud Contract
- Swagger/OpenAPI koos valideerimisvahenditega
Eelised:
- Varajane vigade avastamine integratsioonis: Probleemid ühilduvusega avastatakse enne juurutamist.
- Vähendab integratsioonitestide vajadust: Vähendab sõltuvust keerukatest ja aeglastest lõpp-testi.
- Sõltumatu testimine: Võimaldab testida teenuseid sõltumatult üksteisest.
- Selge ootuste määratlus: Määratleb selgelt lepingud teenuste vahel.
Miinused:
- Ei asenda täielikult integratsiooniteste (kontrollib ainult API tasandil suhtlust).
- Nõuab distsipliini lepingute versioonihalduses.
- Võib olla keerulisem väga keerukate lepingutega teenuste puhul.
Näide Pacti kasutamisest:
- Tarbija (näiteks
Order Service) kasutab Pact raamatukogu, et luua tarbija poole testid.// Näide tarbija testist Pact JVM-iga @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 kutsesüsteem kasutades mockServerit // Kontrollib, kas tarbija korrektselt töötleb mock-vastust HttpResponse response = Request.Get(mockServer.getUrl() + "/products/1").execute().returnResponse(); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); } } - Tarbija poole testide käigus genereeritakse lepingufail (
.json). - See lepingufail avaldatakse Pact Brokerisse või teise tsentraliseeritud hoidlas.
- Tarnija kasutab Pact raamatukogu (näiteks Pact Provider Verifier), et kontrollida oma API rakendust lepingus kirjeldatud nõuete põhjal, saadud lepingust.
// Tarnija test Pact Provider Verifieriga @Provider("ProductService") @PactFolder("relative/path/to/pacts") // või Pact Broker kasutamine public class ProductServiceVerificationTest { @TestTemplate @ExtendWith(PactVerificationInvocationContextProvider.class) public void verifyPact(PactVerificationContext context) { context.verifyInteraction(); } @State("a product with id 1 exists") public void productWithId1Exists() { // Andmestiku ettevalmistamise loogika tarnija teenuse jaoks } // Pange tarnija URL, kus testitav teenus töötab @BeforeEach void beforeEach(PactVerificationContext context) { context.setTarget(new HttpTestTarget("localhost", 8080)); } } - Tarnija verifitseerija kutsub välja reaalse tarnija API vastavalt lepingule ja võrdleb saadud vastust ootusega lepingus.
Sõlmitud testimine on oluline praktika, mis tagab süsteemide usaldusväärsuse ja hooldatavuse, mis põhinevad mikroteenustel.