Logo GH

API ხელშეკრულების ტესტირება

1) რატომ არის ხელშეკრულების ტესტირება

კონტრაქტი აფიქსირებს კლიენტის მოლოდინს და პროვაიდერის დაპირებებს: მარშრუტები/მეთოდები, სათაურები, სხეულების სქემები, სტატუსები, შეცდომების სემანტიკა და შეზღუდვები. მიზანია ინტეგრაციამდე შეუთავსებელი ცვლილებების დაჭერა და ვერსიების უსაფრთხოდ გამოშვება, მძიმე E2E- ს გარეშე.

2) მიდგომები

Consumer-Driven Contracts (CDC): კლიენტი ქმნის მოლოდინებს (Pact და ანალოგები); პროვაიდერი მათ რეგულარულად გადამოწმებს.
სპეციფიკაცია: ხელშეკრულება, როგორც ჭეშმარიტების ერთი წყარო (OpenAPI/Protobuf/GraphQL SDL); ტესტები წარმართავს განხორციელებას სპეციფიკაციის საწინააღმდეგოდ.
ღონისძიება: შეტყობინებების სქემები (Avro/JSON Schema/Protobuf) + თავსებადობის წესები ბროკერში/რეესტრში.

3) HTTP/REST: სპეციფიკაციის ნაკადი

1. კონტრაქტი: OpenAPI 3. x (სქემები, მაგალითები, კოდები).
2. ლინტი და სტატანალიზი: სტილი, სავალდებულო ველები, ერთიანი კოდები.
3. განხორციელების შესაბამისობა: ტესტის გენერატორი OpenAPI- ს წინააღმდეგ (schemathesis/Dredd მიდგომა) + სახელმძღვანელო ნეგატივები.
4. Snaphots: ჩაწერეთ პასუხების მაგალითები, ETag სემანტიკა, იდემპოტენტურობის სათაურები.

ბუნებრივი ხელშეკრულების მაგალითი (OpenAPI ფრაგმენტი):
yaml paths:
/v1/payments:
post:
responses:
"201": { $ref: "#/components/responses/PaymentCreated" }
"409": { description: Duplicate by Idempotency-Key }
"422": { description: Schema/Business validation failed }

4) CDC (Pact მიდგომა)

სასიცოცხლო ციკლი:

1. Consumer წერს ტესტს, ქმნის pact ფაილს (მოლოდინს).

2. ბროკერის გამოქვეყნება (არტეფაქტი).

3. Provider CI- ში აყენებს მომსახურებას (ან კონტრაქტს), გადამოწმებს pact- ს.

4. ბროკერი ითვლის can-i-deploy თავსებადობის მატრიქსს.

Consumer ტესტის მაგალითი (ფსევდო-JS):
js pact
.given("wallet exists")
.uponReceiving("get wallet")
.withRequest({ method:"GET", path:"/v1/wallets/w123", headers:{ "Authorization": term({generate:"Bearer x", matcher:/^Bearer\s.+/}) }})
.willRespondWith({
status: 200,
headers: { "Content-Type": "application/json" },
body: like({ id:"w123", currency: "EUR", balance: 0 })
});

5) GRPC/Protobuf კონტრაქტები

კონტრაქტი - '.proto' პაკეტების/სერვისების ვერსიით.
თავსებადობა: არ გამოიყენოთ ჭდეები, უბრალოდ დაამატეთ ახლები optional- ით, არ წაშალოთ გამოყენებული ველები; ნომრების დაჯავშნა.
ტესტები: სერვერის/კლიენტის სტაბილურობის წარმოქმნა, მანქანის გენერატორის შემთხვევების დაქირავება + ნეგატივები (unknown fields, size-limits).

6) ღონისძიების კონტრაქტები (Kafka/NATS/...)

Схемы: Avro/JSON Schema/Protobuf в Schema Registry.
თავსებადობის პოლიტიკა: 'BACKWARD' (ხშირად საკმარისია) ან 'FULL'.
მწარმოებლის ტესტები: ხელმძღვანელობს მესიჯს სქემის წინააღმდეგ; საკონსულტაციო ტესტები: იღებს ძველ და ახალ ვერსიას.
ინვარიანტები: იდემპოტენტურობის გასაღებები, ბრძანება/განმეორება, დედაპლაციის სემანტიკა.

