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 не беру керек
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 - контейнерлер/порттар бойынша параллельдеу; іске қосылғанда көші-қонды пайдалану.
- бақыланатын уақыт (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.
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 де өлшеңіз. Төлем/вебхук жолдарын ерекше тексеріңіз: қолтаңбалар, ретрайлер және демпотенттілік.