Skip to content

Smoke-тесты WRITE_SANDBOX вживую: 20 PASS, 56 ограничений песочницы, 0 неожиданных ошибок #96

Description

@axisrow

Сводка

Live WRITE_SANDBOX smoke теперь выполняет все 77 мутационных команд матрицы через direct --sandbox ... против api-sandbox.direct.yandex.com.

Результат последнего запуска:

WRITE_SANDBOX команды: 77
PASS: 20
SANDBOX_LIMITATION: 56
FAIL: 0
NOT_COVERED: 1

Это ожидаемый результат для песочницы, а не регрессия CLI:

  • FAIL: 0 — неожиданных сбоев CLI/API не обнаружено.
  • PASS: 20 — эти команды успешно выполнены через live sandbox API.
  • SANDBOX_LIMITATION: 56 — команда дошла до API Яндекс Директа, но столкнулась с известным ограничением песочницы.
  • NOT_COVERED: 1 — это clients.update, которая требует специфичных для аккаунта существующих клиентских данных и пока небезопасна для автоматической генерации в раннере.

Какие команды тестируются

Все 77 команд — мутационные (write/delete), то есть изменяют данные в Яндекс Директе. Read-only команды в этом тесте не участвуют — для них есть отдельный скрипт scripts/test_safe_commands.sh.

По типу операции:

Создание (add): adextensions.add, adgroups.add, adimages.add, bidmodifiers.add, campaigns.add, feeds.add, negativekeywordsharedsets.add, retargeting.add, strategies.add, vcards.add

Обновление (update): adgroups.update, campaigns.update, clients.update, feeds.update, negativekeywordsharedsets.update, retargeting.update, strategies.update

Удаление (delete): adextensions.delete, adgroups.delete, adimages.delete, campaigns.delete, feeds.delete, negativekeywordsharedsets.delete, vcards.delete

Управление жизненным циклом (suspend/resume/archive/unarchive): campaigns.resume, campaigns.suspend, campaigns.archive, campaigns.unarchive, strategies.archive, strategies.unarchive

Ставки и таргетинг: ads.*, keywords.*, bids.*, keywordbids.*, audiencetargets.*, bidmodifiers.delete/set

Специфичные ресурсы: dynamicads.*, smartadtargets.*, sitelinks.*, advideos.add, creatives.add

Почему проходят только 20 команд

Песочница не работает как полноценный production-подобный API для всех потоков записи. Многие команды зависят от ресурсов, созданных ранее в той же цепочке жизненного цикла, но песочница часто возвращает ID, а затем отклоняет последующие вызовы с ошибками «объект не найдён».

Ограничение Типичные коды/ошибки Затронутые семейства команд
Вложенные ресурсы не сохраняются или не могут быть найдены после создания 8800 Object not found, Ad group not found, Retargeting list not found, Adjustment not found, Feed not found adgroups.update/delete, ads.*, keywords.*, bids.*, keywordbids.*, audiencetargets.*, bidmodifiers.delete/set, feeds.update/delete, retargeting.update/delete
Неподдерживаемые типы кампаний/ресурсов в песочнице 3500 Not supported dynamicads.*, dynamicfeedadtargets.*, smartadtargets.*
Ограничения сервисов или загрузки, специфичные для песочницы 1000 The service is temporarily unavailable, 1002 Operation error, 5005 Field set incorrectly / Не удалось загрузить видео sitelinks.*, adimages.delete, advideos.add, creatives.add
Ограничения жизненного цикла черновых кампаний 8300 Invalid object status, 8303 Cannot archive object campaigns.resume, campaigns.suspend, campaigns.archive
Небезопасная автоматическая генерация предпосылок NOT_COVERED clients.update

Покрытие PASS

Следующие классы команд подтверждены как работающие вживую в песочнице:

  • adextensions.add/delete
  • adgroups.add
  • adimages.add
  • bidmodifiers.add
  • campaigns.add/delete/unarchive/update
  • feeds.add
  • negativekeywordsharedsets.add/delete/update
  • retargeting.add
  • strategies.add/archive/unarchive/update
  • vcards.add/delete

Покрытие SANDBOX_LIMITATION

56 строк SANDBOX_LIMITATION — это полезный сигнал. Они показывают, что CLI сформировал и отправил типизированные запросы через публичные команды в live sandbox API, и ответ API совпал с известными ограничениями песочницы, а не с неожиданными сбоями CLI.

Раннер в настоящее время трактует их как нестатусы регрессии и завершается с кодом 0, когда отчёт содержит только: PASS, SANDBOX_LIMITATION, NOT_COVERED. Он завершается с кодом 1 только если хотя бы одна строка имеет статус FAIL.

NOT_COVERED

clients.update остаётся в статусе NOT_COVERED.

Причина: безопасный live-сценарий требует существующих данных аккаунта/клиента. Раннер не должен автоматически создавать или изменять специфичные клиентские записи без явно безопасной стратегии фикстур.

Критерии приёмки

  • Сохранять FAIL: 0 как основной сигнал регрессии для scripts/test_sandbox_write.sh.
  • Рассматривать известные коды песочницы как полезное свидетельство отсутствия регрессии: 1000, 1002 (для adimages.delete), 3500, 5004, 5005, 8300, 8303, 8800.
  • Сохранять отчёт из 77 строк, соответствующих полной матрице WRITE_SANDBOX.
  • Не возвращать pytest/VCR/cassette replay в scripts/test_sandbox_write.sh.
  • Оставить clients.update как NOT_COVERED до появления безопасной стратегии фикстур для аккаунта.

Последняя верификация

Команда:

scripts/test_sandbox_write.sh

Результат:

WRITE_SANDBOX команды: 77
PASS: 20
SANDBOX_LIMITATION: 56
FAIL: 0
NOT_COVERED: 1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions