Окружение для теста – конфигурация: ЕРП 2 (демо база версия 2.2.4.59, 2.2.3.231, 2.1.3.195)/УТ 11 (демо база 11.3.3.205); Фреймворк xUnitFor1C, внешние обработки (см. приложения) .
Задача теста - проверить корректность работы функции «СкладыСервер.ПереоформитьРасходныеОрдера»; с пользовательской стороны - это проверка кнопки «оформить расходные ордера по заказам» рабочего места «управление отгрузкой» (см. рис. ниже).
Условие проверки - при «имитации» нажатия кнопки «оформить ордера» должен будет сформироваться документ «Расходный ордер на товары» и табличная часть этого документа должна будет соответствовать некоторой эталонной таблице значений.
Шаг 1. Определяемся с данными для теста.
1.1 НСИ: склад будет ордерный и существующий в демо базе «Магазин «Продукты»», организация «Торговый дом «Комплексный»», контрагента создадим нового «ООО Ромашка», также создадим новое типовое соглашение и договор контрагента (можно подобрать существующие).
1.2 Документы: нам нужно будет создать только два документа «Заказ клиента» (отгружать его будем в кредит) и «Расходный ордер на товары».
1.3 Дополнительно: можно создать документы поступления, это поможет решить проблему отсутствия/нехватки товара – «Поступление товаров и услуг» и «Приходный ордер на товары» (не обязательно).
Шаг 2. Создаем «эталонную» цепочку. В большинстве случаев рекомендуем создавать документы, а НСИ использовать существующую.
2.1 Создаем контрагента, партнера, типовое соглашение и договор контрагента.
2.2 Оформляем заказ, ставим его в отгрузку.
2.3 Создаем расходный ордер и снимаем его с проведения. Это будет наш эталонный документ для сравнения.
Шаг 3. Создаем макет данных, с помощью плагина «СериализаторMXL».
вариант «а» - быстрый
3.1 Открываем обработку в предприятии и остаемся на вкладке «Метаданные».
3.2 Устанавливаем в свойствах генерации макета флажки: «Выгружать ссылку», «Связь по ГУИД», «Обмен Данными», «выгружать с документом его движения», «Уровень выгрузки зависимых» в значение «2».
3.3 Указываем документ «Заказ клиента» и «Расходный ордер на товары» в дереве метаданных или жмем кнопку «Структура подчиненности».
В форме указываем тип данных «Заказ клиента» и находим наш документ, далее добавляем в корзину и передаем в основную форму (см. рис. ниже).
Для удобства работы можно скрыть не выбранные элементы дерева метаданных с помощью кнопки «Только выбранные» .
3.4 Создаем и сохраняем макет (в обработке плагине «СериализаторMXL» кнопки «Создать макет данных» и «Сохранить макет в файл»).
3.5 Поверяем макет на другой «копии базы», т.е. убеждаемся, что мы выбрали все необходимые данные и не будет ошибки при подгрузке данных.(в обработке плагине «СериализаторMXL» для этого есть кнопки команды «Загрузить макет из файла» и «Протестировать загрузку макета»)
вариант «б» - только то что нужно
3.1 Открываем обработку в предприятии и остаемся на вкладке «Метаданные».
3.2 Устанавливаем в свойствах генерации макета флажки: «Выгружать ссылку», «Связь по ГУИД», «Обмен Данными». Также в дереве подчинённости снимем флажки «Выгружать при необходимости».
3.3 Жмем кнопку «Структура подчиненности» (особенности работы были описаны выше).
3.4 С помощью кнопки «Проставить отбор подчинённых ссылок» из текущей строки документа в быстром режиме подбираем справочники, которые хотели выгрузить – это контрагент, договор контрагента и еще рекомендуем добавить справочники вида «ключи аналитик» (принцип работы аналогичен кнопке структура подчиненности).
3.5 Выбираем все движения регистров через кнопку «установить отборы для регистров» для документа «Заказ клиента» (для этого позиционируем необходимую строку документа и жмем кнопку отборов для регистров).
3.6 Сохраним настройки дерева в файл. Это позволит довольно быстро восстановить настройки макета для повторного сохранения.
3.7 Создаем и сохраняем макет.
3.8 Проверяем макет на другой «копии базы», т.е. убеждаемся, что мы выбрали все необходимые данные, в противном случае добавляем недостающую информацию в выгрузку.
Шаг 4. Подготовка обработки для создания юнит теста.
4.1 Берем шаблон обработки для серверного теста.
4.2 Открываем в конфигураторе и переименовываем шаблонные функции на созвучное нам имя теста (в модуле обработки и в модуле управляемой формы) как «ПроверитьФункциюОформленияРасходныхОрдеров».
4.3 Вставляем в обработку наш макет с начальными данными и называем его как «МакетДанных» (выгрузка см. шаг 3).
4.4 Сохраняемся.
Шаг 5. Создаем код теста. Ниже приведены логические пункты, на которые мы советуем разбить исходный код теста.
5.1 Подготавливаем данные для выполнения проверки функции.
5.2 Формируем параметры для функции.
5.3 Выполняем функцию.
5.4 Обрабатываем результат. Если документы создались, то выполняем сравнение табличных частей эталонных документов (из макета) и документов, созданных при выполнении процедуры. Сравнивать рекомендуем, только значимые колонки (нет смысла сравнивать внутренние ключи и т.п.).
Код функции проверки:
////////////////////////////////////////////////////////////////
// I получение данных из макета
// 1.1 из макета
МакетДанные = ПолучитьМакет("МакетДанные");
СозданныеДанные = СериализаторMXL.СоздатьДанныеПоТабличномуДокументу(МакетДанные);
Склад = СозданныеДанные.ЗаказКлиента.Склад;
Получатель = СозданныеДанные.РОМАШКАООО_Партнер;
ЗаказКлиента = СозданныеДанные.ЗаказКлиента;
РасходныйОрдерНаТовары_Эталон = СозданныеДанные.РасходныйОрдерНаТовары;
РасходныйОрдерНаТовары_Битый = СозданныеДанные.РасходныйОрдерНаТовары_Битый;
// 1.2 готовим входные параметры для функции
СтруктураПараметровСозданияРасходныхОрдеров = СкладыСервер.ПараметрыПереоформленияРасходныхОрдеров();
СтруктураПараметровСозданияРасходныхОрдеров.Склад = Склад;
СтруктураПараметровСозданияРасходныхОрдеров.РаспоряженияНаОтгрузку = новый Массив;
СтруктураПараметровСозданияРасходныхОрдеров.РаспоряженияНаОтгрузку.Добавить(ЗаказКлиента);
СтруктураПараметровСозданияРасходныхОрдеров.Получатель = Получатель;
////////////////////////////////////////////////////////////////
// II вызов проверяемой функции
СтруктураОтвета = СкладыСервер.ПереоформитьРасходныеОрдера(СтруктураПараметровСозданияРасходныхОрдеров);
////////////////////////////////////////////////////////////////
// III обработка и проверка результата
// 3.1 Внутренняя ошибка
БазовыеУтверждения.ПроверитьЛожь(СтруктураОтвета.ЕстьОшибка,"Внутренняя ошибка при создании расходных ордеров");
БазовыеУтверждения.ПроверитьНеРавенство(СтруктураОтвета.ОформленныеОрдера.Количество(),0,"Внутренняя ошибка. Не удалось создать ордера");
// 3.2 Сравним с эталоном
// выгружаем только проверяемые колонки, некоторые необходимо проигнорировать
СтрокаНужныхКолонок="Номенклатура,Характеристика,Назначение,Серия,Упаковка,
|КоличествоУпаковок,Количество";
УтвержденияПроверкаТаблиц.ПроверитьРавенствоТаблиц(РасходныйОрдерНаТовары_Эталон.ОтгружаемыеТовары.Выгрузить(,СтрокаНужныхКолонок),
СтруктураОтвета.ОформленныеОрдера[0].РасходныйОрдер.ОтгружаемыеТовары.Выгрузить(,СтрокаНужныхКолонок));
Шаг 6. Проводим отладку теста. Сразу может заработать только простейший пример из разряда «2+3=5» (без этой функциональности первоначально юнит тесты у нас не поехали).
6.1 Отключаем у пользователя защиту от опасных действий, в противном случае будут проблемы с загрузкой плагинов и менеджера юнит тестов.
6.2 Открываем обработку в предприятии на тестовой базе.
6.3 Указываем требуемые серверные пути (у нас на сервере разработки расшаренный каталог GIT, где находится все что необходимо).
6.4 Ставим точки останова и отлаживаем.
Шаг 7. Завершение. Все готово! Помещаем тест в рабочую папку/хранилище GIT, настраиваем задания для выполнения тестов.
Бонусы!
А) Мы добавили обработку пример. В обработке примера две функции - правильная и битая (приводящая к ошибке для демонстрации). Кроме правильного эталонного расходного ордера есть еще «битый», при котором сработает наша проверка на равенство таблиц. В результате его выполнения мы увидим текст сообщения об ошибке – не совпадают табличные части в таких-то позициях (см. рис. ниже).
Б) В приложениях есть шаблон обработки с встроенным блоком для отладки и двумя примерами заготовками (загрузка данных из макета и выполнение простой функции).
Советы:
1. Запускать тесты удобно через Jenkins, TeamCity, а еще можно через Windows Task Manager.
2. Смотреть тесты красиво позволяет свободный фреймворк Allure.
3. Для удобства создания данных для тестов мы внесли некоторые изменения в плагин «СериализаторMXL», что оптимизировало процесс работы с ним: добавили возможность сохранения дерева настроек, загрузку макета, отбор документов по структуре подчиненности и пакетное формирование движений для выбранных документов, кое-что поправили еще; (в рамках нашего процесса). Есть в приложении, но также можно использовать стандартный плагин фреймворка.
4. Работайте с GIT - это позволит использовать тесты и инструменты работы с ними в командной разработке.
5. Рекомендуем прогонять тесты не только при сборке релиза, но и на ночном билде, а также на базах разработчиков.
6. Актуальную версию, весь необходимый набор плагинов и многое другое Вы можете скачать со странички проекта xUnitFor1C на github.