Сводка
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
Сводка
Live
WRITE_SANDBOXsmoke теперь выполняет все 77 мутационных команд матрицы черезdirect --sandbox ...противapi-sandbox.direct.yandex.com.Результат последнего запуска:
Это ожидаемый результат для песочницы, а не регрессия 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 foundadgroups.update/delete,ads.*,keywords.*,bids.*,keywordbids.*,audiencetargets.*,bidmodifiers.delete/set,feeds.update/delete,retargeting.update/delete3500 Not supporteddynamicads.*,dynamicfeedadtargets.*,smartadtargets.*1000 The service is temporarily unavailable,1002 Operation error,5005 Field set incorrectly / Не удалось загрузить видеоsitelinks.*,adimages.delete,advideos.add,creatives.add8300 Invalid object status,8303 Cannot archive objectcampaigns.resume,campaigns.suspend,campaigns.archiveNOT_COVEREDclients.updateПокрытие PASS
Следующие классы команд подтверждены как работающие вживую в песочнице:
adextensions.add/deleteadgroups.addadimages.addbidmodifiers.addcampaigns.add/delete/unarchive/updatefeeds.addnegativekeywordsharedsets.add/delete/updateretargeting.addstrategies.add/archive/unarchive/updatevcards.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.WRITE_SANDBOX.scripts/test_sandbox_write.sh.clients.updateкакNOT_COVEREDдо появления безопасной стратегии фикстур для аккаунта.Последняя верификация
Команда:
Результат: