Кровь, пот и тесты. Тестирование в 1С

Коротко о главном

Каждое программное решение рано или поздно усложняется, обрастает зависимостями, внутренними связками, и контролировать изменения становится все сложнее. В итоге, исправив одну ошибку можно породить еще несколько в, казалось бы, несвязанных частях. Эту проблему и должно решить тестирование. К сожалению, в 1С до лета 2022 года с автоматическим тестированием было достаточно все сложно. Господствовала идея ручной проверки разработчиком, что не исключало ошибок. Разработчики, когда пишут код, всегда уверены, что код работает отлично, но это совсем не так. Плохо прорабатываются разные сценарии поведения пользователя, не обрабатываются как следует какие-то пограничные условия и исключения, беда с орфографией в конце концов.

К счастью, появилось решение данной проблемы — vanessa-automation. Данный инструмент развивается сообществом и предоставляет набор инструментов для тестирования, и записи видео-инструкций. В него входит: обработка для написания тестов, внешняя компонента для взаимодействия с ОС и расширение для конфигураций - поскольку работая через внешнюю обработку имеется ряд ограничений при работе с конфигурацией (например отслеживание выполнения фоновых заданий).

Тесты для данного инструмента пишутся на простом языке Gerkin с небольшими изменениями. Сам автор называет язык Gerkin+. Есть возможность как самостоятельно набирать шаги для теста, так и выбирать из библиотеки шагов, или вообще, накликать в интерфейсе, а обработка самостоятельно преобразует все это в шаги сценария тестирования. Очень удобно, хотя со временем и накоплением опыта в сложных тестах я от подобного подхода отказался, но об этом позже. Теперь, когда есть представление об инструменте можно перейти далее.

Кровь. Как мы писали тесты

Изначально тесты мы писали просто: есть функционал — пишем тест, который проверяет, что бы при правильном поведении пользователя ничего не ломалось. Это было легко и не отнимало много времени. Правда и пользы было не так много, как хотелось бы. 

Решение «Управление IT-отделом 8» достаточно сложное и есть много вариантов выполнения одного и того же действия. Например, сформировать один и тот же документ «Окончание обслуживания» можно создать, как минимум, напрямую из раздела «Ремонт и обслуживание», из места хранения, на основании документа «Начало обслуживания» и из формы документа «Задание». Везде есть свои особенности реализации создания документа. Все эти варианты нужно тестировать с разными наборами данных.

Тесты часто писались на основании данных, которые были созданы другими сценариями тестирования. С одной стороны все нормально, тесты пишутся быстро и просто, а вот с дугой стороны... Если у нас падал один сценарий, то за ним, как карточный домик, сыпалось почти все. Решили данную проблему достаточно просто: взяли эталонную базу и пришли к соглашению, что тесты должны быть как можно более независимыми. Все нужные элементы сценарий должен создавать самостоятельно.

Как результат: тесты стали огромными. Часто написание теста занимало больше времени, чем решение проблемы. Так не годится. Почитав документацию и пообщавшись с сообществом, мы стали выносить наиболее часто используемый в тестах функционал в экспортные сценарии. Например, создание номенклатуры использовалось очень часто и не по одному разу. Это в недавних версиях Vanessa появились соответствующие шаги по созданию объектов ссылочного типа, а в то время мы были лишены такой роскоши и делали все в тестах интерактивно. Были выписаны наиболее распространенные действия и вынесены в «Экспортные сценарии».

Вероятно, следует рассказать чем экспортные сценарии отличаются от обычных? По сути, практически ничем: это такой же файл с шагами для Vanessa, только с меткой @ExportScenarios. Внутри файла располагаются сценарии, которые можно будет вызвать из другого сценария, передав в него параметры. Например, экспортный для перевода задания на другой этап выглядит так:

// Переводит задание с указанным номером на указанный этап, если он доступен.
// Если задание создано не на дату запуска теста, то следует создать переменную "ТекущаяДата" и указать дату документа
Сценарий: Перевожу задание номер "пНомерЗадания" на этап "пЭтап"
И Я запоминаю в переменную "перЭтап" значение "пЭтап"

И я выполняю код встроенного языка на сервере
|'ИдентЭтапа = Неопределено;'|
|'Этап = Справочники.ЭтапыПроцессов.НайтиПоНаименованию(СокрЛП("$перЭтап$"), Истина);'|
|'Если Не Этап = Неопределено Тогда'|
|'ИдентЭтапа = Строка(Этап.УникальныйИдентификатор());'|
|'КонецЕсли;'|
|'Если Не ИдентЭтапа = Неопределено Тогда'|
|'ИмяПоля = "Этап_0_" + Строка(ИдентЭтапа);'|
|'ИмяПоля = СтрЗаменить(ИмяПоля, "-", "");'|
|'Объект.ЗначениеНаСервере = ИмяПоля;'|
|'КонецЕсли;'|

