U modernom razvoju softvera, mikroservisi su postali de facto standard. Obećavaju agilnost, skalabilnost i nezavisnost timova. Međutim, sa rastom broja servisa, raste i složenost integracije. Tradicionalno, oslanjali smo se na spore, skupe i često nepouzdane End-to-End (E2E) testove da bismo proverili da li svi delovi sistema rade zajedno.
Kao rezultat toga, timovi se suočavaju sa paradoksom: stvorene su nezavisne aplikacije, ali su i dalje zavisne od sporog, centralizovanog procesa testiranja. Jedna mala promena u API-ju Provajdera može slomiti Konzumenta, a problem se često otkrije kasno – u integracionom okruženju ili, još gore, u produkciji.
Rešenje je u Testiranju ugovora (Contract Testing), a trio alata Pact, PactFlow i GitHub Actions transformiše način na koji timovi garantuju pouzdanost i nezavisnost svojih mikroservisa.
Značaj ove metodologije leži u njenoj sposobnosti da ostvari pravo kontinuirano raspoređivanje (Continuous Deployment) u arhitekturama baziranim na mikroservisima.
Testiranje ugovora omogućava programerima da "pomere testiranje ulevo" (Shift Left). Umesto čekanja na kompletnu integraciju sistema:
Testovi se pokreću u izolaciji kao deo jedinice (unit) ili kratkog integracionog testa.
Povratna informacija o kompatibilnosti stiže za sekunde, a ne za sate.
Ugovor definiše minimalni set očekivanja Konzumenta. Ovo sprečava Provajdera da se opterećuje irelevantnim testovima i daje mu slobodu da evoluira svoj API, sve dok ispunjava ugovore.
Contract testing zamenjuje veći deo složenih E2E testova koji su često "flaky" (nepouzdani) jer zavise od stanja i konfiguracije celog okruženja. Time se značajno smanjuje vreme potrebno za održavanje testova.
Praktična primena testiranja ugovora bazira se na harmoničnom radu tri alata, koji grade kompletan automatizovani CI/CD radni tok:
Pact je alat za implementaciju Consumer-Driven Contract Testing (CDCT). Konzument definiše ugovor o tome šta očekuje od Provajdera.
Pact Fajl: Konzumentovi testovi generišu JSON fajl (ugovor) nakon uspešnog prolaska testova sa Mock Servisom.
Jezik Nezavisan: Ugovor je u JSON formatu, omogućavajući komunikaciju između servisa pisanih u različitim jezicima (npr. Java i JavaScript).
PactFlow (ili Pact Broker) služi kao centralno skladište ugovora i menadžer kompatibilnosti.
Pact Broker: Centralna tačka gde Konzument objavljuje, a Provajder preuzima ugovore.
Verzionisanje: Osigurava da se Provajder testira samo protiv verzija Konzumenata koje su trenutno raspoređene.
can-i-deploy: Ključna komanda koja proverava matricu kompatibilnosti da bi potvrdila da je nova verzija servisa sigurna za raspoređivanje.
GitHub Actions orkestrira sve korake, integrišući testiranje u Continuous Integration/Continuous Deployment (CI/CD).
Automatizovani radni tokovi: Definišu se odvojeni radni tokovi za Konzumenta i Provajdera.
GitHub Secrets: Koriste se za sigurno čuvanje API tokena potrebnih za komunikaciju sa PactFlow-om.
Sigurnosni prekid: Raspoređivanje se uslovljava prolaskom can-i-deploy provere u Action, sprečavajući da nekompatibilan kod stigne do produkcije.
| Br. | Oblast | Ključna činjenica |
| 1. | Definicija | Contract Testing osigurava da komunikacija između zavisnih servisa odgovara definisanom "ugovoru". |
| 2. | Svrha | Proaktivno hvatanje nekompatibilnosti API-ja pre integracije i raspoređivanja. |
| 3. | Prednost | Zamenjuje spore, skupe i nepouzdane E2E (End-to-End) testove. |
| 4. | Uloge | Konzument (korisnik API-ja) i Provajder (pružalac API-ja). |
| 5. | Alat | Pact je vodeći open-source alat za CDCT (Consumer-Driven Contract Testing). |
| 6. | Princip | CDCT: Konzument (a ne Provajder) definiše ugovor (očekivanja). |
| 7. | Dokument | Pact Fajl je JSON dokument koji sadrži ugovor o očekivanim interakcijama. |
| 8. | Test Konzumenta | Konzument testira svoj kod protiv Mock Servisa koji generiše Pact. |
| 9. | Test Provajdera | Provajder testira svoj stvarni kod protiv Pact fajla (ugovora) preuzetog sa brokera. |
| 10. | Jezici | Pact generiše jezički nezavisne ugovore, ključno za heterogene arhitekture. |
| 11. | Broker | Pact Broker (PactFlow) je centralno skladište za sve Pact fajlove. |
| 12. | Tok | Konzument objavljuje Pact fajl → Provajder preuzima i verifikuje. |
| 13. | PactFlow | PactFlow je hosted rešenje za Pact Broker, idealno za velika okruženja. |
| 14. | Sigurnost | Komanda can-i-deploy je ključna: proverava da li je nova verzija kompatibilna sa svim trenutno raspoređenim zavisnim servisima. |
| 15. | Automatizacija | GitHub Actions automatizuje testiranje ugovora u CI/CD cevi. |
| 16. | U Actions | Koristi se za pokretanje Pact testova, objavljivanje rezultata i izvršavanje can-i-deploy. |
| 17. | Skladištenje | GitHub Secrets se koriste za čuvanje PactFlow API tokena. |
| 18. | Stanje | Provider States omogućavaju Konzumentu da Provajderu signalizira neophodno stanje podataka za test. |
| 19. | Alternativa | Bi-directional Contract Testing (BDCT) omogućava verifikaciju na osnovu OpenAPI specifikacije. |
| 20. | Cilj | Omogućava nezavisno i sigurno raspoređivanje (Independent Deployment) mikroservisa, čime se povećava autonomija timova. |
© Sva prava pridržana, Kompjuter biblioteka, Beograd, Obalskih radnika 4a, Telefon: +381 11 252 0 272 |
||