GH GambleHub

Unit vs Integration тестілері

1) Тест түрлерін неге ажырату керек

Тесттерді дұрыс түйіршіктеу әзірлеуді болжауға болады: Unit логиканың ақауларын тез және арзан ұстайды; Integration модульдерді, нақты көлікті және «желімді» тексереді. Олар бірге регресті азайтып, релиздерді жылдамдатады.

2) Анықтамалар мен шекаралар

Unit-тест

Оқшаулаудағы мінез-құлық бірлігін (функция, сынып, use-case) тексереді.
Сыртқы тәуелділіктер (mock/stub/fake) ауыстырылды.
Жылдам (мс-он мс), детерминирленген.

Integration-тест

Бірнеше нақты компоненттердің өзара әрекетін тексереді: ДБ, брокер (Kafka/RabbitMQ), HTTP/gRPC, файл жүйесі, кэш.
Минимум моков, нақты хаттамалар.
Баяу (жүздеген мс-секунд), қолдау жағынан қымбат.

💡 Ереже: «процеске/сокетке/БД-ға өтсек» - біз интеграциялық суларда боламыз.

3) Тестілеу пирамидасы (мұз мүйізі емес)

Негізі: Unit (саны бойынша 70-80%) - арзан, жылдам.
Орташа қабат: Integration/Component (15-25%) - күрделі жолдар мен келісімшарттар.
Жоғарғы: E2E/UX/Exploratory (5-10%) - ең аз жеткілікті.
Бүйірлерінде: Static Analysis/Lint/Type check және Mutation testing сапа күшейткіштері ретінде.

4) Unit не беру керек, ал Integration не беру керек

ТапсырмаТүріНеге
Таза бизнес-логика (валидация, комиссия есептері, кілттердің теңсіздігі)UnitЖылдам, детерминирленген, көптеген шекаралық мәндер
Маппингтер DTO, серияландыру, парсингUnitКөптеген кейстер, оқшаулау оңай
Репозиторийлер/ORM сұрауларыIntegration (с test DB)«Мінез-құлық» ORM және SQL нюанстар тек тірі ДБ-да көрінеді
HTTP-келісімшарт (мәртебелер, тақырыптар, схемалар)Integration / ContractHTTP + JSON Schema/OpenAPI жақтауы қажет
Saga/Outbox, ретрайлер, мерзімдерIntegration / ComponentТаймингтер, транзакциялық, брокер
Rate limit в gatewayIntegrationRedis/state/таймауттар
Төлем вебхурлары (HMAC, қайталау)Integration / CDCҚолтаңбалар, сағаттар, желілік ерекшеліктер

5) Деректер мен фикстуралар

Unit

Inline фикстуралар/билдер (factory methods).
Шекті мәндерге арналған кестелік тестілер (table-driven).
Инварианттар үшін property-based тәсілі (мысалы, «дебеттер сомасы = кредиттер сомасы»).

Integration

Hermetic орта: Testcontainers/Docker Compose көтереді 'postgres + redis + kafka + wiremock'.
БД/кэште бастапқы seed және кейін тазалау (транзакция/rollback, truncate).
Сағаттар/таймерлер - жалған (бақыланатын), әйтпесе флактар.

6) Аспаптар мен паттерндер

Mocks/Stubs/Fakes/Spies:
  • Stub - белгіленген жауап (арзан).
  • Mock - өзара әрекеттестікті/шақырулар санын тексеру.
  • Fake - жеңілдетілген іске асыру (мысалы, In-Memory Repo).
  • Contract testing (CDC): Pact/Swagger-based - клиенттің күтулерін тіркеп, провайдерді тексереміз.
  • WireMock/MockServer - бөгде серверлер үшін HTTP бұғаттағыштары.
  • Testcontainers - жергілікті және CI-де «хайуанаттар паркі» жоқ тірі БД/брокерлер.

7) Мысалдар

7. 1 Unit: төлем теңсіздігі (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: вебхук қолтаңбасы (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' дегенді дедуплициялайды, 5 секундтан кейін қайталау қайталанбайды.
  • '200' деген жазба бір екенін тексереміз.

7. 3 CDC: клиенттің провайдерге келісімшарты

Клиент Pact құрады (күту: 'POST/v1/payout' → '201' схемасымен).
Провайдер CI-де келісімшарттың верификациясын өз стендінде қуып жібереді.

8) Жылдамдық, параллельдік, флейка

Unit тестілеуге <100 мс жұмыс істеуі тиіс; пакет - секунд.
Integration - контейнерлер/порттар бойынша параллельдеу; іске қосылғанда көші-қонды пайдалану.

Flaky-антидот:
  • бақыланатын уақыт (fake clock),
  • 'sleep' емес, «айқын оқиға бойынша» күту
  • тұрақты табалдырықтар (джиттермен ретраларды детерминирленген түрде тестілеу).

9) Сапа өлшемдері

