GH GambleHub

Бирдик vs Интеграциялык тесттер

1) Эмне үчүн сыноолордун түрлөрүн айырмалоо керек

Сыноолордун туура грануляциясы өнүгүүнү алдын ала айтууга болот: Бирдик логиканын кемчиликтерин тез жана арзан кармайт; Integration модулдарды текшерүү, реалдуу транспорт жана "клей". Алар чогуу регрессияны азайтып, релиздерди тездетет.

2) Аныктамалар жана чек аралар

Unit-тест

Кичинекей жүрүм-турум бирдигин (функция, класс, use-case) изоляцияда текшерет.
Тышкы көз карандылыктар алмаштырылган (mock/stub/fake).
Тез (ms-ондогон ms), аныктоо.

Integration-тест

Бир нече реалдуу компоненттердин өз ара аракеттенүүсүн текшерет: DD, брокер (Kafka/RabbitMQ), HTTP/gRPC, файл системасы, кэш.
минималдуу Моко, чыныгы протоколдор.
Жай (ms-секунд жүздөгөн), колдоо боюнча кымбат.

💡 Эреже: "процесске/сокетке/БДга өтүүдөн" кийин, биз интеграциялык сууларда турабыз.

3) Пирамида сыноо (муз мүйүз эмес)

Негизи: Unit (саны боюнча 70-80%) - арзан, тез.
Ортоңку катмар: Integration/Component (15-25%) - маанилүү жолдор жана келишимдер.
Жогорку: E2E/UX/Exploratory (5-10%) - минималдуу жетиштүү.
капталдарында: Static Analysis/Lint/Type текшерүү жана сапат күчөткүчтөр катары Мутация тестирлөө.

4) Эмне Unit жана эмне берүү керек - Integration

ТапшырмаТүрүЭмне үчүн
Таза бизнес-логика (валидациялар, комиссиялык эсептөөлөр, ачкычтардын демпотенттүүлүгү)UnitТез, детерминацияланган, чек аранын маанилери көп
Mappings DTO модели, сериалдаштыруу, парсингUnitКөптөгөн учурлар, жонокой обочолонуу
Репозиторийлер/ORM-суроолорIntegration (с test DB)"Жүрүм-турум" ORM жана SQL нюанстар гана жандуу DD көрүнүп турат
HTTP-контракт (статустар, аталыштар, схемалар)Integration / ContractБизге HTTP + JSON схемасы/OpenAPI тирүү стек керек
Saga/Outbox, Retray, мөөнөтүIntegration / ComponentТаймингдер, транзакциялуулук, брокер
Rate limit в gatewayIntegrationRedis/State/Таймауттар
Төлөм вебхоктору (HMAC, кайталоо)Integration / CDCКол тамгалар, сааттар, тармактык өзгөчөлүктөр

5) Маалыматтар жана фикстуралар

Unit

Inline Fixtures/Bilders (фабрика ыкмалары).
Таблица тесттер (table-driven) чек баалуулуктар үчүн.
Инварианттар үчүн Property-based ыкмасы (мисалы, "дебеттердин суммасы = кредиттердин суммасы").

Integration

Hermetic чөйрө: Testcontainers/Docker Compose көтөрүп 'postgres + redis + kafka + wiremock'.
DB/кэш жана тазалоо кийин баштапкы seed (бүтүм/rollback, truncate).
Саат/таймерлер - жасалма (көзөмөлдөнүүчү), болбосо флакондор.

6) Аспаптар жана үлгүлөр

Mocks/Stubs/Fakes/Spies:
  • Stub - туруктуу жооп (арзан).
  • Mock - өз ара аракеттенүү/чалуулардын санын текшерүү.
  • Fake - жөнөкөйлөштүрүлгөн ишке ашыруу (мисалы, In-Memory Repo).
  • Contract testing (CDC): Pact/Swagger-based - кардарлардын күтүүлөрүн чечүү жана провайдерди текшерүү.
  • WireMock/MockServer - үчүнчү тараптын кызматтары үчүн HTTP өчүргүчтөр.
  • Testcontainers - тирүү DD/брокерлер жергиликтүү жана "зоопарк" жок 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 ms иштеши керек; пакет - секунд.