Avro სქემის მაგალითი (ფრაგმენტი):
json
{"type":"record","name":"PayoutCreated","fields":[
{"name":"payoutId","type":"string"},
{"name":"amount","type":"double"},
{"name":"currency","type":{"type":"string","logicalType":"iso-4217"}}
]}

7) თავსებადობა და ვერსიები

Backward compatible (რეკომენდებულია მინიმალური): დაამატეთ არჩევითი ველები, არ დაარღვიოთ არსებული.
Forward Compatible: მომხმარებლები უგულებელყოფენ უცნობ სფეროებს.
Full: ორივე.
ვერსია: 'path (/v1)', 'Accept: განაცხადი/vnd. brand. v2+json`, `proto package v2`.
დეპრესიის პოლიტიკა: გამომავალი ფანჯარა (მაგალითად, 90 დღე), რომელიც აფრთხილებს სათაურებს/მოვლენებს.

8) უარყოფითი და შეცდომები - ეს ასევე კონტრაქტია

სტანდარტიზებული კოდები: 400/401/403/404/409/422/429/5xx, სავალდებულო ველები 'code', 'მესიჯი', 'trace _ id'.
ზომები/ლიმიტები - ხელშეკრულების ნაწილი (413/414/431).
Idempotence: ქცევა გამეორებისას (409 vs 201 same id).
სათაურები: 'Retry-After' 429/503, 'Idempotency-Key', 'Content-Language' და ა.შ.

შეცდომის შაბლონი:
json
{ "code":"validation_error", "message":"amount must be ≥ 1", "trace_id":"..." }

9) მონაცემებს მართავს კონტრაქტი

მაგალითები/მინარევები (examples) - ცოცხალი, ვალიდირებული CI- ში.
Fixtures for CDC არის მინიმალური, დეტერმინირებული.
მონაცემთა გამომუშავება - property-based ნომრები/თარიღებისთვის; მაგრამ არ დაარღვიოთ სნაიპშოტების სტაბილურობა.

10) Pipline in CI/CD (რეფერენდუმი)

1. Lint/validate: OpenAPI/Proto/Avro (`validate`, style-линер).
2. Publish: კონტრაქტი, როგორც არტეფაქტი (ბროკერი/რეესტრი).
3. Verify: პროვაიდერი ყრის CDC პაკეტებს/სპეციფიკაციის ტესტებს.
4. can-i-deploy gate: მწვანე მატრიცის გარეშე, გამოშვება აკრძალულია.
5. Diff: შემოწმება, რომ ცვლილებები თავსებადია.
6. ანგარიში: JUnit/HTML, დარღვევების/დეფინიციის სია.

ფსევდო მატრიცა:
yaml jobs:
lint:...
publish-contract: needs: [lint]
verify-provider: needs: [publish-contract]
can-i-deploy:
if: always()
steps: [run: pact-broker can-i-deploy...]

11) ინსტრუმენტები (დავალებების კლასებში)

ლინტი/ვალიდატორები: openapi-linters, protobuf-lint, avro-tools.
CDC: Pact ოჯახი/ბროკერი, Spring Cloud Contract, Hoverfly (HTTP ჩანაწერები/raples).
სპეციფიკაციის რანერები: schemathesis/Dredd მსგავსი მიდგომა, Postman test + JSON Schema.
Diff: semantic-diff OpenAPI/Proto/Avro (გამოვლენილია breaking ცვლილებები).
კონტეინერები: Testcontainers პროვაიდერის/კონტრაქტების თაროების ასამაღლებლად.

12) ანტიპატერები

სპეციალური დოქი კოდისგან დამოუკიდებლად არის რასინქრონიზაცია. შეინახეთ კონტრაქტი მომსახურების მახლობლად.
მესამე მხარის სერვისის ხიდები ხელშეკრულების ნაცვლად არის მყიფე apdates.
შემთხვევითი პასუხები/თაობა ფლეიკის სქემაზე მითითების გარეშე.
ტიპების/სავალდებულო ველების შეცვლა ვერსიის გარეშე.
Silent გაფართოება შეტყობინებების/დეპრესიის გარეშე.
უარყოფითი კონტრაქტებისა და შეცდომების კოდების არარსებობა.

