Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
BarinovIN opened this issue Apr 26, 2023 · 3 comments

Comments

@BarinovIN
Copy link

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

Недействительный адрес или не найден родительский сеанс задания
{ВнешняяОбработка.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
Copy link
Author

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

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

Причина:

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

Решение:

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

Вопросы:

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

@artbear
Copy link
Collaborator

artbear commented Jul 16, 2023

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

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

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

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

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

@BarinovIN
Copy link
Author

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants