Тестовая среда SMS API: как отделить sandbox от production

Тестовая среда SMS API нужна, чтобы проверять интеграцию без случайной рассылки клиентам и лишних расходов. Но sandbox полезен только тогда, когда его ограничения понятны. Успешный виртуальный ответ не доказывает, что оператор примет Sender ID, реальное сообщение уложится в сегменты, а DLR придёт с тем же временем и порядком.
Безопасная схема сочетает три уровня: локальные тесты без сети, sandbox или эмулятор контракта и небольшой production-тест на разрешённые номера.
Жёсткое разделение сред
У sandbox и production должны различаться:
- API endpoint;
- ключи и секреты;
- аккаунты или проекты;
- очереди и базы данных;
- webhook URL;
- Sender ID;
- бюджеты и лимиты;
- панели мониторинга.
Переключатель не должен зависеть от строки, которую разработчик меняет вручную перед запуском. Среда задаётся конфигурацией развёртывания, а production-ключ физически недоступен тестовому контуру.
Allowlist как второй предохранитель
Даже в staging полезно разрешить отправку только на заранее утверждённые номера команды. Если тестовая конфигурация случайно указывает на production API, allowlist остановит выгрузку клиентской базы.
Проверку ставят в собственном сервисе до SMS API. Она действует независимо от интерфейса кампании и блокирует любой путь отправки. Для тестовых адресатов сохраняют согласованный лимит частоты, чтобы автоматические тесты не создавали сотни реальных сообщений.
Что должен уметь sandbox
Хорошая тестовая среда возвращает стабильный message ID, позволяет выбирать сценарий ответа и отправляет webhook с документированной схемой. Нужны случаи:
- успешный приём;
- синхронная валидационная ошибка;
- 401 или 403;
- rate limit;
- 5xx и таймаут;
- delivered, expired и permanent failure;
- дублированный webhook;
- webhook до или после ожидаемого времени;
- неизвестный статус для проверки fallback.
Если официальный sandbox не поддерживает нужные ветки, добавьте собственный mock-сервер, построенный по контракту. Он не заменяет провайдера, но делает ошибки воспроизводимыми.
Локальные тесты
Большая часть логики не требует реальной SMS: парсинг номера, рендер шаблона, подсчёт сегментов, ключ идемпотентности, маппинг кодов и переходы статусов. Эти тесты должны быть быстрыми и запускаться при каждом изменении.
Записывайте примеры ответов как fixtures с версией контракта. Не копируйте в репозиторий реальные номера, тексты и секреты из production.
Тестовые DLR
Webhook sandbox должен проходить тот же код проверки, что и production: аутентификацию, дедупликацию, поиск message ID и маппинг статуса. Отдельная «упрощённая тестовая ветка» часто скрывает реальные ошибки.
Для проверки подписи используйте тестовый секрет, а не отключайте защиту. Проверьте повтор события, старую метку времени и изменение тела запроса.
Что sandbox не доказывает
Виртуальная среда обычно не воспроизводит:
- реальную скорость маршрута и операторов;
- регистрацию Sender ID;
- фильтры содержания;
- MNP и роуминг;
- фактическое число сегментов в биллинге;
- время появления DLR;
- поведение устройства абонента;
- производственную квоту и стоимость.
Поэтому перед релизом нужен ограниченный реальный запуск. Это не массовая тестовая SMS-рассылка, а техническая проверка интеграции на контролируемых номерах основных операторов.
Переход в production
Production включают по чек-листу:
- Контрактные тесты проходят на текущей версии API.
- Webhook доступен снаружи и проверяет подлинность.
- Ключи находятся в хранилище секретов.
- Настроены rate limit, очередь и TTL.
- Allowlist staging не затрагивает production-сценарий ошибочно.
- Бюджет и дневной лимит минимальны для первого запуска.
- Мониторинг и кнопка остановки проверены.
- Первая отправка идёт на небольшой canary-набор.
Не переносите базу тестовых message ID и DLR в производственную аналитику. Среда должна быть обязательным измерением каждой записи и метрики.
Тестовые данные
Используйте синтетические контакты и события. Если без копии production не обойтись, данные обезличивают и минимизируют. Замена только имени недостаточна, когда остаются телефон, заказ и текст.
Для проверок граничной длины создавайте искусственные строки. Они лучше реальных персональных данных и позволяют точно воспроизводить сценарий.
Контроль случайной отправки
Помимо allowlist полезны нулевой или очень низкий бюджет тестового аккаунта, отдельный Sender ID и алерт на любое production-сообщение из нерабочей среды. Сервис должен записывать имя среды рядом с correlation ID.
Команда периодически выполняет упражнение: неправильный endpoint, production-похожий ключ и большая тестовая аудитория. Ожидаемый результат — блокировка до первого реального SMS.
Итог
Sandbox снижает риск, но не является копией мобильной сети. Надёжный процесс разделяет ключи и данные, использует allowlist, воспроизводимые ответы и тестовые DLR, а затем подтверждает ограниченный реальный путь. Ценность тестовой среды — не в зелёном ответе, а в безопасной проверке всех веток интеграции.