Поставьте задачу по тестированию: проект — банковский модуль перевода денег между счетами; какие уровни тестов (юнит, интеграция, контрактные, нагрузочные), конкретные сценарии пограничных случаев и стратегии мокирования вы бы включили, чтобы снизить риск критических ошибок в продакшене?
Ниже — комплект задачи по тестированию банковского модуля переводов между счетами: уровни тестов, конкретные сценарии особеннопограничныеособенно пограничныеособеннопограничные, стратегии мокирования/виртуализации, рекомендации по средам и CI, и приоритеты. Задача ориентирована на снижение риска критических ошибок в продакшене двойноесписание,потерясредств,рассинхрондвойное списание, потеря средств, рассинхрондвойноесписание,потерясредств,рассинхрон.
Коротко — ключевые цели тестирования
Гарантировать атомарность перевода либосписание+зачисление,либоничеголибо списание + зачисление, либо ничеголибосписание+зачисление,либоничего.Предотвратить двойное списание при ретраях/конкуренции.Обрабатывать частичные отказы внешних систем корректно компенсация/откаткомпенсация / откаткомпенсация/откат.Корректность валидации, округлений, лимитов, валют.Производительность и устойчивость под пиковыми нагрузками.
1) Уровни тестирования и что на каждом уровне проверить
Unit tests оченьбыстрые,вCIнакаждомпушеочень быстрые, в CI на каждом пушеоченьбыстрые,вCIнакаждомпуше
Валидация входа (сумма>0, формат счёта, валюта, лимиты).Логика расчёта комиссий и округления.Логика idempotency обработкаповторныхзапросовстемжеidempotency−keyобработка повторных запросов с тем же idempotency-keyобработкаповторныхзапросовстемжеidempotency−key.Алгоритмы блокировки/брони баланса 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илиno−op, явно протестировать.Неверный формат номера счёта — 400.Валюты разные: перевод внутри валюты и cross-currency с курсом/комиссией + округление.Минимальная допустимая сумма еслиестьесли естьеслиесть — граничные значения.
Баланс и лимиты
Сумма > available_balance — отклонить insufficientfundsinsufficient fundsinsufficientfunds.Сумма = available_balance — должно пройти balance→0balance → 0balance→0.Наличие 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например,указаниечужогоaccountid — 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.
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-idtrace−id, 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 с виртуализацией внешних партнёров перед релизом.
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/пики и размер инфраструктуры.
Ниже — комплект задачи по тестированию банковского модуля переводов между счетами: уровни тестов, конкретные сценарии особеннопограничныеособенно пограничныеособеннопограничные, стратегии мокирования/виртуализации, рекомендации по средам и CI, и приоритеты. Задача ориентирована на снижение риска критических ошибок в продакшене двойноесписание,потерясредств,рассинхрондвойное списание, потеря средств, рассинхрондвойноесписание,потерясредств,рассинхрон.
Коротко — ключевые цели тестирования
Гарантировать атомарность перевода либосписание+зачисление,либоничеголибо списание + зачисление, либо ничеголибосписание+зачисление,либоничего.Предотвратить двойное списание при ретраях/конкуренции.Обрабатывать частичные отказы внешних систем корректно компенсация/откаткомпенсация / откаткомпенсация/откат.Корректность валидации, округлений, лимитов, валют.Производительность и устойчивость под пиковыми нагрузками.1) Уровни тестирования и что на каждом уровне проверить
Unit tests оченьбыстрые,вCIнакаждомпушеочень быстрые, в CI на каждом пушеоченьбыстрые,вCIнакаждомпуше Валидация входа (сумма>0, формат счёта, валюта, лимиты).Логика расчёта комиссий и округления.Логика idempotency обработкаповторныхзапросовстемжеidempotency−keyобработка повторных запросов с тем же idempotency-keyобработкаповторныхзапросовстемжеidempotency−key.Алгоритмы блокировки/брони баланса 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илиno−op, явно протестировать.Неверный формат номера счёта — 400.Валюты разные: перевод внутри валюты и cross-currency с курсом/комиссией + округление.Минимальная допустимая сумма еслиестьесли естьеслиесть — граничные значения.Баланс и лимиты
Сумма > available_balance — отклонить insufficientfundsinsufficient fundsinsufficientfunds.Сумма = available_balance — должно пройти balance→0balance → 0balance→0.Наличие 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-idtrace−id, 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/пики и размер инфраструктуры.