Coverage (жолдар/тармақтар): трендті бақылау үшін пайдалы, бірақ мақсат емес.
Mutation testing (PIT/Mutmut): жалған өзгерістер тестілерді «өлтіре ме» көрсетеді - ассуренстің нақты күші.
Test duration және flaky rate: өсу кезіндегі алерталар.
Defect containment: шығарылғанға дейін ұсталған багалардың үлесі.

10) CI/CD кірістіру

Джобтар: unit → integration → e2e (қызметтер бойынша fan-out).
Тәуелділік кэші, ДБ/тілдер/нұсқалар бойынша параллель матрицалар.
Есептер: 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/Protobuf нұсқаланады; үйлесімділік тестілері (backward).

Event-driven:
  • Unit: домендік оқиғалар мен инварианттар.
  • Integration: нақты брокерде жариялау/жазылу (Kafka), outbox/inbox семантика, exactly-once имитация (кем дегенде - idempotent).
  • Ретрайлардың/телнұсқалардың/қайта реттеудің тестілері (out-of-order).

12) Интеграциядағы деректер және оқшаулау

Әрбір тест → бірегей схема/БД (Testcontainers JDBC URL '? TC _ TMPFS =/var/lib/postgresql/data: rw').
Транзакциялық фикстуралар (begin → run → rollback) тазартуды жылдамдатады.
Redis/кэш үшін - негізгі префикс 'test: $ {RUN _ ID}:' және 'FLUSHDB' teardown.

13) iGaming/Қаржы ерекшелігі

Ақша және лимиттер: инварианттарға арналған property-based тестілер (теңгерім ≥ 0, жиынтық шектеулер).
Реттеуші: журналға түсіруді тексеру (аудит-журнал жазылады), өзгермейтін оқиғалар.
Төлемдер/PSP: HMAC/mTLS интеграциялық тестілері, 'Retry-After', іспеттілік, дедуп 'jti'.
Жауапты ойын: табалдырық/құлдаун ережелерінің тестілері; «кеше → бүгін» fake clock.

14) Антипаттерндер

ДБ/НТТР көтеретін «unit» - бұл integration (қабаттарды шатастырып, CI-ді баяулатады).
Бос пікірлер есебінен жоғары coverage («жабылды, бірақ тексерілмеді»).
Келісімшарт қажет болған жерде бөгде сервистердің логикасы бұзылады (жаңарту кезінде бұзылады).
Оқиғаны/шарттарды күту орнына 'sleep (5)' тестілері.
Қатарлас тесттерге арналған жалпы тест БД → жарыс және флейта.

15) Prod-дайындық чек-парағы

  • Пирамида анықталған: Unit/Integration/E2E үлестерінің% -ы және пайдалану уақыты бойынша мақсаттар.
  • Unit оқшауланған, жылдам, шекті мәндер мен инварианттарды жабады.
  • Integration жалпы дәрежесіз hermetic-ортаны (Testcontainers/Compose) пайдаланады.
  • Келісімшарттық тесттер (OpenAPI/Pact) CI верификацияланады.
  • Тест деректері - басқарылатын: seed/rollback/префикстер, fake clock.
  • Параллель жүгіру, JUnit/Allure есептері, контейнерлер логының артефактілері.
  • Метриктер: duration, flaky rate, mutation score; деградацияға алерталар.
  • Төлем/вебхук сценарийлері: HMAC/mTLS, ретра, идемпотенттік, дедуп.
  • Стратегия құжаттамасы және тест үлгілерінің мысалдары.

16) TL; DR

Unit - логиканың максимумы, қоршаған ортаның минимумы; Integration - минимум моков, максимум реализм. Пирамиданы ұстаңыз: жылдам Unit 80% ақауларды ұстайды, Integration байланыстар мен келісімшарттарды растайды. hermetic-контейнерлерді, келісім-шарттық сынақтарды, fake clock және параллельділікті пайдаланыңыз. Тек coverage ғана емес, mutation score және flaky rate де өлшеңіз. Төлем/вебхук жолдарын ерекше тексеріңіз: қолтаңбалар, ретрайлер және демпотенттілік.

Contact

Бізбен байланысыңыз

Кез келген сұрақ немесе қолдау қажет болса, бізге жазыңыз.Біз әрдайым көмектесуге дайынбыз!

Интеграцияны бастау

Email — міндетті. Telegram немесе WhatsApp — қосымша.

Сіздің атыңыз міндетті емес
Email міндетті емес
Тақырып міндетті емес
Хабарлама міндетті емес
Telegram міндетті емес
@
Егер Telegram-ды көрсетсеңіз — Email-ге қоса, сол жерге де жауап береміз.
WhatsApp міндетті емес
Пішім: +ел коды және номер (мысалы, +7XXXXXXXXXX).

Батырманы басу арқылы деректерді өңдеуге келісім бересіз.