Поставьте задачу по тестированию: проект — банковский модуль перевода денег между счетами; какие уровни тестов (юнит, интеграция, контрактные, нагрузочные), конкретные сценарии пограничных случаев и стратегии мокирования вы бы включили, чтобы снизить риск критических ошибок в продакшене?

12 Окт в 14:18
2 +2
0
Ответы
1

Ниже — комплект задачи по тестированию банковского модуля переводов между счетами: уровни тестов, конкретные сценарии особеннопограничныеособенно пограничныеособеннопограничные, стратегии мокирования/виртуализации, рекомендации по средам и CI, и приоритеты. Задача ориентирована на снижение риска критических ошибок в продакшене двойноесписание,потерясредств,рассинхрондвойное списание, потеря средств, рассинхрондвойноесписание,потерясредств,рассинхрон.

Коротко — ключевые цели тестирования

Гарантировать атомарность перевода либосписание+зачисление,либоничеголибо списание + зачисление, либо ничеголибосписание+зачисление,либоничего.Предотвратить двойное списание при ретраях/конкуренции.Обрабатывать частичные отказы внешних систем корректно компенсация/откаткомпенсация / откаткомпенсация/откат.Корректность валидации, округлений, лимитов, валют.Производительность и устойчивость под пиковыми нагрузками.

1) Уровни тестирования и что на каждом уровне проверить

Unit tests оченьбыстрые,вCIнакаждомпушеочень быстрые, в CI на каждом пушеоченьбыстрые,вCIнакаждомпуше Валидация входа (сумма>0, формат счёта, валюта, лимиты).Логика расчёта комиссий и округления.Логика idempotency обработкаповторныхзапросовстемжеidempotency−keyобработка повторных запросов с тем же idempotency-keyобработкаповторныхзапросовстемжеidempotencykey.Алгоритмы блокировки/брони баланса holdholdhold / освобождения.Обработка ошибок и маппинг исключений.Логику формирования бухгалтерских проводок debit/creditentriesdebit/credit entriesdebit/creditentries.Мокировать репозитории, внешние адаптеры.Integration tests интеграциясБД,очередями,репозиториямиинтеграция с БД, очередями, репозиториямиинтеграциясБД,очередями,репозиториями Полный поток перевода: API → сервис → БД → очередь/сервис нотификаций → ledger.Транзакционность и откат при выбросах исключений.Конкурентные сценарии на реальной БД raceconditions,deadlocksrace conditions, deadlocksraceconditions,deadlocks.Поведение при реальных сетевых таймаутах и повторных попытках.Использовать Testcontainers/real Postgres, KafkaRedpandaRedpandaRedpanda или очередь.Contract tests межсервисныеконтрактымежсервисные контрактымежсервисныеконтракты Контракты с внешними шлюзами/банками, fraud-сервисом, нотификациями, clearing house.Consumer-driven контракт PactPactPact: проверять, что потребители и провайдеры договорились о структуре запросов/ошибок и статус-кодов.Покрывать успешные ответы и все типовые ошибки 400/402/409/500400/402/409/500400/402/409/500 & тела ошибок.End-to-end / Staging tests
Полный кейс со всеми реальными интеграциями в staging илис«виртуализацией»внешнихбанков,нореальныеочереди/БДили с «виртуализацией» внешних банков, но реальные очереди/БДилис«виртуализацией»внешнихбанков,нореальныеочереди/БД.Проверка reconciliation batch'ей и отчетов.Load / Performance / Stress tests
Throughput, latency, 95/99 перцентиль, поведение при росте конкуренции за одни и те же счета.Стресс до момента деградации и recovery.Soak длительнаянагрузкадлительная нагрузкадлительнаянагрузка для поиска утечек ресурсов.Chaos / Resilience tests
Имитация падения внешних сервисов, сетевых разрывов, обрыва связи с БД, убийства процесса в ключевой точке.

2) Конкретные тестовые сценарии и пограничные случаи
разбитыепокатегориям—минимальнопокрытьэтикейсыразбитые по категориям — минимально покрыть эти кейсыразбитыепокатегориямминимальнопокрытьэтикейсы

Валидация и бизнес-правила

Сумма = 0 — отклонить.Сумма < 0 — отклонить.Сумма = максимально допустимой limitlimitlimit — пройти/отклонить в зависимости от правил.Перевод между одинаковыми счетами — reject илиno−opили no-opилиnoop, явно протестировать.Неверный формат номера счёта — 400.Валюты разные: перевод внутри валюты и cross-currency с курсом/комиссией + округление.Минимальная допустимая сумма еслиестьесли естьеслиесть — граничные значения.

Баланс и лимиты

