GH GambleHub

Unit vs Integration թեստեր

1) Ինչո՞ ւ տարբերակել թեստերի տեսակները

Թեստերի ճիշտ դրամապանակը կանխատեսելի է դարձնում. Unit-ը արագ և էժան է դարձնում տրամաբանության թերությունները։ Integration-ը ստուգում է մոդուլների կապերը, իրական տեղափոխությունը և «կլեյը»։ Միասին նրանք նվազեցնում են ռելեները և արագացնում ալգորիթմները։

2) Սահմանումներ և սահմաններ

Unit-թեստ

Ստուգում է վարքի փոքր միավորը (ֆունկցիա, դաս, use-cript) մեկուսացման մեջ։

Արտաքին կախվածությունը փոխարինվում է (mock/stub/fake)։

Արագ (ms-տասնյակ ms), դետերմինացված։

Integration թեստը

Ստուգում է մի քանի իրական բաղադրիչների փոխազդեցությունը 'BD, brocker (Kafka/RabbitMQ), HTTP/gRPC, ալյումինե համակարգը, քեշը։

Նվազագույն կամուրջներ, իրական արձանագրություններ։

Ավելի դանդաղ (հարյուրավոր ms-վայրկյաններ), ավելի թանկ է աջակցության համար։

🚨 <Կանոն 'հենց "մենք անցնում ենք գործընթացը/սոկետ/BD>, մենք արդեն ինտեգրացիոն ջրերում ենք։

3) Փորձարկման բուրգը (ոչ թե սառցե եղջյուրը)

Հիմքը ՝ Unit (70-80 տոկոսը քանակով) էժան է, արագ։

Միջին շերտը ՝ Integration/Component (15-25%) - կրիտիկական ճանապարհներ և պայմանագրեր։

Վերևում ՝ E2E/UX/Coratory (5-10 տոկոսը) նվազագույն է։

Կողմերում 'Static Analysis/Lint/Type pork և Mutation testing որպես որակի ուժեղացուցիչներ։

4) Ի՞ նչ տալ Unit-ը, իսկ ի՞ նչ է Integration-ը։

ԽնդիրՏեսակըԻնչու՞
Մաքուր բիզնես տրամաբանությունը (վալիդացիաներ, հաշվարկներ, դիմպտոտենցիա)UnitԱրագ, դետերմինացված, շատ սահմանային արժեքներ
Mappings DTO ռուսական մոդել, սերիալիզացիա, պարսինգUnitՇատ քեյսներ, հեշտությամբ մեկուսացնել
Հետազոտություններ/ORM հարցումներIntegration (с test DB)ORM-ի և SQL-ի «վարքագիծը» տեսանելի է միայն կենդանի BD-ի վրա
HTTP պայմանագիր (արձաններ, վերնագրեր, սխեմաներ)Integration / ContractԱնհրաժեշտ է կենդանի HTTP + JSON Schema/OpENAPI
Saga/Disbox, retrai, dedlineIntegration / ComponentԹայմինգներ, գործարքներ, բրոքեր
Rate limit в gatewayIntegrationRedis/state/timauta
Հիբրիդային վեբհուկի (HMAC, խոհարար)Integration / CDCՍտորագրություններ, ժամացույց, ցանցային առանձնահատկություններ

5) Տվյալները և ֆիքսուրները

Unit

International fifsturs/բիլդերներ (factory methods)։

Պլաստիկ թեստերը (table-driven) սահմանային արժեքների համար։

Property-based մոտեցումը invariants-ի համար (օրինակ, «բանավեճի գումարը = վարկերի գումարը»)։

Integration

Hermetic միջավայրը 'Testcontainers/Docker Compose բարձրացնում են «postgres + redis + kafka + wiremock»։

Սկզբնական seed BD/cashe-ում և մաքրումից հետո (գործարք/rollback, truncate)։

Ժամացույցը/թայմերը կեղծ (վերահսկվող) են, հակառակ դեպքում ֆլաքները։

6) Գործիքներ և արտոնագրեր

Mocks/Stubs/Fakes/Spies:
  • Stub-ը ֆիքսված պատասխան է (էժան)։
  • Mock-ը փոխազդեցության/զանգերի քանակի ստուգումն է։
  • Fake-ը պարզեցված կոմպոզիա է (օրինակ, In-Memory Repo)։
  • Euract testing (CDC): Pact/Swagger-based - մենք արձանագրում ենք հաճախորդի սպասումները և ստուգում պրովայդերը։
  • WireMock/MockServer - HTTP-արգելակները երրորդ կողմի ծառայությունների համար։
  • Testcontainers - կենդանի BD/brocers տեղական և CI-ում առանց «կենդանաբանական այգու»։

