add icon indicating copy to clipboard operation
add copied to clipboard

[BUG] Иногда не загружаются файлы дымовых тестов с ошибкой на операции ядра ПоместитьВоВременноеХранилище

Open BarinovIN opened this issue 2 years ago • 3 comments

Описание ошибки Запуск дымовых тестов в пакетном режиме иногда не срабатывает с ошибкой:

Недействительный адрес или не найден родительский сеанс задания
{ВнешняяОбработка.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 avatar Apr 26 '23 12:04 BarinovIN

Сценарий воспроизведения:

  1. Запустить два и более сеансов выполнения тестов в пакетном режиме на одной базе, сеансы менеджера тестирования под одним пользователем.
  2. При некотором совпадении по времени процессов загрузки и инициализации плагинов, в некоторых сеансах возникнет указанная ошибка.

Причина:

Адрес во временном хранилище, который имеет смысл только в своём сеансе, хранится в хранилище общих настроек и через него передаётся между сеансами. Очередной сеанс получает из общих настроек и пытается использовать не свой адрес. В результате падает.

Решение:

  • Отказаться от хранения этого адреса в хранилище общих настроек. Адрес же уже хранится в реквизите объекта ядра.
  • При инициализации серверного контекста передавать этот адрес из клиентского контекста в методе ИнициализацияНаСервере.

Вопросы:

  1. Есть ли ещё случаи, когда серверный контекст инициализируется иначе и адрес не удаётся передать из реквизита объекта клиентского контекста? Вроде бы контекст ядра доступен везде.

BarinovIN avatar May 03 '23 09:05 BarinovIN

Есть ли ещё случаи, когда серверный контекст инициализируется иначе и адрес не удаётся передать из реквизита объекта клиентского контекста? Вроде бы контекст ядра доступен везде.

@BarinovIN в некоторых тестах контекст ядра создается пустым поищи по ВнешниеОбработки.Создать("xddTestRunner")

именно поэтому я не использую передачу из клиентского контекста

но идея правильная, конечно, при параллельном выполнении могут быть проблемы.

Возможно, стоит переделать на хранение ид сеанса в общем хранилище и привязки данных к нему.

artbear avatar Jul 16 '23 14:07 artbear

Возможно, стоит переделать на хранение ид сеанса в общем хранилище и привязки данных к нему.

Да, можно делить по номеру сеанса. Так и сделал.

BarinovIN avatar Aug 31 '23 12:08 BarinovIN