Integration - контейнерлер/порттор боюнча параллелдүү; баштоодо миграцияны колдонуу.

Flaky-антидот:
  • контролдук убакыт (fake clock),
  • күтүүлөр "ачык окуя" эмес, 'sleep',
  • туруктуу босоголор (детерминацияланган тестирлөө менен ретра).

9) Сапат Metrics

Coverage (саптар/бутактар): тенденцияны байкоо үчүн пайдалуу, бирок максат эмес.
Mutation testing (PIT/Mutmut): "өлтүрүп" тесттер жалган өзгөрүүлөр көрсөтөт - Ассуренс чыныгы күч.
Test duration жана flaky rate: өсүү менен алерт.
Defect containment: өндүрүшкө чейин кармалган мүчүлүштүктөрдүн үлүшү.

10) CI/CD киргизүү

Jobs: unit → integration → e2e (fan-out боюнча кызматтар).
Көз карандылыкты кэш, DD/тилдер/версиялар боюнча параллелдүү матрицалар.
Отчеттор: 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: домендик окуялардын жана инварианттардын mapping.
  • Integration: реалдуу брокердин жарыялоо/жазылуу (Kafka), outbox/inbox семантика, exactly-once тууроо (жок дегенде - idempotent).
  • Тесттер retrains/дубликат/кайра (out-of-order).

12) Интеграцияда маалыматтар жана изоляция

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

13) iGaming/каржы өзгөчөлүктөрү

Акча жана лимиттер: инварианттар үчүн property-based тесттер (баланс ≥ 0, жалпы чектөөлөр).
Жөнгө салуучу: журналды текшерүү (аудит-журнал жазылат), өзгөрүлбөгөн окуялар.
Төлөмдөр/PSP: HMAC/mTLS интеграциялык тесттер, 'Retry-After', демпотенттик, дедуп 'jti'.
Жооптуу оюн: босого/кулдаун эрежелерин сыноо; fake clock боюнча "кечээ → бүгүн".

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

DD/NTTR көтөргөн "Unit" - бул интеграция (катмарларды чаташтырып, CIди жайлатат).
бош билдирүүлөр менен жогорку coverage ("жаап, бирок текшерилген эмес").
Контракт керек болгон жерде үчүнчү тараптын кызматтарынын логикасы (жаңылоодо бузулат).
Тесттер менен 'sleep (5)' ордуна күтүү окуя/шарттар.
Параллель тесттер үчүн жалпы тест DD → жарыш жана флейка.

15) Prod-даярдык чек тизмеси

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

16) TL; DR

Unit - логиканын максималдуу, айлана-чөйрөнүн минималдуу; Интеграция - минималдуу моку, максималдуу реализм. Пирамиданы кармап: Fast Unit 80% кемчиликтерди кармайт, Integration байланыштарды жана келишимдерди тастыктайт. hermetic контейнерлерди колдонуу, келишимдик тесттер, жасалма саат жана параллелдүүлүк. гана coverage эмес, өлчөө, ошондой эле mutation score жана flaky rate. Төлөм/вебхук жолдорун өзгөчө текшериңиз: кол тамгалар, ретрациялар жана демпотенттүүлүк.

Contact

Биз менен байланышыңыз

Кандай гана суроо же колдоо керек болбосун — бизге кайрылыңыз.Биз дайым жардам берүүгө даярбыз!

Интеграцияны баштоо

Email — милдеттүү. Telegram же WhatsApp — каалооңузга жараша.

Атыңыз милдеттүү эмес
Email милдеттүү эмес
Тема милдеттүү эмес
Билдирүү милдеттүү эмес
Telegram милдеттүү эмес
@
Эгер Telegram көрсөтсөңүз — Emailден тышкары ошол жактан да жооп беребиз.
WhatsApp милдеттүү эмес
Формат: өлкөнүн коду жана номер (мисалы, +996XXXXXXXXX).

Түшүрүү баскычын басуу менен сиз маалыматтарыңыздын иштетилишине макул болосуз.