13) iGaming/ფინანსების სპეციფიკა

ფორმალიზებული ფულადი ველები: 'amount' - decimal მასშტაბით, ვალუტა - ISO-4217, თანხების ინვალიდები.
გადახდის/ვებჰუკის კონტრაქტები: HMAC/mTLS, anti-replay ('X-Timestamp' ფანჯარა), idempotence, 'Retry-After'.
რეგიონალური/ტენანტები: სავალდებულო სათაურები 'X-Tenant/X-Region', შეტყობინებების ლოკალიზაცია.
მოვლენები: უცვლელი ჟურნალები (აუდიტი), დედუპლიკაციის გასაღებები, მიწოდების გარანტიები (at least once + idempotent hundlers).

14) „ჩონჩხის“ ტესტების მაგალითები

14. 1 Schemathesis სტილი (ფსევდო)

bash schemathesis run openapi. yaml --checks all --hypothesis-deadline=200

14. 2 Postman, როგორც სპეციფიკური რანერი

js pm. test ("Scheme/v1/wallets/{ id} is valid," () => {
const schema = pm. collectionVariables. get("wallet_get_schema");
pm. expect(ajv. validate(JSON. parse(schema), pm. response. json())). to. be. true;
});

14. 3 CDC (ფსევდო) გადამოწმება

bash pact-broker can-i-deploy --pacticipant wallets --version $SHA --to-environment staging

15) მზადყოფნის სიის სია

  • კონტრაქტები საცავებში, CI უხელმძღვანელებს და აქვეყნებს არტეფაქტებს.
  • CDC შედის კრიტიკულ ინტეგრაციებში; მუშაობს broker/matrix „can-i-deploy“.
  • თავსებადობის პოლიტიკა (HTTP/gRPC/Events) დოკუმენტირებულია; ავტომატური semantic-diff.
  • უარყოფითი კონტრაქტები: შეცდომები, ზომების შეზღუდვები, იდემპოტენტობა, 'Retry-After'.
  • ტესტის მონაცემები დეტერმინირებულია; მაგალითების Snaphots მხარს უჭერს.
  • ვერსიები და დეპრესია: ვადები, შეტყობინებები, სათაურები.
  • მოვლენებისთვის - Schema Registry და თავსებადობის რეჟიმი; Projecer/Consumer ტესტირებს ორივე ვერსიას.
  • არტეფაქტები: JUnit/HTML, diff/verify ანგარიშები, თავსებადობის მატრიცა.
  • ინციდენტის პროცედურა: სწრაფი rollback კონტრაქტი/fich დროშა, შეტყობინება ინტეგრატორებისთვის.

16) TL; DR

დააფიქსირეთ მოლოდინები კონტრაქტებში და ავტომატურად გადაიტანეთ ისინი: CDC კლიენტის მოლოდინებისთვის, განხორციელების შესაბამისობის სპეციფიკური ტესტები, ღონისძიებების სქემების რეესტრი. შეინარჩუნეთ თავსებადობის მკაცრი პოლიტიკა და უარყოფითი კონტრაქტები (შეცდომები, ლიმიტები, იდემპოტენტობა). თქვენ არ შეგიძლიათ გაათავისუფლოთ მატრიქსის მწვანე can-i-deploy და semantic-diff გარეშე breaking ცვლილებების გარეშე.

Contact

დაგვიკავშირდით

დაგვიკავშირდით ნებისმიერი კითხვის ან მხარდაჭერისთვის.ჩვენ ყოველთვის მზად ვართ დაგეხმაროთ!

Telegram
@Gamble_GC
ინტეგრაციის დაწყება

Email — სავალდებულოა. Telegram ან WhatsApp — სურვილისამებრ.

თქვენი სახელი არასავალდებულო
Email არასავალდებულო
თემა არასავალდებულო
შეტყობინება არასავალდებულო
Telegram არასავალდებულო
@
თუ მიუთითებთ Telegram-ს — ვუპასუხებთ იქაც, დამატებით Email-ზე.
WhatsApp არასავალდებულო
ფორმატი: ქვეყნის კოდი და ნომერი (მაგალითად, +995XXXXXXXXX).

ღილაკზე დაჭერით თქვენ ეთანხმებით თქვენი მონაცემების დამუშავებას.