Если не существует переменная "ТекущаяДата" Тогда
И я выполняю код встроенного языка
"""bsl
Контекст.Вставить("ТекущаяДата", Строка(ТекущаяДата()));
"""
И я выполняю код встроенного языка
"""bsl
Контекст.Вставить("ИмяКнопки", Ванесса.Объект.ЗначениеНаСервере);
"""
И Я ищу документ вида "Задание" по номеру "пНомерЗадания" и дате "$ТекущаяДата$"
И я нажимаю на кнопку с именем "$ИмяКнопки$"
И я нажимаю на кнопку с именем "ФормаПровестиИЗакрыть"

Вызвать же этот сценарий из другого просто:

И я перевожу задание номер "31" на этап "Выполнено"

Так же гораздо проще, не правда ли? Казалось, что это отличное решение, но тут, как и в каждом решении, что стремится быть универсальным, есть сложности в реализации. Нужно предусмотреть огромное количество разных вариантов поведения самой 1С. Реализация универсальных экспортных сценариев заняла огромное количество времени и стоила массы нервных клеток.

И вот наступил момент, когда сценарии готовы к повседневному использованию, написана документация с примерами. Что происходит дальше? А дальше мы наблюдаем такую картину, что при написании тестов экспортные используются не очень часто. Вернее, не совсем так: подавляющее большинство сценариев практически не используются, зато сценарии, которые задумывались как вспомогательные, используются в основных тестах крайне охотно. Примером вспомогательного сценария, который стали охотно использовать, стало заполнение объекта по таблице.

Но с экспортными сценариями была еще одна проблема — из-за своей сложности и ветвлений, они очень долго выполняются. Как закономерный итог, тестирование стало занимать многие часы, что стало очень критично.

Пот

Проблему пытались решить распараллеливанием выполнения тестов в нескольких «потоках», но тут возник ряд технических проблем, которые не удалось решить. Например, одной из основных проблем стало лицензирование клиентов тестирования 1С в докер-контейнерах. Параллельно пробовали запускать несколько клиентов тестирования на разных виртуальных рабочих столах, но тут возникала другая проблема: дочерние окна клиента тестирования могли открываться не на своем виртуальном рабочем столе, что приводило к падению тестов. Так же при таком режиме работы даже на достаточно мощном сервере возникали проблемы с отрисовкой интерфейсных объектов самой 1С. Порой эти объекты прорисовывались через несколько секунд после открытия формы, что также не способствовало стабильной работе тестов.

Не знаю как у коллег, а у меня на данном этапе наступил кризис, и начал дергаться глаз при одном упоминании тестов. Но как-то, в очередной раз, просматривая список изменений в новой версии Vanessa, были обнаружены шаги, которые заменяли наши долгие экспортные сценарии. Воспряв духом, в качестве проверки были переписаны очередные упавшие тесты с использованием этих шагов и, о чудо — тесты работают быстро и не падают! Дело осталось за малым — переписать все существующие тесты под новую версию Vanessa. Именно этому занятию было посвящено приличное количество времени.

Но нельзя же бросать развитие продукта и все время посвящать перестройке своей инфраструктуры. Поэтому на очередном совещании было принято решение, что поскольку тесты стали падать значительно реже и время их выполнения вполне укладывается в приемлемые рамки, то можно немного снизить темпы их переписывания.

Тесты

Хоть работа с перестройкой инфраструктуры тестирования еще не закончена, но уже можно подвести некоторый итог. Перечислим все «грабли», по которым наша команда успешно танцевала достаточно много времени:

  • сценарии тестирования не должны опираться на данные, что создают другие сценарии тестирования
  • экспортные сценарии это неплохо, но они должны быть простыми без сложных ветвлений и тому подобного
  • если нужны сложные шаги, которых нет в библиотеки Vanessa, то экспортный сценарий лучше заменить на свои шаги (инструкция по созданию этих шагов будет чуть ниже)
  • некоторые технические моменты тестирования в 1С остаются либо нерешенными, либо имеют «специфический» вид

Осталось рассказать, как же, собственно, реализовывать эти «волшебные» собственные шаги для Vanessa. На самом деле все достаточно просто. Первым делом запускаем менеджер тестирования и открываем вкладку «Работа с UI» и пишем наш шаг так, словно он уже существует:

Генерация своего шага

Далее переходим на вкладку «Генерация EPF» и жмем на кнопку «Создать и обновить шаблоны обработок». После этих манипуляций Vanessa сгенерирует обработку и откроет расположение этой обработки.

ГенерацияСвоегоШага_2.png

Запускаем конфигуратор и открываем обработку. Все, что нужно нам для реализации шага располагается в модуле формы.

ГенерацияСвоегоШага_3.png

