Тип: Строка. Содержит текст заголовка объекта без символов переноса строки.
Полное описание, параметры и ограничения
ТестируемоеПолеФормы.ТекстЗаголовка (TestedFormField.TitleText)
ТестируемоеПолеФормы (TestedFormField)
ТекстЗаголовка (TitleText)
Доступен, начиная с версии 8.3.1.
Использование:
Только чтение.
Описание:
Тип: Строка.
Содержит текст заголовка объекта без символов переноса строки.
Доступность:
Тонкий клиент, толстый клиент.
Использование в версии:
Доступен, начиная с версии 8.3.1.
Методическая информация
Практические примеры
Проверить своё поле ввода и кнопку: реальные состояния, ввод текста, пометка и восстановление
Полный UI-тест отдельного поля строки и кнопки собственной командной панели. Контролируются реальная идентичность, вид, заголовок, родители, подсказка и видимость; после ввода свой обработчик переключает ТолькоПросмотр и пометку, затем собственные данные и режим восстанавливаются.
Где и как запускать
Полный модуль управляемой формы МенеджерПолей85.Пульт: имя своей конфигурации возвращает серверная функция без контекста, UI выполняется в своём тонком /TESTMANAGER-клиенте8.5.1.1343; новый тонкий /TESTCLIENT той же пустой базы УчебныеПоляТестирования85 на вручную проверенном порту15382, Такси.
Подготовка
Создайте с нуля отдельную пустую конфигурацию УчебныеПоляТестирования85 на платформе8.5.1.1343; Управляемое приложение, Такси. Без прикладных объектов, общих реквизитов-разделителей, расширений, подписок и чужих обработчиков. В рабочей базе тесты не запускайте.
Общие формы → УчебныеПоля85, тип Управляемая. Вставьте полный дополнительный модуль fixture ниже и назначьте ПриСозданииНаСервере(Отказ, СтандартнаяОбработка). Не заменяйте реквизиты этой формы данными справочника или документа.
Добавьте реквизиты МеткаСеанса типа Строка, УчебныйТекст85 типа Строка длиной100 и РежимПросмотра типа Булево. РежимПросмотра не показывайте пользователю; он меняется только собственным обработчиком кнопки.
Добавьте группу ГруппаДанных85 обычного вертикального вида, заголовок Данные опыта. Внутри неё два отдельных поля ввода: МеткаСеанса только для просмотра и УчебныйТекст85 с заголовком Учебный текст, видимым заголовком и доступным редактированием. Это не колонки таблицы.
Добавьте отдельную группу ПанельРежима85 вида Командная панель. Внутри неё кнопку РежимПросмотра85 вида КнопкаКоманднойПанели, заголовок Только просмотр, Пометка=Ложь. Не заменяйте её обычной кнопкой вне панели: свойство Пометка предназначено для командной панели.
Создайте команду ПереключитьРежимПросмотра85 с одноимённым действием и свяжите с кнопкой РежимПросмотра85. Создайте команду СброситьСвойОпыт85 с одноимённым действием и кнопку именно СброситьСвойОпыт85. Обе команды ИзменяетСохраняемыеДанные=Ложь.
Создайте единственную учебную подсистему и общую команду ОткрытьУчебныеПоля85, без параметра, с модулем запуска ниже. Включите её в подсистему и покажите её кнопку; она открывает только свою ОбщаяФорма.УчебныеПоля85.
Обработки → МенеджерПолей85 → управляемая форма Пульт. Добавьте Согласие типа Булево, МеткаСеанса типа Строка, Итог типа Строка неограниченной длины, команду и кнопку ВыполнитьСвойТест с одноимённым действием. Основной код урока — полный модуль именно менеджера.
Назначьте менеджеру ПриОткрытии(Отказ). Покажите флажок согласия, поле ввода фактической метки и многострочный Итог только для просмотра. Никаких неизвестных входных объектов урок не требует.
Нажмите F7 и обновите только стенд. runtimeVerifiedScenarios=0: здесь 1С, приложение, тестируемые окна и соединения не запускались. Статическая проверка не доказывает фактическое отображение элементов.
Вручную запустите один тонкий клиент этой новой базы с /TESTCLIENT -TPort15382, другой с /TESTMANAGER. Администратор заранее выделяет этот собственный свободный локальный порт и убеждается, что его не занимает чужой клиент. Код ничего не запускает автоматически.
В тестируемом клиенте откройте свою форму. Исходно видны Книга, выключенная пометка кнопки и разрешённое редактирование. Скопируйте реальную метку из поля в менеджер; не генерируйте UUID в менеджере вместо собственного источника.
Установите согласие и выполните тест. На промежуточном шаге свой текст Учебная книга должен сохраниться при ТолькоПросмотр=Истина и пометке=Истина; повторное нажатие возвращает редактируемое состояние.
В завершении отдельная собственная кнопка сбрасывает только данные этой формы к Книга и исходному режиму. При ошибке очистки нажмите СброситьСвойОпыт85 вручную именно в своей форме. Клиент и форма не закрываются, документы, регистры и файлы не записываются.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Согласие = Ложь;
МеткаСеанса = "";
Итог = "Подготовьте свою форму в собственном клиенте /TESTCLIENT";
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвойСтенд()
Если Не Согласие Тогда
ВызватьИсключение "Подтвердите UI-тест только собственной формы в памяти";
КонецЕсли;
UUIDМетки = Новый УникальныйИдентификатор(МеткаСеанса);
Если Строка(UUIDМетки) <> МеткаСеанса Тогда
ВызватьИсключение "Скопируйте фактический UUID из своей формы, не создавайте метку в менеджере";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ПолучитьСвоюФорму(Приложение)
Заголовок = "Учебные поля85 " + МеткаСеанса;
Формы = Приложение.НайтиОбъекты(Тип("ТестируемаяФорма"), Заголовок, , 10);
Если ТипЗнч(Формы) <> Тип("ФиксированныйМассив") Или Формы.Количество() <> 1 Тогда
ВызватьИсключение "Нужна ровно одна реально подготовленная своя форма этого сеанса";
КонецЕсли;
Форма = Приложение.ПолучитьОбъект(Тип("ТестируемаяФорма"), Заголовок, , 10);
Метка = Форма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , "МеткаСеанса", 10);
Если Метка.ПолучитьПредставлениеДанных() <> МеткаСеанса Тогда
ВызватьИсключение "Форма не подтвердила настоящую метку сеанса";
КонецЕсли;
Возврат Форма;
КонецФункции
&НаКлиенте
Процедура ПроверитьСвоиЭлементы(Поле, Кнопка)
Если ТипЗнч(Поле) <> Тип("ТестируемоеПолеФормы") Или Поле.Имя <> "УчебныйТекст85"
Или Поле.Вид <> ВидПоляФормы.ПолеВвода Или Поле.ТекстЗаголовка <> "Учебный текст" Тогда
ВызватьИсключение "Нужно именно собственное отдельное поле ввода, не колонка рабочей таблицы";
КонецЕсли;
Если Не Поле.ТекущаяВидимость() Или Не Поле.ТекущаяДоступность() Или Не Поле.ЗаголовокОтображается() Тогда
ВызватьИсключение "Собственное поле должно быть видимым, доступным и с видимым заголовком";
КонецЕсли;
Если Поле.ПолучитьТекстПодсказки() <> "Введите только учебный текст без записи базы" Тогда
ВызватьИсключение "Подсказка не совпала с собственным fixture";
КонецЕсли;
Если ТипЗнч(Кнопка) <> Тип("ТестируемаяКнопкаФормы") Или Кнопка.Имя <> "РежимПросмотра85"
Или Кнопка.Вид <> ВидКнопкиФормы.КнопкаКоманднойПанели Или Кнопка.ТекстЗаголовка <> "Только просмотр" Тогда
ВызватьИсключение "Нужна своя кнопка командной панели, поддерживающая пометку";
КонецЕсли;
Если Не Кнопка.ТекущаяВидимость() Или Не Кнопка.ТекущаяДоступность() Тогда
ВызватьИсключение "Собственная кнопка должна быть видимой и доступной";
КонецЕсли;
РодительПоля = Поле.ПолучитьРодителя();
Если ТипЗнч(РодительПоля) <> Тип("ТестируемаяГруппаФормы") Или РодительПоля.Имя <> "ГруппаДанных85" Тогда
ВызватьИсключение "У поля не подтвердился фактический собственный родитель";
КонецЕсли;
РодительКнопки = Кнопка.ПолучитьРодителя();
Если ТипЗнч(РодительКнопки) <> Тип("ТестируемаяГруппаФормы") Или РодительКнопки.Имя <> "ПанельРежима85" Тогда
ВызватьИсключение "У кнопки не подтвердился фактический собственный родитель";
КонецЕсли;
ДочерниеПоля = Поле.ПолучитьПодчиненныеОбъекты();
ДочерниеКнопки = Кнопка.ПолучитьПодчиненныеОбъекты();
Если ТипЗнч(ДочерниеПоля) <> Тип("ФиксированныйМассив") Или ТипЗнч(ДочерниеКнопки) <> Тип("ФиксированныйМассив") Тогда
ВызватьИсключение "Нужны настоящие коллекции подчинённых объектов, не придуманные элементы";
КонецЕсли;
Сообщить("Фактические подчинённые: поле=" + Строка(ДочерниеПоля.Количество()) + "; кнопка=" + Строка(ДочерниеКнопки.Количество()));
КонецПроцедуры
&НаКлиенте
Функция ЗавершитьСвойТест(Приложение, Форма, ИсходныйЛимит)
Ошибки = "";
Если Форма <> Неопределено Тогда
Попытка
Сброс = Форма.ПолучитьОбъект(Тип("ТестируемаяКнопкаФормы"), , "СброситьСвойОпыт85", 10);
Сброс.Нажать();
Поле = Форма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , "УчебныйТекст85", 10);
Кнопка = Форма.ПолучитьОбъект(Тип("ТестируемаяКнопкаФормы"), , "РежимПросмотра85", 10);
Если Поле.ПолучитьПредставлениеДанных() <> "Книга" Или Поле.ТекущееТолькоПросмотр() Или Кнопка.ТекущееПометка() Тогда
ВызватьИсключение "Свои исходные данные и режим ещё не восстановлены";
КонецЕсли;
Исключение
Ошибки = "Не восстановлен свой опыт: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Если ТипЗнч(ИсходныйЛимит) = Тип("Число") Тогда
Попытка
Приложение.УстановитьМаксимальноеВремяВыполненияДействия(ИсходныйЛимит);
Исключение
Ошибки = Ошибки + " Не восстановлен фактический лимит: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Попытка
Приложение.РазорватьСоединение();
Исключение
Ошибки = Ошибки + " Разрыв соединения не подтверждён: " + ОписаниеОшибки();
КонецПопытки;
Возврат Ошибки;
КонецФункции
&НаКлиенте
Процедура ВыполнитьСвойТест(Команда)
ПроверитьСвойСтенд();
Приложение = Новый ТестируемоеПриложение("127.0.0.1", 15382);
СвояФорма = Неопределено;
ИсходныйЛимит = Неопределено;
ОшибкаТеста = "";
Итог = "Фактический результат ещё не получен";
Попытка
Приложение.УстановитьСоединение();
ИсходныйЛимит = Приложение.ПолучитьМаксимальноеВремяВыполненияДействия();
Приложение.УстановитьМаксимальноеВремяВыполненияДействия(10);
СвояФорма = ПолучитьСвоюФорму(Приложение);
Поле = СвояФорма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , "УчебныйТекст85", 10);
Кнопка = СвояФорма.ПолучитьОбъект(Тип("ТестируемаяКнопкаФормы"), , "РежимПросмотра85", 10);
ПроверитьСвоиЭлементы(Поле, Кнопка);
Если Поле.ПолучитьПредставлениеДанных() <> "Книга" Или Поле.ТекущееТолькоПросмотр() Или Кнопка.ТекущееПометка() Тогда
ВызватьИсключение "Исходный собственный опыт уже изменён; сначала выполните свой сброс";
КонецЕсли;
Поле.Активизировать();
Поле.ВвестиТекст("Учебная книга");
Кнопка.Активизировать();
Если Поле.ПолучитьПредставлениеДанных() <> "Учебная книга" Тогда
ВызватьИсключение "Настоящее введённое значение не подтвердилось";
КонецЕсли;
Кнопка.Нажать();
Если Не Кнопка.ТекущееПометка() Или Не Поле.ТекущееТолькоПросмотр() Тогда
ВызватьИсключение "Пометка кнопки и отдельное состояние ТолькоПросмотр поля не подтвердились";
КонецЕсли;
Если Поле.ПолучитьПредставлениеДанных() <> "Учебная книга" Тогда
ВызватьИсключение "Переключение режима не должно стирать собственные данные";
КонецЕсли;
Если Не Кнопка.ТекущаяДоступность() Тогда
ВызватьИсключение "Свою доступную кнопку нужно сохранить для обратного переключения";
КонецЕсли;
Кнопка.Нажать();
Если Кнопка.ТекущееПометка() Или Поле.ТекущееТолькоПросмотр() Тогда
ВызватьИсключение "Возврат в редактируемое состояние ещё не подтвердился";
КонецЕсли;
Итог = "Введён собственный учебный текст; пометка и ТолькоПросмотр проверены в обоих состояниях";
Исключение
ОшибкаТеста = ОписаниеОшибки();
КонецПопытки;
ОшибкиЗавершения = ЗавершитьСвойТест(Приложение, СвояФорма, ИсходныйЛимит);
Если ОшибкаТеста <> "" Или ОшибкиЗавершения <> "" Тогда
Итог = "Тест не завершён успешно: " + ОшибкаТеста + " " + ОшибкиЗавершения;
ВызватьИсключение Итог;
КонецЕсли;
Итог = Итог + "; свой текст Книга и исходный режим восстановлены, реальный лимит восстановлен, соединение разорвано. Клиент не закрывался";
КонецПроцедуры
УчебныеПоля85
УчебныеПоляТестирования85 → Общие формы → УчебныеПоля85 → Модуль
Полный модуль собственной управляемой формы: серверное создание своих данных, два клиентских действия; данные только в памяти и настоящие собственные элементы формы.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Метаданные.ОбщиеРеквизиты.Количество() <> 0 Тогда
Отказ = Истина;
ВызватьИсключение "Только свой новый неразделённый стенд";
КонецЕсли;
ЭтотОбъект.АвтоЗаголовок = Ложь;
МеткаСеанса = Строка(Новый УникальныйИдентификатор);
ЭтотОбъект.Заголовок = "Учебные поля85 " + МеткаСеанса;
УчебныйТекст85 = "Книга";
РежимПросмотра = Ложь;
Элементы.УчебныйТекст85.Подсказка = "Введите только учебный текст без записи базы";
Элементы.УчебныйТекст85.ТолькоПросмотр = Ложь;
Элементы.РежимПросмотра85.Пометка = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьРежимПросмотра85(Команда)
РежимПросмотра = Не РежимПросмотра;
Элементы.УчебныйТекст85.ТолькоПросмотр = РежимПросмотра;
Элементы.РежимПросмотра85.Пометка = РежимПросмотра;
КонецПроцедуры
&НаКлиенте
Процедура СброситьСвойОпыт85(Команда)
УчебныйТекст85 = "Книга";
РежимПросмотра = Ложь;
Элементы.УчебныйТекст85.ТолькоПросмотр = Ложь;
Элементы.РежимПросмотра85.Пометка = Ложь;
КонецПроцедурыОткрытьУчебныеПоля85
УчебныеПоляТестирования85 → Общие команды → ОткрытьУчебныеПоля85 → Модуль
Полный модуль своей общей команды без параметра: серверная функция возвращает фактическое имя конфигурации, клиент проверяет строку и открывает собственную подготовленную форму.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ОткрытьФорму("ОбщаяФорма.УчебныеПоля85");
КонецПроцедуры
Разбор по шагам
Пара объектов получается через настоящий ТестируемоеПриложение и одну конкретную форму с реальным UUID-заголовком. Поле метки отдельно подтверждает идентичность источника; отсутствующая или дублирующая форма вызывает отказ.
Поле проверяется по внутреннему имени, действительному виду ПолеВвода и видимому заголовку. Видимость, доступность, видимость заголовка и ТолькоПросмотр — разные состояния, не один универсальный getter.
Подсказка сравнивается с реальным значением, заданным собственным fixture. Представление данных должно быть Книга; это отображаемая строка, не универсальное преобразование числа или даты.
Родители поля и кнопки получаются native-методами и сверяются с реально созданными ГруппаДанных85 и ПанельРежима85. Подчинённые возвращаются действительными фиксированными массивами; число не угадывается и пустая коллекция не подменяется объектами.
Кнопка должна иметь вид КнопкаКоманднойПанели, точный заголовок, видимость и доступность. ТекущееПометка проверяет реальное визуальное состояние; readonly-свойства тестируемого объекта не заполняются вручную.
Ввод выполняется в отдельном реальном поле, затем фактическая кнопка активизируется и забирает фокус. ПолучитьПредставлениеДанных подтверждает отображаемое значение перед нажатием; несуществующий метод ЗакончитьРедактирование у поля не выдумывается. Серверной записи текста в каталог товаров нет.
Настоящее нажатие запускает только собственную команду. Она меняет РежимПросмотра, свойство исходного ПолеФормы.ТолькоПросмотр и пометку исходного КнопкаФормы; тестируемые объекты остаются readonly-представлениями.
Проверяется пара переходов: пометка и запрет редактирования включены, затем выключены. Данные после включения не должны исчезнуть, а кнопка должна оставаться доступной для возврата.
Очистка нажимает только свой сброс, повторно подтверждает Книга, ТолькоПросмотр=Ложь и пометку=Ложь, затем независимо восстанавливает реальный лимит и разрывает соединение. Ошибка любой части не скрывается.
Как проверить результат
При иной конфигурации, версии, чужом порту, отсутствии /TESTMANAGER, неверной фактической метке или нескольких формах тест должен отказаться. Не изменяйте защиту ради работы в production.
Исходное отдельное поле видно, доступно, имеет видимый заголовок Учебный текст и точную собственную подсказку. Кнопка находится внутри своей командной панели и имеет требуемый вид.
После ввода представление равно Учебная книга. После первого нажатия пометка=Истина, ТолькоПросмотр=Истина, текст тот же; доступность кнопки сохраняется.
После второго нажатия оба состояния Ложь. Если проверка даёт неправильное значение, код выбрасывает исключение, а не просто печатает Ложь и объявляет успех.
После завершения снова Книга, режим редактируемый, пометка снята, действительный исходный лимит восстановлен и соединение разорвано. Форма остаётся открытой.
В полях и кнопках не присваиваются свойства ТестируемоеПолеФормы/ТестируемаяКнопкаФормы. При ошибке собственный сброс и разрыв соединения всё равно предпринимаются независимо.
Ожидаемый результат
В разрешённом ручном UI-тесте введён свой учебный текст, дважды проверено согласованное переключение режима и пометки, реальные исходные данные восстановлены и соединение разорвано. Здесь выполнены только статические проверки.
На что обратить внимание
Тестируемое поле — абстракция; дополнительные методы зависят от фактического Вид. ВводТекста и окончание редактирования здесь применяются только после подтверждения ПолеВвода, не к календарю, картинке или диаграмме.
Для колонки таблицы некоторые getters вызывают исключение вне режима редактирования. Этот fixture содержит отдельное поле, а не колонку, поэтому эти ограничения не обходятся неизвестным объектом.
ТекущееТолькоПросмотр возвращает Истина при запрете редактирования. Текст описания справки может быть сформулирован неоднозначно; в уроке сверяются возвращаемое значение, реальный изменённый OnlyView и поведение собственного поля.
Пометка исходной кнопки управляет кнопкой командной панели, не любой обычной кнопкой. Для теста специально выбран корректный вид и реальная группа-панель.
Readonly-представление тестируемого объекта не равнозначно неизменяемости самой формы: собственный обработчик меняет свои исходные элементы и данные, а менеджер только наблюдает их и выполняет подтверждённые UI-действия.
Пустые подчинённые коллекции у простых элементов нормальны. Поиск дочерних объектов не выдумывается и не считается выполненным только от существования самих методов; он требует отдельного подходящего fixture.
В установленной справке кнопка содержит две страницы Активизировать и две ТекстЗаголовка с одинаковой семантикой. Экспорт сохранил отдельные ключи с суффиксом; один настоящий вызов и реальное чтение применимы к обеим страницам, а не являются двумя разными действиями.
Метаданные.Имя, UUID и заголовок — диагностические ограждения, не криптографическая аутентификация клиента. Принадлежность порта и отсутствие чужой базы проверяет администратор до подключения.
Сброс восстанавливает заданный исходный fixture, а не произвольные чужие изменения. Перед тестом не редактируйте эту форму вручную; любые связанные с базой обработчики меняют условия и риск.
Код не запускался, runtimeVerifiedScenarios=0. 1С, сеть тестирования, окна, рабочие базы, файлы, резервные копии и архивы не менялись.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Проверить настоящую строку поиска: свой UUID, доступность, иерархия и три результата отсутствующего поиска
Полная пара модулей создаёт собственный буквальный список и его настоящее автоматическое дополнение. Тест-менеджер находит его по реальному имени Source-формы, ограниченно проверяет доступность, исследует настоящую иерархию и различает пустой массив, Неопределено и исключение.
Где и как запускать
Полный клиентский модуль своей внешней обработки МенеджерПоиска85.Пульт в /TESTMANAGER; собственный тонкий /TESTCLIENT этой же пустой базы УчебноеТестированиеПоиска85 на вручную проверенном127.0.0.1:15383. Код в1С не выполнялся.
Подготовка
НОВАЯ отдельная пустая файловая база точно8.5.1.1343. Конфигурация УчебноеТестированиеПоиска85, язык Русский, совместимость Не использовать; никаких бизнес-объектов, расширений, подписок, заданий или рабочих данных. Модули конфигурации вручную пустые. Не применять к БП/КА2/УТ/УНФ.
Создайте внешнюю обработку SourceПоиска85 с одной пустой управляемой основной формой. Реквизиты: Список — ДинамическийСписок; МеткаСеанса, ПаспортСтенда, ИмяДополнения — Строка100; ПрофильПоиска — Строка30. Один ТаблицаФормы с именем ТаблицаТоваров и ПутьКДанным=Список. Колонки вручную НЕ добавлять: fixture создает ровно пять своих колонок.
Покажите МеткаСеанса, ПаспортСтенда, ИмяДополнения, ПрофильПоиска отдельными полями ввода с одноименными ПутьКДанным и ТолькоПросмотр=Да. Полный дополнительный модуль ниже вставить в модуль Source-формы. Назначить ПриСозданииНаСервере одноименной процедуре. Он создает две свои кнопки, их вручную не дублировать.
В Source-форме буквальный список: Книга3×250, Ручка1×30, Чай2×150, Вода0×70. ОсновнаяТаблица пустая, ключи УчебныйНомер1–4; автоматическое сохранение пользовательских настроек выключено. UUID и ИмяДополнения берутся именно от настоящей открытой Source-формы, не выдумываются менеджером.
Создайте отдельную внешнюю обработку МенеджерПоиска85 с управляемой формой Пульт. Реквизиты Согласие — Булево; МеткаСеанса — Строка100; Итог — Строка неограниченной длины. Покажите редактируемый флажок, поле точной метки и многострочный Итог только для просмотра. Команда ВыполнитьСвойТест85 с таким действием и одна кнопка. Основной модуль урока вставить в Пульт; назначить ПриОткрытии.
Будущая ручная подготовка: сохранить обе свои внешние обработки, сохранить пустую конфигурацию и обновить ТОЛЬКО свою базу F7. Самостоятельно запустить два своих тонких клиента этой же базы: /TESTCLIENT -TPort15383 и /TESTMANAGER. Сначала убедиться, что 127.0.0.1:15383 принадлежит только своему тестовому клиенту. Код не запускает клиентов, не выбирает другую базу и не меняет порт.
В /TESTCLIENT вручную открыть SourceПоиска85. Убедиться в четырех буквальных строках и профиле Разрешен. Скопировать точное фактическое МеткаСеанса в свой МенеджерПоиска85 в /TESTMANAGER. Подтвердить Согласие. Во время опыта не редактировать и не закрывать Source-форму; менять только доступность ее собственными кнопками.
runtimeVerifiedScenarios=0: никакие 1С, GUI, TCP-соединения, формы и клики здесь не выполнялись. Сверены исходники и установленная справка; настоящий переход состояний, состав иерархии, тексты подсказок, отсутствие объектов и ошибки еще нуждаются в разрешенном ручном тесте.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Согласие = Ложь;
МеткаСеанса = "";
Итог = "Вручную откройте свою source-форму в /TESTCLIENT и перенесите ее настоящий UUID";
КонецПроцедуры
&НаКлиенте
Функция СвойТекст85(Форма, Имя)
Поле = Форма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , Имя, 10);
Если Поле.Имя <> Имя Тогда
ВызватьИсключение "Не совпало собственное контрольное поле";
КонецЕсли;
Возврат Поле.ПолучитьПредставлениеДанных();
КонецФункции
&НаКлиенте
Функция СвоеДополнение85(Форма, Имя)
Найденные = Форма.НайтиОбъекты(Тип("ТестируемоеДополнениеЭлементаФормы"), , Имя, 10);
Если ТипЗнч(Найденные) <> Тип("ФиксированныйМассив") Или Найденные.Количество() <> 1 Тогда
ВызватьИсключение "Нужно ровно одно реальное собственное дополнение с именем из source-формы";
КонецЕсли;
Поиск = Найденные[0];
Если ТипЗнч(Поиск) <> Тип("ТестируемоеДополнениеЭлементаФормы") Или Поиск.Имя <> Имя
Или Поиск.Вид <> ВидДополненияЭлементаФормы.ОтображениеСтрокиПоиска Тогда
ВызватьИсключение "Получен не собственный объект строки поиска";
КонецЕсли;
Возврат Поиск;
КонецФункции
&НаКлиенте
Функция СобственныйПоискДостигПрофиля85(ПараметрыПроверки) Экспорт
Если СвойТекст85(ПараметрыПроверки.Форма, "МеткаСеанса") <> ПараметрыПроверки.Метка
Или СвойТекст85(ПараметрыПроверки.Форма, "ПаспортСтенда") <> "own-tested-search85-four-literals-no-business-data" Тогда
ВызватьИсключение "Источник ожидания перестал быть собственным сеансом";
КонецЕсли;
Поиск = СвоеДополнение85(ПараметрыПроверки.Форма, ПараметрыПроверки.Имя);
Возврат СвойТекст85(ПараметрыПроверки.Форма, "ПрофильПоиска") = ПараметрыПроверки.Профиль
И Поиск.ТекущаяДоступность() = ПараметрыПроверки.Разрешен;
КонецФункции
&НаКлиенте
Функция ОписатьСвойТестовыйОбъект85(Объект)
Если Объект = Неопределено Тогда
Возврат "Неопределено: объект не предоставлен";
КонецЕсли;
ВидОбъекта = ТипЗнч(Объект);
Если ВидОбъекта = Тип("ТестируемаяГруппаФормы") Или ВидОбъекта = Тип("ТестируемоеПолеФормы") Тогда
Возврат Строка(ВидОбъекта) + ": " + Объект.Имя + "; " + Объект.ТекстЗаголовка;
КонецЕсли;
Возврат "Реальный тип: " + Строка(ВидОбъекта);
КонецФункции
&НаКлиенте
Функция ОписатьСвоюИерархию85(Поиск, Метка)
Дочерние = Поиск.ПолучитьПодчиненныеОбъекты();
Если ТипЗнч(Дочерние) <> Тип("ФиксированныйМассив") Или Дочерние.Количество() > 64 Тогда
ВызватьИсключение "Неожиданная коллекция дочерних объектов собственного дополнения";
КонецЕсли;
Отчет = "Дочерних UI-объектов: " + Строка(Дочерние.Количество()) + Символы.ПС;
Для Каждого Дочерний Из Дочерние Цикл
Отчет = Отчет + ОписатьСвойТестовыйОбъект85(Дочерний) + Символы.ПС;
КонецЦикла;
Родитель = Поиск.ПолучитьРодителя();
Отчет = Отчет + "Родитель: " + ОписатьСвойТестовыйОбъект85(Родитель) + Символы.ПС;
ОтсутствующееИмя = "Уч85Отсутствует_" + Метка;
НетОбъектов = Поиск.НайтиОбъекты(, , ОтсутствующееИмя, 1);
Если ТипЗнч(НетОбъектов) <> Тип("ФиксированныйМассив") Или НетОбъектов.Количество() <> 0 Тогда
ВызватьИсключение "Отрицательный контроль встретил реальный объект: опыт прекращен";
КонецЕсли;
Если Поиск.НайтиОбъект(, , ОтсутствующееИмя, 1) <> Неопределено Тогда
ВызватьИсключение "НайтиОбъект должен вернуть Неопределено для подтвержденного отсутствующего имени";
КонецЕсли;
ОшибкаОтсутствия = "";
НеожиданныйРезультат = Неопределено;
Попытка
НеожиданныйРезультат = Поиск.ПолучитьОбъект(, , ОтсутствующееИмя, 1);
Исключение
ОшибкаОтсутствия = ОписаниеОшибки();
КонецПопытки;
Если ОшибкаОтсутствия = "" Тогда
ВызватьИсключение "ПолучитьОбъект не сообщил об отсутствии: " + Строка(ТипЗнч(НеожиданныйРезультат));
КонецЕсли;
Отчет = Отчет + "Отрицательный поиск: пустой массив, Неопределено, исключение ПолучитьОбъект" + Символы.ПС;
Отчет = Отчет + "Реальный текст исключения: " + ОшибкаОтсутствия + Символы.ПС;
Попытка
Панель = Поиск.ПолучитьКоманднуюПанель();
Отчет = Отчет + "Командная панель: " + ОписатьСвойТестовыйОбъект85(Панель) + Символы.ПС;
Исключение
Отчет = Отчет + "Панель НЕ получена для этого вида дополнения: " + ОписаниеОшибки() + Символы.ПС;
КонецПопытки;
Попытка
Меню = Поиск.ПолучитьКонтекстноеМеню();
Отчет = Отчет + "Контекстное меню: " + ОписатьСвойТестовыйОбъект85(Меню) + Символы.ПС;
Исключение
Отчет = Отчет + "Меню НЕ получено для этого вида дополнения: " + ОписаниеОшибки() + Символы.ПС;
КонецПопытки;
Возврат Отчет;
КонецФункции
&НаКлиенте
Процедура ВыполнитьСвойТест85(Команда)
Если Не Согласие Тогда
ВызватьИсключение "Нужны собственный пустой стенд и явное согласие на проверку своей формы";
КонецЕсли;
UUID = Новый УникальныйИдентификатор(МеткаСеанса);
Если Строка(UUID) <> МеткаСеанса Тогда
ВызватьИсключение "Передайте точный UUID настоящей source-формы, не придуманную метку";
КонецЕсли;
Приложение = Новый ТестируемоеПриложение("127.0.0.1", 15383);
ИсходныйЛимит = Неопределено;
Разрешить = Неопределено;
ДанныеОжидания = Неопределено;
ОшибкаТеста = "";
ОшибкиЗавершения = "";
Итог = "Тест еще не завершен";
Попытка
Приложение.УстановитьСоединение();
ИсходныйЛимит = Приложение.ПолучитьМаксимальноеВремяВыполненияДействия();
Приложение.УстановитьМаксимальноеВремяВыполненияДействия(10);
Заголовок = "Уч85ТестПоиска " + МеткаСеанса;
Формы = Приложение.НайтиОбъекты(Тип("ТестируемаяФорма"), Заголовок, , 10);
Если ТипЗнч(Формы) <> Тип("ФиксированныйМассив") Или Формы.Количество() <> 1 Тогда
ВызватьИсключение "Нужна единственная собственная форма этого UUID";
КонецЕсли;
Форма = Приложение.ПолучитьОбъект(Тип("ТестируемаяФорма"), Заголовок, , 10);
Если СвойТекст85(Форма, "МеткаСеанса") <> МеткаСеанса
Или СвойТекст85(Форма, "ПаспортСтенда") <> "own-tested-search85-four-literals-no-business-data"
Или СвойТекст85(Форма, "ПрофильПоиска") <> "Разрешен" Тогда
ВызватьИсключение "Источник или исходный собственный профиль не совпал; чужие состояния не сбрасываются";
КонецЕсли;
Имя = СвойТекст85(Форма, "ИмяДополнения");
Если Имя = "" Или СтрНайти(Имя, "*") > 0 Или СтрНайти(Имя, "?") > 0 Тогда
ВызватьИсключение "Нужно точное реальное имя дополнения без поисковых шаблонов";
КонецЕсли;
Поиск = СвоеДополнение85(Форма, Имя);
Если Не Поиск.ТекущаяВидимость() Или Не Поиск.ТекущаяДоступность() Тогда
ВызватьИсключение "Собственная строка поиска должна быть видна и доступна до начала опыта";
КонецЕсли;
ДанныеОжидания = Новый Структура("Форма,Метка,Имя,Профиль,Разрешен", Форма, МеткаСеанса, Имя, "Разрешен", Истина);
Разрешить = Форма.ПолучитьОбъект(Тип("ТестируемаяКнопкаФормы"), , "КнопкаРазрешитьПоиск85", 10);
Запретить = Форма.ПолучитьОбъект(Тип("ТестируемаяКнопкаФормы"), , "КнопкаЗапретитьПоиск85", 10);
Поиск.Активизировать();
ЗаголовокПоиска = Поиск.ТекстЗаголовка;
Подсказка = Поиск.ПолучитьТекстПодсказки();
ТолькоПросмотр = Поиск.ТекущееТолькоПросмотр();
Если ТипЗнч(ЗаголовокПоиска) <> Тип("Строка") Или ТипЗнч(Подсказка) <> Тип("Строка")
Или ТипЗнч(ТолькоПросмотр) <> Тип("Булево") Тогда
ВызватьИсключение "Не совпали документированные типы реального UI-дополнения";
КонецЕсли;
Отчет = "Собственное имя: " + Поиск.Имя + Символы.ПС;
Отчет = Отчет + "Реальный заголовок: " + ЗаголовокПоиска + Символы.ПС;
Отчет = Отчет + "Реальная подсказка: " + Подсказка + Символы.ПС;
Отчет = Отчет + "Только просмотр по API: " + Строка(ТолькоПросмотр) + Символы.ПС;
Отчет = Отчет + ОписатьСвоюИерархию85(Поиск, МеткаСеанса);
Запретить.Нажать();
ДанныеОжидания.Профиль = "Запрещен";
ДанныеОжидания.Разрешен = Ложь;
Условие = Новый ОписаниеОповещения("СобственныйПоискДостигПрофиля85", ЭтотОбъект, ДанныеОжидания);
Если Не Приложение.ОжидатьСостояния(Условие, 5) Тогда
ВызватьИсключение "В пределах собственного ожидания недоступность не подтверждена";
КонецЕсли;
Разрешить.Нажать();
ДанныеОжидания.Профиль = "Разрешен";
ДанныеОжидания.Разрешен = Истина;
Если Не Приложение.ОжидатьСостояния(Условие, 5) Тогда
ВызватьИсключение "Обратная доступность собственной строки не подтверждена";
КонецЕсли;
Итог = Отчет + "Обязательные проверки исходного профиля, отрицательного поиска и двух переходов завершены";
Исключение
ОшибкаТеста = ОписаниеОшибки();
КонецПопытки;
Если Разрешить <> Неопределено И ДанныеОжидания <> Неопределено Тогда
Попытка
Разрешить.Нажать();
ДанныеОжидания.Профиль = "Разрешен";
ДанныеОжидания.Разрешен = Истина;
Восстановление = Новый ОписаниеОповещения("СобственныйПоискДостигПрофиля85", ЭтотОбъект, ДанныеОжидания);
Если Не Приложение.ОжидатьСостояния(Восстановление, 5) Тогда
ВызватьИсключение "Исходная доступность собственного дополнения не восстановлена";
КонецЕсли;
Исключение
ОшибкиЗавершения = "Восстановление НЕ подтверждено: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Если ТипЗнч(ИсходныйЛимит) = Тип("Число") Тогда
Попытка
Приложение.УстановитьМаксимальноеВремяВыполненияДействия(ИсходныйЛимит);
Исключение
ОшибкиЗавершения = ОшибкиЗавершения + " Лимит НЕ восстановлен: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Попытка
Приложение.РазорватьСоединение();
Исключение
ОшибкиЗавершения = ОшибкиЗавершения + " Соединение НЕ разорвано: " + ОписаниеОшибки();
КонецПопытки;
Если ОшибкаТеста <> "" Или ОшибкиЗавершения <> "" Тогда
Итог = "Опыт НЕ завершен: " + ОшибкаТеста + " " + ОшибкиЗавершения;
ВызватьИсключение Итог;
КонецЕсли;
Итог = Итог + Символы.ПС + "Исходная доступность и лимит восстановлены; соединение разорвано. Диагностика меню/панели не доказывает их поддержку";
КонецПроцедурыSourceПоиска85
УчебноеТестированиеПоиска85 → Своя внешняя обработка SourceПоиска85 → Управляемая основная форма → Модуль
Полный модуль собственной Source-формы: серверная защита пустого стенда и буквальный список, клиентские кнопки и настоящий автоматический поиск; без бизнес-чтений/записи.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПроверитьСвойПустойСтенд();
Список.ПроизвольныйЗапрос = Истина;
Список.ОсновнаяТаблица = "";
Список.ДинамическоеСчитываниеДанных = Ложь;
Список.АвтоЗаполнениеДоступныхПолей = Истина;
Список.АвтоматическоеСохранениеПользовательскихНастроек = Ложь;
Список.ВидКлюча = ВидКлючаДинамическогоСписка.ЗначениеПоля;
КлючевыеПоля = Новый Массив;
КлючевыеПоля.Добавить("УчебныйНомер");
Список.ПоляКлюча = Новый ФиксированныйМассив(КлючевыеПоля);
Список.ТекстЗапроса = "ВЫБРАТЬ
| 1 КАК УчебныйНомер,
| ""Книга"" КАК Наименование,
| ""Канцелярия"" КАК Категория,
| 3 КАК Количество,
| 250 КАК Цена
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 2, ""Ручка"", ""Канцелярия"", 1, 30
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 3, ""Чай"", ""Продукты"", 2, 150
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 4, ""Вода"", ""Продукты"", 0, 70";
Элементы.ТаблицаТоваров.ТолькоПросмотр = Истина;
МеткаСеанса = Строка(Новый УникальныйИдентификатор);
ПаспортСтенда = "own-tested-search85-four-literals-no-business-data";
ЭтаФорма.АвтоЗаголовок = Ложь;
ЭтаФорма.Заголовок = "Уч85ТестПоиска " + МеткаСеанса;
Элементы.ТаблицаТоваров.ПоложениеСтрокиПоиска = ПоложениеСтрокиПоиска.Верх;
ДобавитьСвоюКнопку85("РазрешитьПоиск85", "Разрешить собственный поиск");
ДобавитьСвоюКнопку85("ЗапретитьПоиск85", "Запретить собственный поиск");
Для Каждого ИмяПоля Из СтрРазделить("УчебныйНомер,Наименование,Категория,Количество,Цена", ",") Цикл
Колонка = Элементы.Добавить("Товары" + ИмяПоля, Тип("ПолеФормы"), Элементы.ТаблицаТоваров);
Колонка.Вид = ВидПоляФормы.ПолеВвода;
Колонка.ПутьКДанным = "Список." + ИмяПоля;
Колонка.Заголовок = ИмяПоля;
КонецЦикла;
УстановитьСвойПоиск85(Истина);
КонецПроцедуры
&НаСервере
Процедура ДобавитьСвоюКнопку85(Имя, Заголовок)
Команда = Команды.Добавить(Имя);
Команда.Действие = Имя;
Команда.Заголовок = Заголовок;
Кнопка = Элементы.Добавить("Кнопка" + Имя, Тип("КнопкаФормы"));
Кнопка.ИмяКоманды = Имя;
КонецПроцедуры
&НаСервере
Процедура УстановитьСвойПоиск85(Разрешен)
ПроверитьСвойПустойСтенд();
Если ТипЗнч(Разрешен) <> Тип("Булево") Или ПаспортСтенда <> "own-tested-search85-four-literals-no-business-data" Тогда
ВызватьИсключение "Нужен собственный буквальный стенд и логический профиль";
КонецЕсли;
Поиск = Элементы.ТаблицаТоваров.ОтображениеСтрокиПоиска;
Если ТипЗнч(Поиск) <> Тип("ДополнениеЭлементаФормы")
Или Поиск.Вид <> ВидДополненияЭлементаФормы.ОтображениеСтрокиПоиска Тогда
ВызватьИсключение "Нужно реальное автоматическое дополнение собственной таблицы";
КонецЕсли;
ИмяДополнения = Поиск.Имя;
Если ИмяДополнения = "" Тогда
ВызватьИсключение "Платформа не предоставила имя собственного дополнения";
КонецЕсли;
Поиск.Заголовок = "Уч85ПоискЧетырехСтрок";
Поиск.Подсказка = "Только Книга, Ручка, Чай, Вода из собственного буквального списка";
Поиск.ОтображениеПодсказки = ОтображениеПодсказки.Всплывающая;
Поиск.Доступность = Разрешен;
Если Поиск.Доступность <> Разрешен Тогда
ВызватьИсключение "Сервер не сохранил собственный профиль доступности";
КонецЕсли;
ПрофильПоиска = ?(Разрешен, "Разрешен", "Запрещен");
КонецПроцедуры
&НаКлиенте
Процедура РазрешитьПоиск85(Команда)
УстановитьСвойПоиск85(Истина);
КонецПроцедуры
&НаКлиенте
Процедура ЗапретитьПоиск85(Команда)
УстановитьСвойПоиск85(Ложь);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыРазбор по шагам
Source-модуль сам создаёт уникальный UUID, точный заголовок, собственный паспорт, список четырех констант, пять колонок и две кнопки. Это действительное дополнение ТаблицаТоваров.ОтображениеСтрокиПоиска с видом ОтображениеСтрокиПоиска, не произвольный ИсходныйОбъект и не Новый тестируемый элемент.
До соединения менеджер проверяет явное согласие. После соединения ограничивает действия10секундами и требует ровно одну форму с UUID, совпадающие контрольные поля и исходный разрешенный профиль. Только потом получает дополнение по фактическому имени без * и ?.
Имя и Вид — readonly-паспорт тестового объекта. Активизировать работает только с идентифицированной собственной строкой. ТекстЗаголовка, реальная подсказка и ТолькоПросмотр читаются с проверкой типов; их содержание выводится фактически, а не заменяется заранее обещанным текстом виджета.
ПолучитьПодчиненныеОбъекты возвращает ФиксированныйМассив UI-объектов. Число дочерних элементов не равно числу товаров. Родитель диагностируется по реальному типу: в коде нет обязательного предположения, что он всегда таблица или группа.
Отрицательное имя содержит действительный UUID. Сначала НайтиОбъекты подтверждает пустой фиксированный массив; НайтиОбъект затем должен дать Неопределено. ПолучитьОбъект проверяется отдельной Попыткой: отсутствие должно вызвать исключение. Реальный текст ошибки выводится, но не сравнивается посимвольно и не подменяется выдуманным кодом ошибки.
ПолучитьКоманднуюПанель и ПолучитьКонтекстноеМеню — отдельные диагностические запросы возможностей именно этого вида. Возвращённые объекты/Неопределено/исключения сохраняются в отчёте. Фраза НЕ получено означает неуспешное получение; она не превращается в доказательство поддержки панели или меню.
Две собственные кнопки вызывают серверную смену Доступность и отдельное текстовое состояние Source-формы. Экспортная функция ОписаниеОповещения проверяет и фактическую ТекущаяДоступность, и профиль, и неизменные UUID/паспорт. ОжидатьСостояния с5секундами не заменяется бесконечным циклом или немедленным обещанием результата после нажатия.
Даже после ошибки отдельно предпринимаются восстановление исходной доступности, исходного лимита действий и разрыв соединения. Их ошибки сохраняются, вызывается итоговое исключение. Клиент и обе формы остаются открытыми; данные списка, текст поиска, бизнес-объекты и файлы тест не изменяет.
Как проверить результат
Будущий ручной контроль: source-таблица показывает именно Книга/Ручка/Чай/Вода; тестовый менеджер получает ее действительный UUID и имя дополнения, не другой клиент или форму.
Обязательные проверки: исходная видимость/доступность; пустой массив по отсутствующему UUID-имени; Неопределено у НайтиОбъект; настоящее исключение ПолучитьОбъект; переход Разрешен→Запрещен→Разрешен и независимое восстановление перед разрывом соединения.
Диагностика: фактические заголовок, подсказка, ТолькоПросмотр, количество дочерних UI-объектов, тип родителя и возможности меню/панели. Не требуйте заранее придуманного числа дочерних объектов, фиксированного родителя или обязательного наличия панели.
Отрицательный ручной контроль: другой UUID или выключенное Согласие должны остановить тест. Если перед началом Source-профиль Запрещен, менеджер отклоняет его и не нажимает восстановление. После начала собственных изменений можно временно исказить ожидаемый профиль в менеджере: ограниченное ожидание должно завершиться ошибкой, а отдельная ветка завершения вернуть доступность.
runtimeVerifiedScenarios=0: никакого утверждения, что реальный UI-тест уже прошёл. Неуспешное получение диагностической панели/меню не считается успешной проверкой этих возможностей.
Ожидаемый результат
Есть полный воспроизводимый Source-стенд и тест-менеджер с реальным объектом, контролем принадлежности сеансу, ограниченными проверками, явным отчетом возможностей и независимым завершением.
На что обратить внимание
ТестируемоеДополнениеЭлементаФормы — абстракция существующего виджета; конструктора нет, свойства не записываются. Вид определяется источником. Доступная функциональность зависит от вида дополнения, поэтому отчёт возможностей нельзя выдавать за доказательство успешного получения всех объектов.
НайтиОбъект и ПолучитьОбъект по одному отсутствующему имени ведут себя по-разному. У второго проверяется исключение, а не только Неопределено. Оба поиска ограничены1секундой, остальные10секундами;0 в таймауте поиска означает неограниченное ожидание и здесь не используется.
ТекстЗаголовка/подсказка отражают тестовый интерфейс; он может не показывать весь текст настроек Source-объекта. ТолькоПросмотр не является правом доступа к данным, а Доступность не фильтрует товары.
Метка источника не секрет аутентификации и не защита общего TCP-порта. Порт должен быть заранее проверен вручную; этот урок предназначен только своему локальному стенду, не удалённому/чужому клиенту.
ПолучитьРодителя не обещает определенный тип для любого дополнения. Описатель читает Имя/ТекстЗаголовка только у проверенных тестовых группы/поля; другим объектам не приписывает чужой API.
Ожидаемое исключение отсутствующего поиска — отрицательный контрактный опыт, не общий способ подавления ошибок. Остальные основные ошибки прекращают тест; ошибки меню/панели явно отмечают неподтвержденную возможность.
В учебный код не добавлены ввод текста, очистка пользовательского поиска, сохранение настроек, закрытие формы/клиента или запись базы. Восстановление возвращает только заранее подтвержденный собственный разрешенный профиль.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.