Сумма > available_balance — отклонить insufficientfundsinsufficient fundsinsufficientfunds.Сумма = available_balance — должно пройти balance→0balance → 0balance0.Наличие holds/резервов: сумма > available_free_balance но < total_balance — отклонить.Превышение суточного/месячного лимита — отклонить.

Атомарность и частичные отказы

Симуляция «списание прошло, зачисление упало» например,сервисcrashпослеcommitнапример, сервис crash после commitнапример,сервисcrashпослеcommit — система должна либо откатить списание еслиACIDесли ACIDеслиACID либо инициировать компенсацию sagasagasaga и вернуть корректный статус/уведомление.Проверить idempotency: повторный запрос с тем же idempotency-key не приводит к дублированию проводок.Повторный запрос без idempotency-key — может привести к созданию второй операции тестожиданийтест ожиданийтестожиданий.Сценарий: таймаут при обработке, клиент ретраит — проверить итоговый баланс нетдвойногосписаниянет двойного списаниянетдвойногосписания.

Concurrency / double-spend

Параллельные списания с общей суммы (N параллельных запросов, суммарно > balance) — гарантировать, что сумма списаний ≤ balance, правильно посылается ошибка для проигравших транзакций.Модель блокировок optimisticvspessimisticoptimistic vs pessimisticoptimisticvspessimistic — протестировать оба сценария, провоцируя конфликт транзакций.Deadlock simulation: несколько параллельных переводов между теми же счетами в разных направлениях.

Идентичность и безопасность

Попытка перевода от имени чужого пользователя/без авторизации — 401/403.Tampering с полями например,указаниечужогоaccountidнапример, указание чужого account_idнапример,указаниечужогоaccounti d — reject.Тест на rate limiting и brute force защитаотDDOS/массовыхпереводовзащита от DDOS/массовых переводовзащитаотDDOS/массовыхпереводов.

Крайние суммы / точность

Очень большая сумма nearsystem/DBlimitnear system/DB limitnearsystem/DBlimit — корректная обработка/ошибка.Проверка округления при cents/fractions в разных валютах.Перевод минимальных дробных значений.

Внешние взаимодействия

Ошибки и коды ответов от банком-шлюза: 400/402/429/500 — как система реагирует retry,fail,compensateretry, fail, compensateretry,fail,compensate.Сообщения о fraud — при получении риска перевод блокируется.Очереди: потеря/дублирование сообщений — idempotency должен справляться.

Разные состояния счетов

Счёт закрыт / заморожен / under review — переводы запрещены/требуют дополнительной проверки.Рестрикции/blacklist — отказывать.

Reconciliation / consistency checks

После серии переводов баланс на счётах соответствует сумме операций ledgerentriesсуммируютсяledger entries суммируютсяledgerentriesсуммируются.Batch reconciliation job: тест на idempotency/реcovery после частичной обработки.

3) Стратегии мокирования и виртуализации

Unit tests: мокировать все внешние зависимости — репозитории, внешние API, очередь/producer. Использовать фреймворки моков mockito/sinon/unittest.mockmockito / sinon / unittest.mockmockito/sinon/unittest.mock.Integration: использовать real DB TestcontainersPostgreSQLTestcontainers PostgreSQLTestcontainersPostgreSQL, real message broker Kafka/TestcontainersKafka/TestcontainersKafka/Testcontainers, но мокировать внешние банковские шлюзы и fraud-сервисы; либо использовать локальные stub-servers.Contract tests: вместо общего мока делаем контрактные тесты PactPactPact между вашим модулем и каждым внешним сервисом. Это предотвратит несовпадение контрактов.Service virtualization: для тестирования взаимодействия с внешними банками/clearing houses использовать виртуализацию WireMock,MountebankWireMock, MountebankWireMock,Mountebank с набором сценарием успех/латентность/400/500успех/латентность/400/500успех/латентность/400/500.Симуляция частичных сбоев: в интеграционных/staging тестах искусственно задерживать/сбрасывать ответы от внешнего сервиса, вызывать исключения, прерывать процессы killkillkill, чтобы проверить компенсации и retries.Фейковые очереди vs реальные очереди: unit — mock; integration — real queue в контейнере; e2e staging — реальная интеграция с продовой очередью есливозможноесли возможноесливозможно.Time mocking: для тестов лимитов по времени/суточных лимитов — подменять время вставлятьtestclockвставлять test clockвставлятьtestclock вместо system clock.Feature toggles: если есть флаги, тестировать оба поведения с включенным/выключенным.DB fixtures: seed data + transactional tests rollbackпослетестаrollback после тестаrollbackпослетеста. Для интеграции использовать миграции и тестовый набор данных.

4) Инструменты и метрики тестирования

