Платформа "1С:Предприятие" 8.3.8 и старше
30.03.2017
Рассмотрим простой пример запуска клиента тестирования, выполнения автоматизированного теста и проверки его результатов.
В качестве тестируемой конфигурации будем использовать демонстрационную базу Управляемое приложение (скачать). Программный код, выполняющий тестирование и проверку результатов, находится во внешней обработке Тест (скачать). Для запуска этой обработки можно использовать любую информационную базу.
Процесс автоматизированного тестирования заключается во взаимодействии двух специальным образом запущенных клиентских приложений: менеджера тестирования и клиента тестирования.
Менеджер тестирования в нашем примере будет исполнять внешнюю обработку Тест. Клиентом тестирования в нашем примере будет клиентское приложение демонстрационной базы Управляемое приложение.
Менеджера тестирования проще всего запустить из Конфигуратора. Для этого в параметрах конфигуратора можно установить режим запуска клиентского приложения - Запускать как менеджер тестирования (Сервис - Параметры - Запуск 1С:Предприятия - Дополнительные - Автоматизированное тестирование):
Другой способ запустить менеджера тестирования - из командной строки с ключом /TESTMANAGER. Например:
Копировать в буфер обмена"C:\Program Files (x86)\1cv8\8.3.2.163\bin\1cv8.exe" ENTERPRISE /F C:\Users\username\Documents\InfoBase /TESTMANAGER
Запуск клиента тестирования и подключение к нему будем выполнять средствами встроенного языка, поэтому дальше просто рассмотрим текст процедуры, выполняющей тестирование (внешняя обработка Тест).
Запуск клиента тестирования выполним из командной строки, используя ключ /TESTCLIENT:
Копировать в буфер обменаЗапуститьСистему("C:\Program Files (x86)\1cv8\8.3.2.163\bin\1cv8.exe ENTERPRISE /F C:\Users\username\Documents\1C\Platform82Demo /N Администратор /TESTCLIENT");
После этого установим соединение с клиентом тестирования. Для этого создадим объект типа ТестируемоеПриложение и выполним его метод УстановитьСоединение():
Копировать в буфер обменаТестКлиент = Новый ТестируемоеПриложение();
Процесс запуска клиентского приложения может быть длительным, поэтому попытки установить соединение будем выполнять в цикле (60 раз), игнорируя системные исключения, возникающие при неудачной попытке установить соединение. В случае глобальной неудачи выведем для информации описание ошибки, возникшей в последний раз:
Копировать в буфер обменаМаксИтераций = 60; Для Счетчик = 1 По МаксИтераций Цикл Попытка ТестКлиент.УстановитьСоединение(); Прервать; Исключение // Вывести только последнее сообщение. Если Счетчик = МаксИтераций Тогда Сообщить(ОписаниеОшибки()); Возврат; КонецЕсли; КонецПопытки; КонецЦикла;
Итак, клиент тестирования запущен и готов "к работе".
Тест будет заключаться в том, чтобы в списке товаров создать новый товар, заполнить его поля и записать в базу данных. Затем считать его из базы данных и убедиться, что значения его полей соответствуют тому, что мы записывали.
Поэтому прежде всего необходимо переместиться к списку товаров путем выполнения нескольких навигационных команд, расположенных в главном окне приложения:
Сначала получим главное окно приложения:
Копировать в буфер обменаГлавноеОкноТестКлиента = ТестКлиент.НайтиОбъект(Тип("ТестируемоеОкноКлиентскогоПриложения"), "Демонстрационная конфигурация*");
В данной ситуации мы точно знаем, что главное окно есть, раз соединение с клиентом тестирования успешно установлено. Поэтому просто находим главное окно. При этом первым параметром мы указываем, что ищем именно окно (Тип("ТестируемоеОкноКлиентскогоПриложения")), а не форму, поле или кнопку. А вторым параметром указываем шаблон заголовка этого окна, - заголовок начинается со слов Демонстрационная конфигурация. Указание заголовка нужно на тот случай, если после запуска приложения могут быть открыты какие-либо вспомогательные окна помимо главного окна.
Теперь нужно перейти в раздел Товарные запасы, выполнив соответствующую команду в панели разделов:
На "языке" автоматизированного тестирования это будет выглядеть так:
Копировать в буфер обменаГлавноеОкноТестКлиента.ВыполнитьКоманду("e1cib/navigationpoint/ТоварныеЗапасы");
То есть для программной эмуляции команды нужно знать её навигационную ссылку. Узнать навигационную ссылку можно двумя способами.
Во-первых, можно интерактивно выполнить нужную команду и затем интерактивно же получить навигационную ссылку на тот фрагмент интерфейса, в котором мы оказались:
Во-вторых в синтакс-помощнике можно посмотреть описание объекта ПредставлениеНавигационнойСсылки, а точнее его свойства НавигационнаяСсылка:
При переходе в некоторый раздел программы не открываются новые окна, не открываются новые формы. Поэтому после выполнения команды мы ничего не ждём, а сразу же выполняем следующую команду - открываем список товаров:
На "языке" автоматизированного тестирования это будет выглядеть так:
Копировать в буфер обменаГлавноеОкноТестКлиента.ВыполнитьКоманду("e1cib/navigationpoint/ТоварныеЗапасы/Справочник.Товары.Команда.ОткрытьСписок");
Здесь, для определения навигационной ссылки, можно использовать те же два способа, которые были рассмотрены раньше.
Выполнение этой команды должно привести к открытию новой формы - формы списка товаров:
Открытие формы может выполняться долго. Более того, форма может вообще не открыться, если в процессе ее инициализации произойдёт ошибка. Поэтому после выполнения команды в течение 60 секунд мы ожидаем появление этой формы:
Если НЕ ТестКлиент.ОжидатьОтображениеОбъекта(Тип("ТестируемаяФорма"), "Товары*") Тогда Сообщить("Не удалось открыть форму списка справочника ""Товары"" в течение 60 секунд."); Возврат; КонецЕсли;
Для идентификации нужной формы используем фрагмент её заголовка Товары. 60 секунд - это стандартный тайм-аут метода ОжидатьОтображениеОбъекта(). Если нужен другой тайм-аут, он указывается в четвёртом параметре этого метода.
После того, как форма списка товаров открылась, получим её:
Копировать в буфер обменаФормаТоваров = ТестКлиент.НайтиОбъект(Тип("ТестируемаяФорма"), "Товары*");
Тут надо сделать небольшое отступление и заметить, что стандартной последовательностью действий при выполнении теста является:
Однако существует и другой способ:
В четвёртом параметре метода НайтиОбъект() также можно указать тайм-аут. В стандартном состоянии он не используется (равен нулю), но его можно установить. И тогда не ожидать появления объекта, а потом наверняка его получить (как в первом случае), а сразу же пытаться получить объект в течение какого-то времени. Возможно в некоторых ситуациях второй способ выполнения теста может оказаться более удобным.
Но вернемся к тесту. Мы выполнили все подготовительные навигационные действия для выполнения теста - открыли форму списка товаров. Теперь нужно создать новый товар, заполнить его поля и записать.
Для этого пользователь обычно выполняет команду Создать в форме списка товаров:
На "языке" автоматизированного тестирования это будет выглядеть так:
ГлавноеОкноТестКлиента.ВыполнитьКоманду("e1cib/command/Справочник.Товары.Команда.Создать");
Это стандартная команда, поэтому ее навигационная ссылка формируется по принципу: "e1cib/command/" + <имя стандартной команды>.
Ожидаем отображение формы нового товара и получаем её:
Копировать в буфер обменаЕсли НЕ ТестКлиент.ОжидатьОтображениеОбъекта(Тип("ТестируемаяФорма"), "Товар*") Тогда Сообщить("Не удалось открыть форму нового товара в течение 60 секунд."); Возврат; КонецЕсли; ФормаНовогоТовара = ТестКлиент.НайтиОбъект(Тип("ТестируемаяФорма"), "Товар*");
Так выглядит полученная нами форма:
Заполним поле Наименование. После открытия формы это поле активно, поэтому просто находим его и вводим текст:
ПолеНаименование = ФормаНовогоТовара.НайтиОбъект(Тип("ТестируемоеПолеФормы"), "Наименование"); ПолеНаименование.ВвестиТекст("Новый товар (автотест)");
Заполним поле Артикул. Это поле неактивно, поэтому перед вводом текста его нужно активизировать:
Копировать в буфер обменаПолеАртикул = ФормаНовогоТовара.НайтиОбъект(Тип("ТестируемоеПолеФормы"), "Артикул*"); ПолеАртикул.Активизировать(); ПолеАртикул.ВвестиТекст("ДлинныйАртикулТовара");
Нажмём кнопку Записать и Закрыть. Идентифицируем её по заголовку:
Копировать в буфер обменаКнопкаЗаписатьИЗакрыть = ФормаНовогоТовара.НайтиОбъект(Тип("ТестируемаяКнопкаФормы"), "Записать и закрыть"); КнопкаЗаписатьИЗакрыть.Нажать();
На этом выполнение теста закончено.
Проверять результаты тестирования будем так же, как это делает пользователь визуально. В списке товаров найдём наш новый товар по наименованию. Откроем его и проверим значения полей Наименование и Артикул.
Во-первых, нашего товара может и не быть в списке, если запись товара по каким-то причинам не была выполнена. Например, если в тесте закомментировать ввод наименования, то новый товар не будет записан, так как это поле обязательное для заполнения.
Во-вторых, записанные значения полей могут отличаться от тех, которые мы устанавливали. Например, длина поля Артикул - 15 символов. И наверняка введенный нами артикул не будет записан целиком.
Форма списка товаров у нас открыта, поэтому получим таблицу из этой формы, "встанем" на её начало и будем спускаться вниз в надежде найти наш товар.
Копировать в буфер обменаСписокТоваров = ФормаТоваров.НайтиОбъект(Тип("ТестируемаяТаблицаФормы"), "Список*"); СписокТоваров.ПерейтиКПервойСтроке();
Обход таблицы будем выполнять в бесконечном цикле. Получая текст ячейки Наименование из текущей строки и сравнивая его с эталонным наименованием.
В случае удачи прерываем цикл. А в случае неудачи пытаемся перейти к следующей строке. Если следующей строки нет - выходим из цикла:
Копировать в буфер обменаТестируемыйТоварНайден = Ложь; Пока Истина Цикл НаименованиеТовара = СписокТоваров.ПолучитьТекстЯчейки("Наименование"); // Это искомый товар - выходим из цикла. Если НаименованиеТовара = "Новый товар (автотест)" Тогда ТестируемыйТоварНайден = Истина; Прервать; КонецЕсли; // Это не тот товар - переходим к следующей строке, если она есть. Попытка // Если следующей строки нет, будет исключение и мы выйдем из цикла СписокТоваров.ПерейтиКСледующейСтроке(); Исключение Прервать; КонецПопытки; КонецЦикла; // Тестируемый товар не найден - ошибка теста. Если Не ТестируемыйТоварНайден Тогда Сообщить("Тестируемый товар не найден в списке товаров. Не выполнена запись тестируемого товара."); Возврат; КонецЕсли;
После того, как тестируемый товар найден, открываем его форму, имитируя интерактивное действие пользователя - двойной щелчок мыши или нажатие клавиши Enter:
Копировать в буфер обменаСписокТоваров.Выбрать();
"Как обычно" ожидаем открытия формы и получаем её:
Копировать в буфер обменаЕсли НЕ ТестКлиент.ОжидатьОтображениеОбъекта(Тип("ТестируемаяФорма"), "Товар*") Тогда Сообщить("Не удалось открыть форму тестируемого товара в течение 60 секунд."); Возврат; КонецЕсли; ФормаТестируемогоТовара = ТестКлиент.НайтиОбъект(Тип("ТестируемаяФорма"), "Новый товар (автотест)*");
Находим поле Артикул и получаем его значение:
Копировать в буфер обменаПолеАртикул = ФормаТестируемогоТовара.НайтиОбъект(Тип("ТестируемоеПолеФормы"), "Артикул"); ТекущийАртикул = ПолеАртикул.ПолучитьПредставлениеДанных();
Если его значение отличается от эталона - прекращаем тестирование (или просто сообщаем об ошибке):
Копировать в буфер обменаЕсли ТекущийАртикул <> "ДлинныйАртикулТовара" Тогда Сообщить("Ошибка в поле ""Артикул"": Эталон: ДлинныйАртикулТовара , Текущее значение: " + ТекущийАртикул); Возврат; КонецЕсли;
Аналогично можно проверить и значения других полей формы, например поля Наименование.
Скачать демонстрационную конфигурацию Управляемое приложение (платформа 8.3.9.2170)