В первую очередь нас здесь интересует функция «ПолучитьСписокТестов». Именно в ней описывается наш шаг. В принципе из пояснения понятно какие параметры отвечают за что. Например, у нас есть свой шаг заполнения контактной информации. И в этой функции он имеет следующий вид:

Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ДляЭлементаСправочникаЯЗаполняюКонтактнуюИнформациюПоТаблице(Парам01,ТабПарам)","ДляЭлементаСправочникаЯЗаполняюКонтактнуюИнформациюПоТаблице","И для элемента справочника ""ИмяСправочника"" я заполняю контактную информацию по таблице
| |'Вид'  |'Значение'  |'Индекс' |
| |'Телефон' |'+79991234567' |'1'  |",
"Заполняет вкладку контактной информации по таблице вида: |""Вид""|""Значение""|""Индекс""|","Мои шаги. Заполнение контактной информации");

Остановимся подробнее на том, как в нашу функцию будут передаваться параметры. В примере с шагом заполнения контактной информации хорошо видно, что у шага есть параметр и таблица заполнения. В нашей функции это будут так же параметры:

 Функция ДляЭлементаСправочникаЯЗаполняюКонтактнуюИнформациюПоТаблице(Парам01,ТабПарам) Экспорт
Здесь «Парам01» это первый параметр в самом шаге. Их будет столько, сколько параметров передается в шаге (Парам 01, Парам02, Парам03 и т.д.).

Таблица же, которая следует после шага, передается в нашу функцию через параметр «ТабПарам»
Далее следует получение активного окна:

ФормаЭлемента = Ванесса.ПолучитьАктивноеОкноИзТестовоеПриложение();
И получение строки шапки таблицы (имена колонок этой таблицы содержатся в первой строке таблицы значений):
СтрокаШапки = ТабПарам[0]; // Заголовки колонок. На данный момент не используются

Дальше в функции идет работа с контактной информацией, которую не имеет смысла тут разбирать. Добавлю лишь, что в этой функции можно работать с Vanessa: получать данные контекста, формы, сохранять данные в контекст и даже выполнять встроенные шаги. Все это доступно через обращение к переменной «Ванесса».

На этом, пожалуй, на данный момент хотелось бы закончить. Если было интересно, то следите за обновлениями на нашем сайте, а мы постараемся продолжить и рассмотреть эту тему более глубоко.

Изображение автора статьи

Разработчик на платформе 1С

Загрузка...
Поделитесь статьей
Рекомендуем почитать
Статьи Решение проблемы "Обнаружено нарушение целостности системы 1С"

На сегодняшний день любой, пользующийся популярностью у пользователей программный продукт подвергается "пиратским" взломам и соответственно нелегальному использованию. Не исключением будут и программы от всеми известной в России фирмы 1С. Каждый разработчик старается бороться с подобным незаконным использованием своих продуктов по-разному. Так, например, разработчики 1С с 1-ого февраля 2021 года, массово запустили механизм, который определяет легальность использования программы 1С. В случае, если программа была взломана и используется незаконно конечные пользователи получают ошибку "Обнаружено нарушение целостности системы". Сегодня в публикации разберем причины появления данной ошибки, а также расскажем как решить возникшую проблему. 

Статьи Подключение терминала сбора данных к 1С

В этой статье мы подключим терминал сбора данных к 1с поэтапно и поработаем документом "Поступление". Данное решение поможет Вам значительно ускорить процесс пересчета товара, а что еще немаловажно при правильной работе избавить от ошибок. Прочитав данную статью, Вы поймете, что все не так сложно и доступно для каждого. Для реализации выбран ТСД фирмы Urovo и "1С:Розница"

Статьи Настройка Apache для работы 1С через HTTPS (SSL)

Безопасность для многих всегда идет на первом месте, многие интернет-гиганты, типа Google даже добавляют в свои браузеры предупреждения, что соединение не безопасно, если на сайте не используется SSL-сертификат.
1С:Предприятие тоже может работать по протоколу HTTPS.
Мы предлагаем статью-инструкцию, как настроить HTTPS в Apache таким образом, чтобы 1С:Предприятие работало без проблем через SSL.

Статьи Ошибка HTTP 500.0 - Internal Server Error после публикации базы 1С на веб-сервере IIS

Рассмотрим ошибку, которая может возникать при публикации информационной базы 1С на web-сервере IIS Windows.
Попытаемся ее решить. Ошибка HTTP 500.0 - Internal Server Error.

Статьи Как удалить данные по организации в базе 1С?

При ведении учета по нескольким организациям зачастую возникает необходимость очистить основную базу от всех данных какой-либо организации. Или разделить информационную базу на несколько, по организациям. Рассмотрим один из вариантов решения. Однако с помощью стандартной обработки удаления информации, это сделать будет проблемно и ресурсоемко. Поэтому в этой публикации рассмотрим вариант решения подобных проблем.

Статьи Быстро растет база MS SQL

Часто наши клиенты задают нам вопросы связанные с быстрым ростом размеров базы данных MS SQL.
1С:Предприятие использует БД MS SQL, а сервер на котором все это работает может столкнуться с тем, что банально для базы не хватит места.

0 / 0