Unit: JUnit/NUnit/Pytest + mock frameworks.Integration: Testcontainers Postgres,KafkaPostgres, KafkaPostgres,Kafka, WireMock/Mountebank.Contract: Pact, Spring Cloud Contract.Load: k6, Gatling, JMeter — сценарии с высоким параллелизмом, долгие тесты soaksoaksoak.Chaos: Chaos Monkey, Gremlin, или локальные скрипты.CI: unit + contract on PR; integration on nightly or merge-to-main; smoke + sanity on staging on deploy; load/chaos pre-release or scheduled.Метрики: процент успешных транзакций, latency P95/P99, rate of insufficient_funds, rate of partial_failures, DB deadlocks per minute, queue lag, retry counts.

5) Реализация сценариев частичных отказов рекомендациирекомендациирекомендации

Design: использовать single DB transaction for debit+credit when both accounts in same DB instance + append-only ledger table; или если распределённые сервисы — использовать saga pattern с компенсирующими транзакциями + idempotency.Idempotency: явные idempotency-key на уровне API + persist результата операции success/failuresuccess/failuresuccess/failure — при повторном запросе возвращать ранее вычисленный результат.Retry policy: exponential backoff, лимит попыток, distinguish transient vs permanent errors.Observability: добавьте корреляционные id trace−idtrace-idtraceid, audit trail, события для reconciliation.Reconciliation job: периодическая сверка ledger vs balances и автоматические/ручные механизмы исправления.

6) Приоритеты тестов чтоделатьпреждевсегочто делать прежде всегочтоделатьпреждевсего

Unit tests для критичной логики идемпотентность,валидация,расчёткомиссийидемпотентность, валидация, расчёт комиссийидемпотентность,валидация,расчёткомиссий.Integration tests на атомарность переводов и конкурентные сценарии на реальной БД чтобыисключитьraceconditionsчтобы исключить race conditionsчтобыисключитьraceconditions.Contract tests с внешними провайдерами bankgateway,fraud,notificationbank gateway, fraud, notificationbankgateway,fraud,notification.Тесты на частичные отказы симуляциисписание→падениесимуляции списание→падениесимуляциисписаниепадение.Load tests на сценарии высокой конкуренции за одни счета найтиdeadlocks/lockcontentionнайти deadlocks / lock contentionнайтиdeadlocks/lockcontention.E2E в staging с виртуализацией внешних партнёров перед релизом.

7) Примеры конкретных тест-кейсов короткокороткокоротко

TC1: Happy path — перевод X между разными валюта=RUB accounts, комиссия Y = 1%, проверка ledger 2записи2 записи2записи, баланс корректен.TC2: amount = 0 — API 400, никаких записей в ledger.TC3: amount negative — 400.TC4: insufficient funds — 402/409, никаких кредитов.TC5: idempotency retry — client повторно постит тот же idempotency-key; только один debit/credit в ledger.TC6: concurrent 10 запросов по 1000 ₽ при balance=5000 ₽ — суммарно не больше 5000 списано, остальные получают error.TC7: debit committed, then crash before credit — reconciliation job выявляет несоответствие и запускает компенсацию / уведомляет оператора.TC8: external bank returns 429 then 200 on retry — retry логика с backoff успешно завершает.TC9: cross-currency rounding — сумма в cents/kopecks правильно округлена и ledger баланс совпадает.TC10: transfer to frozen account — reject 403.

8) Рекомендации по средам и CI

Fast pipeline PRPRPR: unit + static analysis + contract tests.Merge pipeline: integration tests TestcontainersTestcontainersTestcontainers.Nightly: full integration + chaos + heavier load tests.Pre-release: run load tests & e2e against staging with service virtualization for externals.Post-deploy productionproductionproduction: smoke tests + continuous reconciliation + alerts when reconciliation mismatch > threshold.

9) Дополнительно — безопасность и соответствие

Тесты авторизации/аудита/логирования транзакций.Проверка на SQL/NoSQL инъекции, tampering, CSRF еслибраузерныйфронтендесли браузерный фронтендеслибраузерныйфронтенд.GDPR/PCI: минимизация логов нелогироватьPANsне логировать PANsнелогироватьPANs, проверка шифрования канала передачи и хранения.

Если нужно, могу:

Составить подробный набор тест-кейсов в табличном виде название,предусловия,шаги,ожидаемыйрезультатназвание, предусловия, шаги, ожидаемый результатназвание,предусловия,шаги,ожидаемыйрезультат.Подготовить примеры contract-спесификаций PactPactPact и сценариев WireMock для внешних банков.Предложить конкретные сценарии нагрузочного тестирования с параметрами TPS,concurrency,длительностьTPS, concurrency, длительностьTPS,concurrency,длительность исходя из ожидаемой нагрузки вашего сервиса — укажите target QPS/пики и размер инфраструктуры.
12 Окт в 15:36
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир