Sobes.tech
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:

  1. Tarbija loob testid, mis kirjeldavad tema ootusi tarnija API suhtes. Need testid genereerivad "lepingu".
  2. Leping avaldatakse (näiteks tsentraliseeritud hoidlas).
  3. Tarnija kasutab avaldatud lepingut API rakendamise kontrollimiseks. Ta käivitab testid (tavaliselt tarnija poolel), mis kontrollivad, kas tema API vastab lepingule.
  4. 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:

  1. 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));
        }
    }
    
  2. Tarbija poole testide käigus genereeritakse lepingufail (.json).
  3. See lepingufail avaldatakse Pact Brokerisse või teise tsentraliseeritud hoidlas.
  4. 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));
        }
    }
    
  5. 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.