7) Օրինակներ

7. 1 Unit: Ideudocode (pseudocode)

python def test_idempotent_create_payment_returns_same_id():
repo = InMemoryPayments()
service = Payments(repo)

first = service. create(amount=100, key="abc")
second = service. create(amount=100, key="abc")

assert first. id == second. id assert repo. count() == 1

7. 2 Integration: Webhuk (HMAC) + խոհարար

bash docker-compose: app + redis + wiremock (PSP)
docker compose -f docker-compose. test. yml up -d pytest -m "integration and webhook" -q

Թեստ

WireMock-ը տալիս է իրադարձություն '«X-Timestamp» և ստորագրությամբ։

Ծրագիրը ստուգում է HMAC-ը, կրկնապատկում է «event _ id», հինգ վայրկյան անց կրկնապատկիչը չի ստեղծում։

Մենք ստուգում ենք «200» և, որ ձայնագրությունը մենակ է։

7. 3 CDC 'հաճախորդի պայմանագիրը պրովայդերի հետ

Հաճախորդը ձևավորում է Pact (սպասումը '«POST/v1/payout' 07 '201» սխեմայով)։

Պրովայդերը CI-ում հետապնդում է պայմանագիրը իր պատին։

8) Արագություն, զուգահեռ, ֆլեյկի

Unit պետք է աշխատի <100 մզ թեստ; փաթեթը վայրկյաններ է։

Integration-ը զուգահեռ է տարաների/պորտերի հետ։ օգտագործեք գործարկման վրա։

Flaky-հակադոտ

վերահսկվող ժամանակը (fake clock),

սպասել «ակնհայտ իրադարձության», ոչ թե «sleep»,

կայուն շեմեր (ջիթերի հետ փորձարկումներ կատարել դետերմինացված)։

9) Հատկության մետրերը

Coverage (տողեր/ճյուղեր) 'օգտակար միտումը դիտարկելու համար, բայց ոչ նպատակը։

Mutation testing (PIT/Mutmut): ցույց է տալիս, թե «սպանում են» կեղծ փոփոխությունները 'ասուրենսի իրական ուժը։

Test duration և flaky rate։

International international-ը 'այն ուղիների մասնաբաժինը, որոնք գերաճած են երկարավուն։

10) Կառուցել CI/CD-ում

Ջոբի 'unit integration ente2e (fan-out ծառայություններով)։

Կախվածության քեշը, զուգահեռ մատրիցները BD/լեզուները/տարբերակները։

Զեկույցները ՝ JUnit/Allure + բեռնարկղերի լոգարանների արտեֆակտներ (անկման դեպքում)։

Gate: «կանաչ unit + կրիտիկական integration» - մերգի պայման։ e2e - nightly-ում։

Մատրիցի օրինակ (GitHub Actions, հատված)

yaml strategy:
matrix:
db: [postgres14, postgres16]
steps:
- run: docker run -d --name db -e POSTGRES_PASSWORD=pw postgres:${{ matrix. db }}
- run: pytest -m "unit" -q
- run: pytest -m "integration" -q

11) Միկրովեռներ և իրադարձություններ

Ծառայողական պայմանագրերը 'OpenAPI/Eurobuf տարբերակվում են; համատեղելիության թեստեր (backward)։

Event-driven:
  • Unit 'հիբրիդային իրադարձությունների և ինվարանտների մապինգը։
  • Integration: Հրապարակումը/բաժանումը իրական բրոկերում (Kafka), box/inbox սեմանտիկան, exactly-once իմիտացիան (առնվազն idempotent)։
  • Գետերի/կրկնօրինակների/վերարտադրման թեստերը (out-of-order)։

12) Տվյալները և մեկուսացումը Integration-ում

Յուրաքանչյուր թեստ կատարվում է յուրահատուկ սխեմա/BD (Testcontainers JDBC URL '? TC _ TMPSA =/var/lib/postgresql/www.rw)։

Գործարքային ֆիքսուրները (begin no rollback) արագացնում են մաքրությունը։

Redis/kasha-ի համար հիմնական նախածանցն է 'RUN _ ID կոդը ՝ "և" FLUSHDB "teardown-ում։

13) iGaming/ֆինանսական առանձնահատկությունները

Փողը և լիմիտները 'property-based թեստեր ինվարանտների վրա (հավասարակշռություն 240, ընդհանուր սահմանափակումներ)։

Կարգավորիչ 'լրագրության ստուգում (աուդիտ-լոգ գրված է), անփոփոխ իրադարձություններ։

Վճարումները/PMS: Ինտեգրացիոն թեստեր HMAC/mTSA, «Retry-After», գաղափարախոսություն, «jti»։

Պատասխանատու խաղը 'շեմերի/կուլդաունների կանոնների թեստեր։ «Երեկ տեղի կունենա այսօր» fake clock-ում։

14) Անտիպատերնի

«Unit» -ը, որը բարձրացնում է BD/NTTR-ը, արդեն integration-ն է (շփոթում են շերտերը և դանդաղեցնում CI)։

Բարձր coverage-ը դատարկ հայտարարությունների շնորհիվ («ծածկված էին, բայց չէին ստուգում»)։

Երրորդ կողմի ծառայությունների տրամաբանության կամուրջները այնտեղ, որտեղ պայմանագիր է պետք (կոտրվում է նորարարության ժամանակ)։

Թեստերը 'sleep (5)' փոխարեն իրադարձության/պայմանների ակնկալիքներին։

Ընդհանուր թեստային BD-ը զուգահեռ փորձարկումների համար ռուսական մրցավազքի և ֆլեյկայի համար։

15) Չեկ-թուղթ պատրաստակամության համար

  • Բուրումիդան որոշվում է 'Unit/Integration/E2E մասնաբաժնի% -ը և գետնի ժամանակի նպատակները։
  • Unit մեկուսացված, արագ, ծածկում են սահմանները և ինվարանտները։
  • Integration-ն օգտագործում է hermetic միջավայրը (Testcontainers/Compose), առանց ընդհանուր սթեյտների։
  • Պայմանագրային թեստերը (OpenAPI/Pact) հավատում են CI-ում։
  • Թեստերի տվյալները կառավարվող են 'seed/rollback/նախածանց, fake clock։
  • Զուգահեռ պրոգոն, JUnit/Allure, բեռնարկղերի արտեֆակտներ։
  • Metriki: duration, flaky rate, mutation score; ալտերտերը քայքայման համար։
  • Ստալինի/webhuk-սցենարներ ՝ HMAC/mTRK, retrai, idempotenty, dedup։
  • Ռազմավարական ռազմավարություն և թեստերի օրինակներ։

16) TL; DR

Unit-ը առավելագույն տրամաբանությունն է, նվազագույն միջավայրը։ Integration-ը նվազագույն մոկ է, առավելագույն ռեալիզմը։ Պահպանեք բուրգը 'արագ Unit-ը բռնում է թերությունների 80 տոկոսը, Integration-ը հաստատում է կապերն ու պայմանագրերը։ Օգտագործեք hermetic-բեռնարկղեր, պայմանագրային թեստեր, fake clock և զուգահեռ։ Չափեք ոչ միայն coverage, այլ նաև mutation score և flaky rate։ Հատկապես նշվում է երկրորդական/webhuk-ճանապարհները 'ստորագրություններ, վերափոխումներ և գաղափարախոսություն։

Contact

Կապ հաստատեք մեզ հետ

Կապ հաստատեք մեզ հետ ցանկացած հարցի կամ աջակցության համար։Մենք միշտ պատրաստ ենք օգնել։

Սկսել ինտեգրացիան

Email-ը՝ պարտադիր է։ Telegram կամ WhatsApp — ըստ ցանկության։

Ձեր անունը ըստ ցանկության
Email ըստ ցանկության
Թեմա ըստ ցանկության
Նամակի բովանդակություն ըստ ցանկության
Telegram ըստ ցանկության
@
Եթե նշեք Telegram — մենք կպատասխանենք նաև այնտեղ՝ Email-ի дополнение-ով։
WhatsApp ըստ ցանկության
Ձևաչափ՝ երկրի կոդ և համար (օրինակ՝ +374XXXXXXXXX)։

Սեղմելով կոճակը՝ դուք համաձայնում եք տվյալների մշակման հետ։