[BUG] Иногда не загружаются файлы дымовых тестов с ошибкой на операции ядра ПоместитьВоВременноеХранилище
Описание ошибки Запуск дымовых тестов в пакетном режиме иногда не срабатывает с ошибкой:
Недействительный адрес или не найден родительский сеанс задания
{ВнешняяОбработка.xddTestRunner.МодульОбъекта(187)}: ПоместитьВоВременноеХранилище(НастройкиПродукта, АдресВременногоХранилища);
Воспроизводится нестабильно, условия воспроизведения непонятны. Перезапуск без каких-либо изменений приводит к успешному выполнению. Падает с такой ошибкой один из нескольких запусков.
Ошибка стала выводиться после исправлений из #1096, до этого просто было сообщение о том, что не найдено загруженных тестов, как и описано в #1095
Окружение:
Техническая информация:
- Версия Vanessa-ADD: 6.9.4
- Имя конфигурации: СовсемНеТиповая
- Платформа 1С: 8.3.19.1351
- Тип базы: Клиент-серверная ИБ
- Режим запуска: Управляемое приложение (Тонкий клиент)
- Режим совместимости (для TestManager): Версия8_3_14
- Режим совместимости интерфейса (для TestManager): ТаксиРазрешитьВерсия8_2
- Режим синхронности: включен
- Защита от опасных действий: выключен
- Язык (для TestManager): Русский
- Локализация (для TestManager): ru_RU
- Операционная система (клиент): Windows x86-64 Microsoft Windows 10 version 10.0 (Build 19044)
- Операционная система (сервер): Windows x86-64 Microsoft Windows 8.1 version 6.3 (Build 9600)
- Активные расширения:
Дополнительный контекст Полный текст ошибки:
Недействительный адрес или не найден родительский сеанс задания
{ВнешняяОбработка.xddTestRunner.МодульОбъекта(187)}: ПоместитьВоВременноеХранилище(НастройкиПродукта, АдресВременногоХранилища);
{ВнешняяОбработка.xddTestRunner.МодульОбъекта(108)}: Возврат ПлагинИзСерверногоКеша(Имя);
{ВнешняяОбработка.xddTestRunner.МодульОбъекта(143)}: Плагин = КонтекстЯдра.Плагин(ИмяПлагина);
{ВнешняяОбработка.ЗагрузчикФайла.Форма.Форма.Форма(589)}: КонтекстЯдра.ИнициализацияНаСервере(ОбъектКонтекстаЯдра);
{ВнешняяОбработка.ЗагрузчикФайла.Форма.Форма.Форма(241)}: КонтекстЯдра = ПолучитьКонтекстЯдраНаСервере(ОбъектКонтекстаЯдра);
{ВнешняяОбработка.ЗагрузчикФайла.Форма.Форма.Форма(157)}: КонтейнерССервернымиТестамиОбработки = ЗагрузитьФайлНаСервере(ФайлОбработки.ПолноеИмя, ИмяОбработки,
{ВнешняяОбработка.ЗагрузчикКаталога.Форма.Форма.Форма(185)}: ДеревоТестовФайла = ЗагрузчикФайла.Загрузить(КонтекстЯдра, ФайлОбработки.ПолноеИмя);
{ВнешняяОбработка.ЗагрузчикКаталога.Форма.Форма.Форма(171)}: КонтейнерФайла = ЗагрузитьФайл(КонтекстЯдра, Файл);
{ВнешняяОбработка.ЗагрузчикКаталога.Форма.Форма.Форма(38)}: ДеревоТестов = ЗагрузитьКаталог(КонтекстЯдра, КаталогДляЗагрузки);
{ВнешняяОбработка.xddTestRunner.Форма.УправляемаяФорма.Форма(1785)}: ДеревоТестовОтЗагрузчика = Загрузчик.Загрузить(ЭтаФорма, ПутьКТестам);
{ВнешняяОбработка.xddTestRunner.Форма.УправляемаяФорма.Форма(1466)}: РезультатыТестирования = ЗагрузитьИВыполнитьТесты_ПакетныйРежим(ПараметрыЗапуска.Параметры_xddRun);
{ВнешняяОбработка.xddTestRunner.Форма.УправляемаяФорма.Форма(1410)}: ВыполнитьПакетныйЗапускСинхронно(НастройкиШагов);
{ВнешняяОбработка.xddTestRunner.Форма.УправляемаяФорма.Форма(98)}: ВыполнитьПакетныйЗапуск(ПараметрЗапуска);
{ВнешняяОбработка.xddTestRunner.Форма.УправляемаяФорма.Форма(399)}: ПриОткрытииЗавершение();
{ВнешняяОбработка.xddTestRunner.Форма.УправляемаяФорма.Форма(392)}: ЗагрузкаПлагиновЗавершение();
{ВнешняяОбработка.xddTestRunner.Форма.УправляемаяФорма.Форма(356)}: ПодключитьНайденныеКлиентскиеПлагины(ПомещенныеФайлы, ДополнительныеПараметры.ИдентификаторыПлагинов);
{(1)}:ОписаниеОповещения.Модуль.ОбработчикПоискаКлиентскихПлагиновЗавершение(Результат, ОписаниеОповещения.ДополнительныеПараметры)
{ВнешняяОбработка.xddTestRunner.Форма.МодульАсинк.Форма(205)}: Выполнить("ОписаниеОповещения.Модуль." + ОписаниеОповещения.ИмяПроцедуры + "(Результат, ОписаниеОповещения.ДополнительныеПараметры)");
{ВнешняяОбработка.xddTestRunner.Форма.МодульАсинк.Форма(614)}: смв_ВыполнитьОбработкуОповещения(ОписаниеОповещенияОЗавершении, ПомещенныеФайлы);
{ВнешняяОбработка.xddTestRunner.Форма.УправляемаяФорма.Форма(341)}: АСинк().смв_ПоместитьФайлы(ОписаниеЗавершения, ПомещаемыеФайлы);
{(1)}:ОписаниеОповещения.Модуль.ОбработчикПоискаКлиентскихПлагинов(Результат, ОписаниеОповещения.ДополнительныеПараметры)
{ВнешняяОбработка.xddTestRunner.Форма.МодульАсинк.Форма(205)}: Выполнить("ОписаниеОповещения.Модуль." + ОписаниеОповещения.ИмяПроцедуры + "(Результат, ОписаниеОповещения.ДополнительныеПараметры)");
{ВнешняяОбработка.xddTestRunner.Форма.МодульАсинк.Форма(991)}: смв_ВыполнитьОбработкуОповещения(ОписаниеОповещенияОЗавершении, Результат);
{ВнешняяОбработка.xddTestRunner.Форма.УправляемаяФорма.Форма(294)}: АСинк().смв_НайтиФайлы(ОбработчикПоискаКлиентскихПлагинов,
{ВнешняяОбработка.xddTestRunner.Форма.УправляемаяФорма.Форма(81)}: ЗагрузитьПлагины();
по причине:
Недействительный адрес или не найден родительский сеанс задания
Сценарий воспроизведения:
- Запустить два и более сеансов выполнения тестов в пакетном режиме на одной базе, сеансы менеджера тестирования под одним пользователем.
- При некотором совпадении по времени процессов загрузки и инициализации плагинов, в некоторых сеансах возникнет указанная ошибка.
Причина:
Адрес во временном хранилище, который имеет смысл только в своём сеансе, хранится в хранилище общих настроек и через него передаётся между сеансами. Очередной сеанс получает из общих настроек и пытается использовать не свой адрес. В результате падает.
Решение:
- Отказаться от хранения этого адреса в хранилище общих настроек. Адрес же уже хранится в реквизите объекта ядра.
- При инициализации серверного контекста передавать этот адрес из клиентского контекста в методе ИнициализацияНаСервере.
Вопросы:
- Есть ли ещё случаи, когда серверный контекст инициализируется иначе и адрес не удаётся передать из реквизита объекта клиентского контекста? Вроде бы контекст ядра доступен везде.
Есть ли ещё случаи, когда серверный контекст инициализируется иначе и адрес не удаётся передать из реквизита объекта клиентского контекста? Вроде бы контекст ядра доступен везде.
@BarinovIN в некоторых тестах контекст ядра создается пустым поищи по ВнешниеОбработки.Создать("xddTestRunner")
именно поэтому я не использую передачу из клиентского контекста
но идея правильная, конечно, при параллельном выполнении могут быть проблемы.
Возможно, стоит переделать на хранение ид сеанса в общем хранилище и привязки данных к нему.
Возможно, стоит переделать на хранение ид сеанса в общем хранилище и привязки данных к нему.
Да, можно делить по номеру сеанса. Так и сделал.