Unit vs Integration թեստեր
1) Ինչո՞ ւ տարբերակել թեստերի տեսակները
Թեստերի ճիշտ դրամապանակը կանխատեսելի է դարձնում. Unit-ը արագ և էժան է դարձնում տրամաբանության թերությունները։ Integration-ը ստուգում է մոդուլների կապերը, իրական տեղափոխությունը և «կլեյը»։ Միասին նրանք նվազեցնում են ռելեները և արագացնում ալգորիթմները։
2) Սահմանումներ և սահմաններ
Unit-թեստ
Ստուգում է վարքի փոքր միավորը (ֆունկցիա, դաս, use-cript) մեկուսացման մեջ։
Արտաքին կախվածությունը փոխարինվում է (mock/stub/fake)։
Արագ (ms-տասնյակ ms), դետերմինացված։
Integration թեստը
Ստուգում է մի քանի իրական բաղադրիչների փոխազդեցությունը 'BD, brocker (Kafka/RabbitMQ), HTTP/gRPC, ալյումինե համակարգը, քեշը։
Նվազագույն կամուրջներ, իրական արձանագրություններ։
Ավելի դանդաղ (հարյուրավոր ms-վայրկյաններ), ավելի թանկ է աջակցության համար։
3) Փորձարկման բուրգը (ոչ թե սառցե եղջյուրը)
Հիմքը ՝ Unit (70-80 տոկոսը քանակով) էժան է, արագ։
Միջին շերտը ՝ Integration/Component (15-25%) - կրիտիկական ճանապարհներ և պայմանագրեր։
Վերևում ՝ E2E/UX/Coratory (5-10 տոկոսը) նվազագույն է։
Կողմերում 'Static Analysis/Lint/Type pork և Mutation testing որպես որակի ուժեղացուցիչներ։
4) Ի՞ նչ տալ Unit-ը, իսկ ի՞ նչ է Integration-ը։
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-ճանապարհները 'ստորագրություններ, վերափոխումներ և գաղափարախոսություն։