Разработка и сценарное тестирование с Vanessa-ADD. Практические примеры сценариев. Шаги встроенной библиотеки

Публикация № 984854

Программирование - Практика программирования

Vanessa ADD Automation Driven Development Behavior BDD Сценарное тестирование

91
Третья часть цикла публикаций, посвященных Vanessa-ADD и автоматизации тестирования. Переходим к практике.

 

Пример №1.  Присоединяемые файлы. Работа со структурой Контекст. Выполнение произвольного кода.

Пример №2.  Интеграционный механизм. Распределенная информационная база УТ 11. Подключение к двум разным базам.

Пример №3.  Проверка движений документа через форму списка. Шаг открытия произвольной формы.

 

 

В первой публикации мы рассмотрели теоретические основы BDD и сценарного тестирования, рассмотрели простой сценарий, включающий запуск сеансов 1С под разными пользователям. Во второй части  - установку необходимых инструментов, возможности автоматической записи и воспроизведения действий пользователя.

 

Теперь мы переходим к практике создания сценариев и рассмотрим несколько сквозных примеров на основе шагов встроенной в Vanessa-ADD библиотеки. Как и ранее, чтобы быть ближе к реальным практическим задачам, сценарии будем создавать для “Управление торговлей 11.4”. Задействованы во многом будут механизмы БСП, поэтому их должно быть легко адаптировать для других конфигураций на основе БСП.

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

Приведенные примеры можно рассматривать как основу для своих сценариев. Чтобы упростить чтение, все тексты сценариев, кроме окончательных, содержат лишние отступы у шагов выполнения произвольного кода и шагов перехода к строкам таблиц. Vanessa-ADD не сможет корректно работать с такими текстами. Поэтому за образцы лучше брать окончательные варианты сценариев, которые приведены в конце каждого примера. Все содержащиеся в них шаги оформлены так, что Vanessa-ADD сможет их исполнить.

 

Особое внимание уделите примерам работы со структурами “Контекст” и “КонтекстСохраняемый”. В опубликованных в сети вебинарах мало информации по работе с ними. Также мало примеров на github. В то же время с ними придётся много работать, если вы хотите писать стабильные сценарии, не зависящие от времени их выполнения. (Сейчас январь 2019 года и мне недавно пришлось адаптировать несколько сценариев только потому, что в них были явно вбиты даты 2018 года, вместо того, чтобы использовать относительные даты и работу через структуру “Контекст”).

Также, если возникнут вопросы по каким-либо из примененных шагов - задавайте их в комментариях.

 

 

 

Присоединяемые файлы. Выполнение произвольного кода. Работа со структурой Контекст.

 

 


На примере этого сценария мы разберем следующие вопросы:

1.  Как сделать так, чтобы при открытии диалога выбора файла был выбран какой-либо файл и этот диалог закрылся автоматически?

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

3.  Как сделать сохранение прикрепленного файла на диск и проверить его наличие, чтобы убедиться в том, что прикрепленный ранее файл доступен для дальнейшей работы?

4.  Как сохранить значения полей формы в специальную структуру “Контекст” и использовать в следующих шагах?

5.  Как вызвать исполнение произвольного кода из нашего сценария не создавая никаких внешних обработок?

6.  Как проверить результат асинхронных методов платформы?


 

 

Представим, что мы находимся в роли заказчика - менеджера по закупкам или  аналитика-консультанта. Как вам больше нравится ))

Команда разработки должна реализовать нам замечательную функцию - возможность прикреплять файлы к документам закупки "Приобретение товаров и услуг" в нашей системе “Управление торговлей 11.4”. Конечно же мы хотим убедиться, что этот функционал будет работать правильно как после его реализации, так и в будущем. Для этого мы решаем создать исполняемую спецификацию на языке Gherkin.

В результате предварительного обсуждения задачи с разработчиками мы узнаем, что файлы прикрепляются только к записанным в базу данных документам, так как должны быть связаны с уже существующем объектом в базе. Кроме того в БСП уже есть нужный механизм и достаточно подключить к нему новые документы. Мы решаем, что после реализации будем проверять наиболее общий случай - прикрепление файлов к новому документу. Также нам нужно не просто прикрепить файл, но и получить возможность использовать его в будущем. То есть наоборот, сохранять на диск.

Мы работаем без ордерной схемы, товаров в пути и неотфактурованных поставок, поэтому в нашем документообороте поступление товаров и приобретение товаров отражается одним и тем же документом.

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

 

Функционал: Прикрепление файлов к документам закупок



Я как менеджер по закупкам

Хочу иметь возможность прикреплять скан-копии первичных документов к документам в базе 1С и извлекать их из документов в базе 1С

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



Контекст:

        Дано На локальном диске компьютера пользователя существует файл СканПоступления.pdf

        И  На локальном диске компьютера пользователя нет файла СканПоступления_СохраненныйИзДокумента.pdf

        И  Я запускаю сеанс 1С для проверки работы с прикрепленными файлами

   

Сценарий:  Прикрепление файлов к новому документу приобретения товаров и услуг.

   

        Тогда я создаю новый документ “Приобретение товаров и услуг”

        И  я пытаюсь прикрепить к нему файл СканПоступления.pdf



        Тогда система сообщает о необходимости предварительно записать документ

        И  я соглашаюсь выполнить запись документа



        Тогда открывается диалог выбора файла

        И  в нем я выбираю файл СканПоступления.pdf

       

        Тогда файл становится доступен для выбора в списке прикрепленных к документу файлов

        И  я закрываю документ приобретения товаров



        И я заново открываю документ приобретения

        И в списке прикрепленных файлов по прежнему доступен для выбора ранее прикрепленный файл



        Тогда  я сохраняю этот файл на диск компьютера пользователя под именем СканПоступления_СохраненныйИзДокумента.pdf

        И  на диске действительно появляется сохраненный файл

 

 


 

Теперь мы будем выступать в роли разработчиков.

Мы подключаем документ “Приобретение товаров и услуг” к подсистеме БСП “Работа с файлами”. Конечно же соблюдая все правила указанные в документации для нашей версии БСП https://its.1c.ru/db/bsp244doc#content:1833:1. И проверяем функционал на соответствие спецификации.

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

Пусть каталог в котором мы работаем с нашими спецификациями  - это  C:\data\features. Для работы с этим сценарием создадим в нем подкаталог "Присоединенные файлы" , в нем разместим наш прикрепляемый файл СканПоступления.pdf, играющий роль скана первичного документа.

 

Тогда наши действия по записи поведения будут выглядеть следующим образом:

 

Последовательность наших действий во время записи была похожа на поведение пользователя, но всё же мы выполняли ряд лишних действий, чтобы упростить автоматическую запись нужных действий. А именно :

 

1)   Избавляемся от зависимости от других сценариев

 

При создании документа приобретения товаров при выборе хозяйственной операции мы сначала нажимаем на кнопку “По хоз.операциям” а потом “По видам документов”. Это сделано для того, чтобы в нашем сценарии автоматически появился шаг

И я нажимаю на кнопку 'По видам документов'

и нам не пришлось бы набирать его вручную. Этот шаг нужен чтобы сделать наш сценарий максимально независимым от других - если в каких-то других сценариях происходит создание документа закупки и нажимается кнопка “По хоз.операциям” то система запомнит этот выбор и в нашем сценарии мы могли бы получить ошибку при попытке развернуть нужную нам строку - её бы просто не оказалось в окне выбора типа документа.  Не нужный нам  шаг нажатия на кнопку “По хоз.операциям” мы затем удалим.

 

 

2)   Избавляемся от необходимости ручного набора шагов

 

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

 

И в таблице "Список" я перехожу к строке:

                | 'Дата изменения'     | 'Наименование'    |

                | '19.01.2019 0:43:50' | 'СканПоступления' |

 

Этот шаг мы оставим, а лишние шаги выбора второго файла затем удалим. Также в шаге выбора строки мы удалим лишнюю колонку с датой изменения - она для нас не важна, нам важно только наименование. Так мы сделаем наш сценарий более стабильным и мы не будем зависеть от даты изменения документа. Теперь наш шаг будет выглядеть так:

 

И в таблице "Список" я перехожу к строке:

                | 'Наименование'    |

                | 'СканПоступления' |

 

Точно также поступим со всеми прочими шагами выбора строки - в них оставим только важные для нас колонки.

 

 

3)   Проверяем существование файла применяя лишь библиотечные шаги

 

После сохранения прикрепленного файла на диск мы снова прикрепили его к документу. Зачем? Ведь по согласованной спецификации от нас требовалось только сохранить его на диск, а затем просто проверить его наличие?

Это как раз и была проверка наличия файла. Как мы увидим далее Vanessa-ADD ограничена в выполнении файловых операций и у нее нет шага “На диске есть файл …..”  Однако добавив шаги, прикрепления файла к документу как раз сможем убедиться в его наличии. Если файла не окажется то наш сценарий будет выдавать ошибки следующего вида :

 

 

 

 

Итак, в результате записи мы получаем первый набросок сценария, который нам предстоит доработать :

 


#language: ru

Функционал: <описание фичи>



Как <Роль>

Я хочу <описание функционала>

Чтобы <бизнес-эффект>



Контекст:

        Дано Я запускаю сценарий открытия TestClient или подключаю уже существующий



Сценарий: <описание сценария>



        И В командном интерфейсе я выбираю 'Закупки' 'Документы закупки (все)'

        Тогда открылось окно 'Документы закупки (все)'

        И в таблице "СписокДокументыЗакупки" я нажимаю на кнопку с именем 'Создать_ДокументЧерезФормуВыбора'

        Тогда открылось окно 'Создание документа по хозяйственной операции'

        И я нажимаю на кнопку 'По хоз. операциям'

        И я нажимаю на кнопку 'По видам документов'

        И в таблице "ДеревоПоДокументам" я разворачиваю строку:

                | 'Представление'                                                                                        |

                | 'Приобретение товаров и услуг                                                                        ' |

        И в таблице "ДеревоПоДокументам" я перехожу к строке:

                | 'Представление'        |

                | 'Закупка у поставщика' |

        И в таблице "ДеревоПоДокументам" я выбираю текущую строку

        И Я закрываю окно 'Создание документа по хозяйственной операции'

        Тогда открылось окно 'Приобретение товаров и услуг (создание)'

        И В текущем окне я нажимаю кнопку командного интерфейса 'Файлы'

        Тогда открылось окно '1С:Предприятие'

        И я нажимаю на кнопку 'OK'

        Тогда открылось окно 'Приобретение товаров и услуг СБЦБ-000033 от *'

        И В текущем окне я нажимаю кнопку командного интерфейса 'Файлы'

        И я нажимаю на кнопку 'Файл с диска...'

        Тогда открылось окно 'Приобретение товаров и услуг СБЦБ-000033 от *'

        И я нажимаю на кнопку 'Файл с диска...'

        Тогда открылось окно 'Приобретение товаров и услуг СБЦБ-000033 от *'

        И в таблице "Список" я перехожу к строке:

                | 'Дата изменения'     | 'Наименование'    |

                | '19.01.2019 0:43:50' | 'СканПоступления' |

        И в таблице "Список" я активизирую поле "Наименование"

        И Я закрываю окно 'Приобретение товаров и услуг СБЦБ-000033 от *'

        Тогда открылось окно 'Документы закупки (все)'

        И в таблице "СписокДокументыЗакупки" я перехожу к строке:

                | 'Валюта' | 'Вид документа'                                      | 'Дата'                | 'Номер'       | 'Организация' | 'Склад'                    |

                | 'RUB'    | 'Приобретение товаров и услуг, Закупка у поставщика' | '19.01.2019 20:02:36' | 'СБЦБ-000033' | 'Стройснаб'   | 'Оптовый неордерный склад' |

        И в таблице "СписокДокументыЗакупки" я выбираю текущую строку

        Тогда открылось окно 'Приобретение товаров и услуг СБЦБ-000033 от *'

        И В текущем окне я нажимаю кнопку командного интерфейса 'Файлы'

        И в таблице "Список" я активизирую поле "Наименование"

        И в таблице "Список" я перехожу к строке:

                | 'Дата изменения'     | 'Наименование'  |

                | '19.01.2019 0:41:40' | 'Первая запись' |

        И в таблице "Список" я перехожу к строке:

                | 'Дата изменения'     | 'Наименование'    |

                | '19.01.2019 0:43:50' | 'СканПоступления' |

        И я выбираю пункт контекстного меню с именем 'СписокКонтекстноеМенюСохранитьКак' на элементе формы с именем "Список"

        Тогда открылось окно 'Приобретение товаров и услуг СБЦБ-000033 от *'

        И я нажимаю на кнопку 'Файл с диска...'

        Тогда открылось окно 'Приобретение товаров и услуг СБЦБ-000033 от *'

        И в таблице "Список" я перехожу к строке:

                | 'Дата изменения'     | 'Наименование'  |

                | '19.01.2019 0:41:40' | 'Первая запись' |

        И в таблице "Список" я перехожу к строке:

                | 'Дата изменения'     | 'Наименование'                           |

                | '19.01.2019 0:43:50' | 'СканПоступления_СохраненныйИзДокумента' |

        

 

Что в нем потребуется еще доработать вдобавок к сказанному выше?

 

4)   Запустим тест-клиент от правильного пользователя - менеджера по продажам, вместо текущего

Как запускать сеанс под нужным пользователем мы уже изучали - достаточно применить шаг

Дано Я открыл сеанс TestClient от имени "Менеджер по продажам" с паролем "" или подключаю уже существующий

 

 

5)   Избавляемся от зависимости от номера документа в шагах проверки открытия формы

Мы видим, что зависим от номера документа в шагах вида Тогда открылось окно 'Приобретение товаров и услуг СБЦБ-000033 от *' , но в то же время эти шаги позволяют использовать символ звездочки и уже это делают. Нам достаточно просто убрать лишние символы номера, сделать шаг независимым от номера, присвоенного документу :

Тогда открылось окно 'Приобретение товаров и услуг *'

 

 

6 )   Указываем пути к файлам

Мы можем заметить, что в сценарии мы нигде не указали какие именно файлы мы выбираем и под каким именем мы осуществляем сохранение файла. Нам как то нужно дополнить шаги И я нажимаю на кнопку 'Файл с диска...'   и шаг И я выбираю пункт контекстного меню с именем 'СписокКонтекстноеМенюСохранитьКак' на элементе формы с именем "Список".  Нужно указать какой именно файл мы будем выбирать и под каким именем сохранять.

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

И Я буду выбирать внешний файл "Путь к файлу" 

 

Но есть одна тонкость. Мы не передаем имя файла в шаг нажатия на кнопку, приводящую к появлению диалогового окна выбора файла. Но и после появления диалога открытия файла очевидно уже поздно указывать, какой файл нам нужен - появится окно операционной системы, а не тест-клиента.  Технология работы с тест-клиентом (независимо от того применяем мы Vanessa-ADD или другой инструмент) требует указания файла, который мы будем выбирать, непосредственно ДО того как мы выполняем действия, приводящие к открытию диалогового окна выбора файла. Поэтому последовательность наших шагов должна оказаться следующей:

 

 

7)   Работаем со структурой “Контекст” чтобы получить независимость от номера документа

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

 

        И в таблице "СписокДокументыЗакупки" я перехожу к строке:

                | 'Дата'                          | 'Номер'             |

                | '19.01.2019 20:02:36' | 'СБЦБ-000033' |

 

Но ведь каждом выполнении сценария номер, присваиваемый документу платформой 1С, будет разным! Как поступить в этом случае?

Одним из вариантов является устанавливать номер документа вручную перед записью. Например набить в поле номер что-нибудь вроде 12345678911. И затем проводить поиск в списке по этому номеру. Вариант рабочий, но некрасивый. К тому же если одна и та же база используется для тестирования многократно это приведет к ошибкам связанных с дублями номеров. Мы воспользуемся более красивой возможностью - запомнить автоматически установленный номер документа и затем производить поиск по этому значению.

Посмотрим на описание библиотечного шага перехода к строке списка:

 

 

В описании говорится о возможности использовать Контекст и КонтекстСохраняемый для указания значений поиска.

 

Контекст  и КонтекстСохраняемый - это значения типа Структура и работать с ней можно как с обычной структурой, но нужно помнить, что она должна содержать только значения, которыми можно обмениваться между клиентом и сервером. Обе эти структуры хранятся на стороне тест-менеджера, но механизмы Vanessa-ADD позволяют записывать в них значения полей из форм тест-клиента.

 

В чем их отличия? Комментарии в исходном коде гласят :

 

  • Контекст - это структура, в которой хранится состояние сценария между выполнением шагов. Он очищается перед выполнением каждого сценария.
  • КонтекстСохраняемый - это структура, в которой можно хранить служебные данные между запусками сценариев. Он существует, пока открыта форма Vanessa-Behavior.

 

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

И    я запоминаю значение поля с именем "Номер" как "НомерДокумента"

 

Этот шаг добавит в структуру “Контекст” поле “НомерДокумента” (или изменит его значение, если оно уже было добавлено ранее) и установит значением этого поля номер документа. А далее, согласно описанию шага перехода к строке, заменим точное значение номера на значение из структуры “Контекст”. В итоге получим такие шаги :

 

 

 

8)   Избавляемся от бесконечного ожидания поиска документа по номеру в большом списке документов

В небольшой базе данных действий описанных выше будет достаточно. Документ будет найден. Но если в нашей базе сотни тысяч документов то поиск документа по номеру может затянуться на долгое время, даже на многие часы. Это недостаток приема, который применяет Vanessa-ADD для поиска - перебор строк.

Методически верно выполнять сценарии на небольшой демо базе. Но это не всегда возможно. Часто программисты уже написали много кода с поиском по наименованиям, ГУИДам и понаделали других некрасивых вещей, заставляющих вести разработку и выполнять сценарии на копиях баз. Можно даже сказать, что так происходит на большинстве предприятий.

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

Как записать новые действия пользователя и добавить их в уже существующий сценарий мы уже разбирали в первой части. Посмотрим еще раз:

 

 

После добавления отбора по периоду поиск документа по номеру будет выполняться быстро. Но здесь мы опять видим абсолютное значение даты, в то время как мы не устанавливали её в документе принудительно вручную. Вариант с ручной установкой даты в документе является одним из допустимых. Но мы уже научились использовать структуру “Контекст”. Применим эти знания и здесь. К нашему шагу по запоминанию номера добавим шаг по запоминанию даты документа.  Для этого Нам нужен шаг

И    я запоминаю значение поля с именем "Дата" как "ДатаДокумента"

 

Внимательный читатель скажет: “а откуда мы взяли имя Дата, ведь на форме нет названия Дата вообще, там есть заголовок  от ?” 

И действительно, нам также мог бы подойти шаг

И    я запоминаю значение поля "от" как "ДатаДокумента"

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

 

 

Для установки же запомненного значения в качестве даты начала интервала документа нам достаточно заменить шаг И в поле 'DateBegin' я ввожу текст '19.01.2019' на предназначенный для работы со структурой “Контекст” шаг  И в поле с именем "DateBegin" ввожу значение переменной "ДатаДокумента". Кстати, дату окончания интервала можно вообще указывать без ущерба для производительности сценария.  В итоге получим такие шаги:

 

 

 

9)  Проверяем, действительно ли система предупреждает о необходимости записать документ перед добавлением файлов

 

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

        И В текущем окне я нажимаю кнопку командного интерфейса 'Файлы'

        Тогда открылось окно '1С:Предприятие'

        И я нажимаю на кнопку 'OK'

        Тогда открылось окно 'Приобретение товаров и услуг *'

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

В решении этой задачи нам опять же поможет исследователь форм и ещё один шаг из встроенной библиотеки.  Вот как можно поступить :

 

 

Что происходило во время записи? Мы вызвали системное окно, сообщающее о необходимости выполнить запись документа. Затем перешли в тест-менеджер и открыли исследователь форм. Этот инструмент позволяет посмотреть на внутренности не только форм, определенных в конфигураторе, но и в системных окнах 1С:Предприятия.

Мы узнаём, что в автоматически создаваемом системном окне нужное нам поле имеет имя “Поле1” а текст должен включать в себя слова "Данные еще не записаны". Таким образом мы можем добавить шаг, который позволяет нам убедиться, что платформа предлагает именно записать документ, а не выдаёт какое-то другое сообщение об ошибке или другой текст. Нужный нам шаг будет выглядеть следующим образом :  

И значение поля с именем "Поле1" содержит текст "Данные еще не записаны"

 

 
 Подведём промежуточный итог. Наш сценарий после внесённых правок выглядит так  (под спойлером)  

 

10) Файловые операции через выполнение произвольного кода на встроенном языке платформы 1С:Предприятия

 

Что нам следует сделать дальше?

Мы еще не реализовали указанную в спецификации проверку на существование файла скана поступления и проверку того, что файл СканПоступления_СохраненныйИзДокумента.pdf  не существует на момент запуска сценария. Более того, поскольку этот файл создаем мы сами, то нам нужно не просто проверить наличие этого файла, но и удалить его, если он есть.

С файловыми операциями будут проблемы. Здесь не обойтись без программирования. Ванесса не имеет достаточного количества шагов по работе с файлами. Никаких удалений файла или проверки файла на диске :

 

 

Эта проблема легко решается через создание собственных шагов. Но создание собственных шагов - это тема следующей публикации, а сейчас мы работаем только типовыми шагами. И поэтому сейчас будет самая сложная часть этого раздела ))  Мы воспользуемся такой возможностью, как выполнение произвольного кода на встроенном языке платформы 1С.

Этот шаг имеет следующий вид :

  И затем я выполняю код встроенного языка

    |'  Строка кода 1   '|

    |'  Строка кода 2   '|

 

Важно помнить две особенности этого шага :

  • Код выполняется на стороне тест-менеджера , а не тест-клиента. То есть тест-менеджер не вызывает методы тест-клиента для выполнения этого кода, а выполняет его сам. Иногда это даже удобно, например в тех случаях когда нужно выполнить код под администратором а тест-клиент запущен под пользователем с ограниченными правами. Так например можно проверять RLS - запросом со стороны тест-менеджера мы убеждаемся что элемент есть в базе, а на стороне тест-клиента мы можем убедиться, что элемент не виден в динамическом списке.
  • Код выполняется на стороне клиента, а не сервера. Для выполнения кода на стороне сервера по прежнему придется создавать свой шаг и писать его реализацию, типовых шагов для этого нет. В следующей публикации мы создадим такой шаг.
  • Код выполняется через вызов оператора “Выполнить”. То есть отладка его проблематична. Не следует писать большие тексты ))
  • Каждая строка кода ограничивается  символами   |'  с одной стороны  и   '| с другой стороны. Вместо одинарной кавычки можно использовать двойную, но не стоит этого делать. Одинарные кавычки удобны, если мы хотим использовать двойную кавычку в своём коде. В этом случае двойную кавычку не придётся экранировать.

 

Итак, наша задача состоит в написании правильного кода для платформы 1С. Давайте также продолжим изучение возможности работы со структурой “Контекст” и задействуем ее в нашем механизме еще раз. "Контекст" доступен программно во всех шагах. Мы можем выполнить шаг

   И затем я выполняю код встроенного языка

     |'  Контекст.Вставить("Поле1", "Привет!"); '|

     |'  Сообщить(Контекст.Поле1); '|

 

И получить в окне сообщений текст “Привет!”.

Для проверки существования файла нам нужно создать объект Файл и затем вызвать его метод Существует() и сравнить результат с Истина. В этот раз будем обращаться к структуре Контекст программно, запишем в одно из её полей результат метода Существует() , а затем проверим результат применив еще один шаг, работающий с кодом 1С :

И выражение внутреннего языка "Любое выражение языка 1С" Истинно

 

Итого нам будут нужны такие шаги:

 

Если файл не существует, то сценарий с такими шагами выдаст ошибку.

Для удаления файла будем вызывать асинхронный метод НачатьУдалениеФайлов (синхронные методы на клиенте в последних версиях типовых конфигураций использовать нельзя), а затем проверим существование файла тем же способом , что и выше :

 

Однако такие шаги всегда будут приводить к ошибкам. Дело в том, что асинхронный метод возвращает управление тест-менеждеру сразу, не дожидаясь удаления файла, и дальше сценарий всегда будет находить еще не удаленный файл и выдавать ошибку (возможно на SSD такого эффекта не будет наблюдаться, но на моих HDD он наблюдается).

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

И Пауза 20

Тогда открылось окно "ИмяОкна"

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

И я жду открытия окна "Имя окна" в течение 20 секунд

 

Но при этом второй вариант не только проще понять при чтении сценария, но также он отработает быстрее в случае, если ожидаемое окно появится раньше, чем через 20 секунд  (появление окна проверяется каждую секунду). Поэтому, когда это возможно, следует выбирать специальные шаги-ожидания. Для случая с файлами мы не имеем такого шага. Поэтому нам поможет явная установка паузы. При этом если за 2 секунды файл не удаляется,  то это очевидно можно считать ошибкой и будет нормально, если в этом случае выполнение сценария прерывается с сообщением об ошибке. С учетом этого раздел “Контекст” нашего сценария начинает выглядеть следующим образом :

 

Что же, всё готово? Ещё нет. Наш сценарий очень зависим от расположения каталога с нашими фичами-спецификациями на диске. Мы используем абсолютные пути к прикрепляемым файлам и если мы переместим каталог нашего проекта (C:\data\features) на другой диск или в другую папку, то ничего работать не будет.

 

11)    Избавляемся от зависимости от расположения наших фича-файлов на диске

 

Vanessa-ADD во многих случаях позволяет работать не только с абсолютными путями, но и с относительными. Мы уже видели это, когда рассматривали как задаются каталоги к библиотекам шагов :

 

Посмотрим описание нашего шага, устанавливающего имя файла:

 

 

Мы можем использовать каталог проекта для задания относительного пути.

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

Каталог проекта задается интерактивно на вкладке сервис (не забывайте нажать на кнопку Сохранить после его изменения) :

 

 

А при запуске консольной командой каталог проекта задаётся либо с помощью ключа workspaceRoot (при запуске с помощью CLI платформы 1С) либо с помощью ключа --workspace (при запуске через Vanessa-Runner):

 

Итак наши шаги вида

И Я буду выбирать внешний файл "C:\data\features\Присоединенные файлы\СканПоступления.pdf"  

 

превращаются в шаги вида

И Я буду выбирать внешний файл "$КаталогПроекта$\Присоединенные файлы\СканПоступления.pdf"   

 

где вместо $КаталогПроекта$ будет автоматически подставляться строка C:\data\features

 

Но мы использовали путь к файлам не только в шаге выбора внешнего файла, но и в программном коде в разделе Контекст. Там мы писали  

И затем я выполняю код встроенного языка

       |'  ФайлСканаПоступления = Новый Файл("C:/data/features/Присоединенные файлы/СканПоступления.pdf"); '|

 

Что нам делать с этим? Дело в том, что до значения каталога проекта можно добраться даже в шаге, исполняющем произвольный код. Вспомним информацию из прошлой публикации. Каждый шаг реализуется внешней обработкой 1С, точнее экспортным методом этой внешней обработки. И мы всегда можем узнать, что это за экспортный метод и можем даже отладить его :

 

 

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

 

Таким образом наши шаги по выбору файла, проверке существования файла и удалению файла должны принять такой вид :

 

 

 

Реализуем в нашем сценарии всё, что рассмотрели выше. После чего объединим исходную спецификацию с детальными исполняемыми шагами.  В результате получим почти окончательный вариант нашей исполняемой спецификации (фича-файла) :

 
Текст под спойлером 

 


Почему почти? Потому что он работает под полными правами, а при проверке под менеджером по закупкам мы увидим ошибку :

 

 

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

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

Под менеджером по продажам интерфейс создания нового документа приобретения товаров оказывается другим и кроме того в демо базе УТ 11 действует RLS который не позволит записать документ без указания организации :

 

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

Процедура ОбщегоНазначенияУТ.СформироватьКомандыСоздания


        Для Каждого ИмяКонтекстГруппы Из СтруктураИменГрупп Цикл                

                ..............................               

                Если КоличествоДокументов = 1 И КоличествоХозОпераций = 1 Тогда                     

                        // Делать одно                                        

                ИначеЕсли КоличествоДокументов = 1 И КоличествоХозОпераций > 1 Тогда
                                                
                        // Делать другое
                        
                ИначеЕсли КоличествоДокументов <= 7 И КоличествоХозОпераций = 1 Тогда
                        
                        // Делать третье                        

                ИначеЕсли КоличествоДокументов <= 7 И КоличествоХозОпераций > 1 Тогда                        

                        // Делать четвертое                        

                ИначеЕсли Форма.ОтборТипыДокументов.Количество() > 7 Тогда                        

                        ДобавитьКомандуСКнопкойДляОткрытияФормыВыбора(Форма, ИмяГруппыСоздать, Префикс);
                                        
                КонецЕсли;                

        КонецЦикла;

 

 

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

 

 

 

В этот раз мы получаем окончательный вариант сценария (текст не содержит лишних отступов между строками):

 


#language: ru

@tree

Функционал: Прикрепление файлов к документам закупок

Я как менеджер по закупкам 
Хочу иметь возможность прикреплять скан-копии первичных документов к документам в базе 1С и извлекать их из документов в базе 1С
Чтобы снизить затраты времени на пересылку бумажных документов внутри компании.


Контекст:

    Пусть На локальном диске компьютера пользователя существует файл СканПоступления.pdf

            И затем я выполняю код встроенного языка
            |'  ФайлСканаПоступления = Новый Файл(Ванесса.Объект.КаталогПроекта + "/Присоединенные файлы/СканПоступления.pdf");                  '|
            |'  Контекст.Вставить("ФайлСканаПоступленияСуществует", ФайлСканаПоступления.Существует())  '|
            И выражение внутреннего языка "Контекст.ФайлСканаПоступленияСуществует = Истина" Истинно

    И На локальном диске компьютера пользователя нет файла СканПоступления_СохраненныйИзДокумента.pdf
	
            И затем я выполняю код встроенного языка
            |'НачатьУдалениеФайлов(, Ванесса.Объект.КаталогПроекта + "/Присоединенные файлы/СканПоступления_СохраненныйИзДокумента.pdf");'|
            И Пауза 2
            И затем я выполняю код встроенного языка
            |'  ФайлСканаПоступленияСохраненныйИзДокумента = Новый Файл(Ванесса.Объект.КаталогПроекта + "/Присоединенные файлы/СканПоступления_СохраненныйИзДокумента.pdf"); '|
            |'  Контекст.Вставить("ФайлСканаПоступленияСохраненныйИзДокументаСуществует", ФайлСканаПоступленияСохраненныйИзДокумента.Существует())  '|
            И выражение внутреннего языка "НЕ Контекст.ФайлСканаПоступленияСохраненныйИзДокументаСуществует" Истинно

    Тогда Я запускаю сеанс 1С для проверки работы с прикрепленными файлами

            Тогда Я открыл сеанс TestClient от имени "Менеджер по закупкам" с паролем "" или подключаю уже существующий


Сценарий: Прикрепление файлов к новому документу поступления товаров и услуг


    Пусть  я создаю новый документ “Поступление товаров и услуг”


            И В командном интерфейсе я выбираю 'Закупки' 'Документы закупки (все)'
            Тогда открылось окно 'Документы закупки (все)'
            И в таблице "СписокДокументыЗакупки" я нажимаю на кнопку с именем 'Создать_ЗакупкаУПоставщика_ПриобретениеТоваровУслуг'
            Тогда открылось окно 'Приобретение товаров и услуг (создание)'            
            И из выпадающего списка "Организация" я выбираю по строке 'Управленческая организация'


    И  Я пытаюсь прикрепить к нему файл СканПоступления.pdf

           И В текущем окне я нажимаю кнопку командного интерфейса 'Файлы'


    Тогда система сообщает о необходимости предварительно записать документ

            Тогда открылось окно '1С:Предприятие'
            И значение поля с именем "Поле1" содержит текст "Данные еще не записаны"

    Тогда  Я записываю документ
        
            И я нажимаю на кнопку 'OK'
            Тогда открылось окно 'Приобретение товаров и услуг *'


    И  Я успешно прикрепляю файл СканПоступления.pdf к документу

            И В текущем окне я нажимаю кнопку командного интерфейса 'Файлы'
            И  Я буду выбирать внешний файл "$КаталогПроекта$\Присоединенные файлы\СканПоступления.pdf"    
            И я нажимаю на кнопку 'Файл с диска...'
            Тогда открылось окно 'Приобретение товаров и услуг *'

    И  файл становится доступен для выбора в списке прикрепленных к документу файлов            

            И в таблице "Список" я перехожу к строке:
                | 'Наименование'  |
                | 'СканПоступления' |    
    

    Тогда  Я закрываю документ поступления товаров

            И  В текущем окне я нажимаю кнопку командного интерфейса 'Основное'
            И  я запоминаю значение поля с именем "Номер" как "НомерДокумента"
            И  я запоминаю значение поля с именем "Дата" как "ДатаДокумента"
            И  я вывожу значение переменной "НомерДокумента"
            И  я вывожу значение переменной "ДатаДокумента"
            И  Я закрываю окно 'Приобретение товаров и услуг *'


    И  я заново открываю документ поступления

            Тогда открылось окно 'Документы закупки (все)'
            И в таблице "СписокДокументыЗакупки" я нажимаю на кнопку с именем 'СписокДокументыЗакупкиУстановитьИнтервал'
            Тогда открылось окно 'Выберите период'
            И в поле с именем "DateBegin" ввожу значение переменной "ДатаДокумента"
            И я нажимаю на кнопку 'Выбрать'

            И в таблице "СписокДокументыЗакупки" я перехожу к строке:
                | 'Номер'            |
                | '$НомерДокумента$' |    

            И в таблице "СписокДокументыЗакупки" я нажимаю на кнопку с именем 'СписокДокументыЗакупкиУстановитьИнтервал'
            Тогда открылось окно 'Выберите период'
            И я нажимаю на кнопку 'Очистить период'
            И я нажимаю на кнопку 'Выбрать'

            И в таблице "СписокДокументыЗакупки" я выбираю текущую строку
            Тогда открылось окно 'Приобретение товаров и услуг *'

 
    И  в списке прикрепленных файлов по прежнему доступен для выбора ранее прикрепленный файл

            И В текущем окне я нажимаю кнопку командного интерфейса 'Файлы'
            И в таблице "Список" я перехожу к строке:
                | 'Наименование'  |
                | 'СканПоступления' |

 
    Тогда  Я сохраняю этот файл на диск компьютера пользователя под именем СканПоступления_СохраненныйИзДокумента.pdf

            И  Я буду выбирать внешний файл "$КаталогПроекта$\Присоединенные файлы\СканПоступления_СохраненныйИзДокумента.pdf"    
            И я выбираю пункт контекстного меню с именем 'СписокКонтекстноеМенюСохранитьКак' на элементе формы с именем "Список"    
            Тогда открылось окно 'Приобретение товаров и услуг *'    


    И   на диске действительно появляется сохраненный файл

            И  Я буду выбирать внешний файл "$КаталогПроекта$\Присоединенные файлы\СканПоступления_СохраненныйИзДокумента.pdf" 
            И я нажимаю на кнопку 'Файл с диска...'
            Тогда открылось окно 'Приобретение товаров и услуг *'
            И в таблице "Список" я перехожу к строке:
                | 'Наименование'                           |
                | 'СканПоступления_СохраненныйИзДокумента' |


 

Проверяем результат : файлы действительно удаляются, создаются, прикрепляются как мы и описали в сценарии :

 

 

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

Можете теперь проверить на своей демо базе УТ 11.4 , выбрав для шага запуска тест-клиента  пользователя “Закупки (КоролевСВ)”. У меня этот пользователь был переименован в “Менеджер по закупкам”. У меня не самый последний релиз 11.4.1.241, но если в последних релизах не произошло существенных изменений, то он должен работать.

 

И последнее замечание в этом разделе. Если сравнить шаги-группы в последнем сценарии и самую первую спецификацию, то можно заметить, что мы немного изменили шаги исходной спецификации. В этом нет ничего плохого. Например изначально мы предполагали, что будет удобно если после записи документа система сразу продолжит присоединение файла. Но потом оказалось, что механизм БСП работает несколько иначе и чтобы его не изменять мы договорились с заказчиком, что после записи он еще раз нажмет на команду Файлы в панели навигации.

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

 

 

 

 

 

 

 

 

 

Интеграционный механизм: распределенная информационная база в УТ 11. Подключение к двум разным базам.

 

 

Перейдем к следующему примеру и решим еще одну нетривиальную задачу.  Напишем сценарий для обмена между двумя базами “Управления торговлей 11”.  В первой части цикла мы запускали тест-клиенты под разными пользователями. Теперь же нам предстоит посмотреть как Vanessa-ADD может задействовать в сценариях разные базы данных.

 


В ходе создания этого сценария мы разберем следующие вопросы:

1.   Как запустить несколько тест-клиентов и при необходимости переключаться между ними в процессе выполнения сценария?

2.   Как использовать одни и те же данные в двух тест-клиентах с помощью структуры Контекст?

3.   Как обеспечить уникальность элементов справочника?

4.   Как задействовать условие в сценарии для обхода поведения прикладного решения, которое сложно предсказать?


 

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

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

Создадим распределенную информационную базу УТ 11. Подробно останавливаться на создании базы не будем так как это задокументированный типовой механизм. 

 
 Скриншоты процесса создания узла РИБ с краткими комментариями можно развернуть

 

Для того, чтобы форма настроенных синхронизаций приняла наиболее общий вид, создадим узел обмена с “Бухгалтерией предприятия 3.0”. Создание узла для обмена с Бухгалтерией не потребует создания базы, так как это не распределенная база данных. Настройки при этом можно указать любые. К такому виду форму лучше привести чтобы потом, при появлении обменов с новыми базами, не приходилось переписывать сценарии для обмена с узлом в РИБ. Конечно в реальных базах при этом нужно сделать так, чтобы изменения не регистрировались на лишних узлах и не увеличивали объем таблиц регистрации изменений, но сейчас это не принципиально.

 

Для начала, как и в первом примере, предлагаю поработать над высокоуровневыми шагами, чтобы создать понятную и для заказчика и для разработчика спецификацию. А затем уже декомпозировать ее или записать на её основе исполняемые шаги.

Ограничения и упрощения:

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

 

Критерий успешности:

Критерием успешности обмена будем считать появление в базе-приемнике номенклатуры с некоторыми наименованием, которой до обмена не было в этой базе, и определенным набором реквизитов, значения которых совпадают со значениями в базе-источнике. В данном примере будем считать что значимый реквизит только один - Артикул. При необходимости шаги для сравнения артикула можно распространить на какое угодно количество реквизитов.

 

 

Обеспечение уникальности наименования :

Ответим на вопрос: как обеспечить отсутствие номенклатуры с нужным наименованием на стороне базы-приемника до выполнения обмена?  

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

        И в базе нет элементов справочника "Номенклатура" с указанными в таблице наименованиями

                  |'Номенклатура к обмену'|

 

Этот способ не подходит нам по двум причинам:

  1. Чтобы не допустить взаимного влияния сценариев друг на друга нам необходимо контролировать, не было ли использовано это наименование в других фича-файлах. Это не сложно - возможности Visual Studio Code для поиска очень хороши. Но всё таки это лишнее неудобство.
  2. Шаг удаления элемента справочника выполняется на стороне тест-менеджера. Если мы запускаем тест-менеджер в базе-источнике то не имеем доступа в базу-приемник. Кроме того тест-менеджер может быть запущен вообще в какой-то независимой от источника и приемника базе, где даже нет справочника “Номенклатура” (ведь тест-менеджер запущенный даже из пустой базы может управлять тест-клиентом из любой другой базы).

 

Вторым способом является генерация уникального наименования каждый раз и создание в базе-источнике номенклатуры с этим уникальным наименованием, а затем выгрузка этой номенклатуры в базу-приемник. Применим именно этот способ.

Как нам обеспечить уникальность наименования при каждом запуске сценария? Для этого подходит не очень красивый, но зато надёжный прием - вставлять в наименование текущую дату и время.Так как наименование в этом случае не является константой, то нам нужно будет его где-то запоминать, и как мы уже знаем, для этого хорошо подходит структура “Контекст”. Она хранится на стороне тест-менеджера, но в нее можно помещать значения, полученные из тест-клиентов и передавать значения в тест клиенты.

Итак, напишем спецификацию с самыми общими шагами, определим что же мы хотим получить от нашего обмена.

 

Функционал: Передача номенклатуры из центрального узла в периферийный узел РИБ



Я как сотрудник отвечающий за НСИ

Хочу создавать номенклатуру в центральном узле распределенной базы и передавать ее в периферийные узлы с сохранением уникальных свойств этой номенклатуры и переносом значимых реквизитов.

Чтобы

    -  обеспечить единый источник информации о номенклатуре:

    -  избежать необходимости создавать номенклатуру в каждой периферийной базе в отдельности

    -  и обеспечить возможность для автоматической синхронизации свойств номенклатуры в дальнейшем.




Сценарий : Передача новой номенклатуры из центрального узла в периферийный


        Пусть Я запускаю базу центрального узла с правами администратора системы

        И в базе центрального узла нет данных к обмену с базой периферийного узла



        Тогда я создаю новую номенклатуру с уникальным наименованием

        И    я указываю в ней артикул AA-11-BB-22

        И    я записываю номенклатуру из формы

        И    я убеждаюсь, что созданная номенклатура зарегистрировалась к обмену

        И    я выполняю отправку данных в периферийный узел

        И    я закрываю базу центрального узла



        Тогда я запускаю базу периферийного узла с полными правами

        И   в базе периферийного узла нет данных к обмену с базой-источником


        Тогда я выполняю загрузку данных в периферийный узел

        И нахожу загруженную номенклатуру с ранее сформированным уникальным наименованием

        И убеждаюсь, что также у нее корректно установлен артикул

        И закрываю базу периферийного узла

        



Сценарий: Обновление свойств ранее созданной номенклатуры

        Дано  Сценарий пока не реализован


 

 

Чтобы не переписывать несколько раз длинный сценарий заранее посмотрим с какими сложностями придётся столкнуться и какие новые исполняемые шаги мы будем использовать.

 

1)   Подключение к нескольким тест-клиентам и переключение между ними

 

Первым из таких шагов будет шаг по запуску тест-клиента в произвольной базе, который в форме выбора известных шагов выглядит следующим образом:  

 

Когда Я подключаю клиент тестирования с параметрами:

    | 'Имя подключения' | 'Синоним'        | 'Порт' | 'Строка соединения'                 | 'Логин' | 'Пароль' | 'Запускаемая обработка' | 'Дополнительные параметры строки запуска' |

    | 'ИмяПрофиля'      | 'СинонимПрофиля' | '1538' | 'Srvr="localhost:1941";Ref="Test";' | 'Админ' | 'Админ'  | 'c:\СуперОбработка.epf' | '/UC'                                     |

 

Важный момент здесь - порт подключения указывать не обязательно. Можно установить здесь значение ‘0’ и система сама его настроит. Одновременно этот шаг регистрирует подключенный тест-клиент в табличной части на вкладке Test clients, позволяя в дальнейшем обращаться к нему по имени для активации этого клиента и переключения между различными клиентами используя еще один шаг :

И я активизирую TestClient "Имя тест-клиента с которым он был зарегистрирован"

 

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

 

Дано Я подключаю клиент тестирования с параметрами:

       | 'Имя подключения' | 'Синоним'        | 'Порт' | 'Строка соединения'                               | 'Логин'         | 'Пароль' | 'Запускаемая обработка' |  'Дополнительные параметры строки запуска'  |

       | 'БазаИсточник'    | 'База-источник'  | '0'    | 'Srvr="HOST:1541";Ref="ut_autotest";'             | 'Администратор' | ''       | ''                      |  ''                                         |



Дано Я подключаю клиент тестирования с параметрами:

       | 'Имя подключения' | 'Синоним'        | 'Порт' | 'Строка соединения'                               | 'Логин'         | 'Пароль' | 'Запускаемая обработка' |  'Дополнительные параметры строки запуска'  |

       | 'БазаПриемник'    | 'База-приемник'  | '0'    | 'Srvr="HOST:1541";Ref="ut_autotest_reciever_";'   | 'Администратор' | ''       | ''                      |  ''                                         |


  И Пауза 5

  И я активизирую TestClient "БазаИсточник"

  И В командном интерфейсе я выбираю 'НСИ и администрирование' 'Синхронизация данных'

  И я активизирую TestClient "БазаПриемник"

  И В командном интерфейсе я выбираю 'Закупки' 'Документы закупки (все)'

  И Пауза 10  

  И я закрываю TestClient "БазаИсточник"

  И я закрываю TestClient "БазаПриемник"

 

На анимации ниже видно как выполняются эти шаги. Сначала в таблице Test clients есть только одна строка для подключения к текущей базе. Это предопределенная строка подключения к текущей базе, её даже нельзя удалить.

Сценарий переключается между базами и в каждой из них открывает разные формы. Шаг активации тест-клиента не приводит к тому, что окно выходит на передний план - при записи я сам выводил на передний план тест-клиент. Поэтому этот шаг плохо подходит для демонстрации функционала или для снятия скриншота в момент возникновения ошибки. Для этих целей лучше запускать тест-клиенты поочередно, а не переключаться между ними. После завершения сценария мы видим на вкладке “Test clients” две новые строки с параметрами подключения к нашим базам :

 

2)    Условие “Если” в сценарии для обхода непредсказуемого поведения системы

Также мы столкнёмся со случаем еще одного “непредсказуемого” поведения прикладного решения. В демо базе УТ включен механизм контроля уникальности номенклатуры по сочетанию свойств и по рабочему наименованию. Создавая номенклатуру с похожими свойствами мы будем натыкаться на предложение системы выбрать уже существующую номенклатуру вместо создания новой. На самом деле это зависит от вида номенклатуры, но чтобы не переписывать сценарий в будущем нам нужно сразу предусмотреть и такое поведение системы.

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

 

 

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

 

    Если появилось окно с заголовком "Конртроль уникальности*" в течение 5 секунд Тогда

        Тогда я нажимаю на кнопку "Продолжить запись"

 

 

 

3)  Ожидание завершения обмена, чтобы не нажать на невидимую кнопку “Закрыть” раньше времени

 

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

 

Текст сценария будет следующим:

 

Попробуем проиграть этот сценарий и посмотрим что произойдет :

 

Совсем не то, чего мы добивались. Окно обмена открылось….  и тут же закрылось. Это произошло благодаря шагу в конце нашего сценария

И я нажимаю на кнопку с именем 'ФормаЗакрыть'

Кнопка хоть и не видна, но к удивлению доступна для нажатия тест-менеджером.  Ее нажатие закрывает окно обмена. К подобным “сверхвозможностям” вроде нажатия невидимой кнопки следует быть готовыми при использовании тест-клиента 1С.   Всё усугубляется тем, что обмен штатно выполняется в фоновом задании, а окно лишь ожидает его завершения и остаётся доступным пользователю. Поменять это поведение типовой конфигурации можно запуская систему с ключем “РежимОтладки”. Но мы так делать не будем, чтобы проверять функциональность именно в том виде, в котором она доступна пользователю.

В форме, где отображается прогресс обмена, нет ничего, для чего мы могли бы применить один из библиотечных шагов-ожиданий. Поэтому здесь нам вновь поможет шаг-пауза. Мы можем поставить паузу на разумное время, которым хотели бы ограничить время обмена, и превышение которого могло бы считаться ошибкой. Если за это время синхронизация не успеет пройти, то будет осуществлено нажатие на кнопку “Закрыть” и сценарий потом выдаст ошибку при попытке найти номенклатуру в базе-приемнике. Будем считать, что нас устроит такая ситуация.

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

Собственно это мы уже предусмотрели в изначальном “высокоуровневом” сценарии.

 


 

Переходим к записи действий пользователя. Произведем запись действий пользователя при обмене на стороне базы-источника:

 

 

Затем на стороне базы-приемника :

 

 

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

Объединим эти два сценария, записанные на стороне источника и стороне приемника. Удалим лишние шаги. Поставим паузы и добавим шаги подключения к базам с параметрами, добавим проверку открытия окна контроля уникальности реквизитов, сформируем наименование номенклатуры используя поле "НаименованиеНоменклатурыКОбмену" структуры “Контекст”. И это же поле будем использовать чтобы найти номенклатуру в базе-приемнике после загрузки.

В итоге получаем следующий сценарий :

 


 

#language: ru

@Tree
Функционал: Передача номенклатуры из центрального узла в периферийный узел РИБ


Я как сотрудник отвечающий за НСИ

Хочу создавать номенклатуру в центральном узле распределенной базы и передавать ее в периферийные узлы с сохранением уникальных свойств этой номенклатуры и переносом значимых реквизитов.

Чтобы 
    -  обеспечить единый источник информации о номенклатуре: 
    -  избежать необходимости создавать номенклатуру в каждой периферийной базе в отдельности 
    -  и обеспечить возможность для автоматической синхронизации свойств номенклатуры в дальнейшем.



Контекст:

    И Я однократно формирую наименование номенклатуры к обмену на основе текущей даты и времени

             И Я запоминаю значение выражения '"Номенклатура к обмену от " + Строка(ТекущаяДата())' в переменную 'НаименованиеНоменклатурыКОбмену'
             # Выполняем отладочный вывод наименования номенклатуры
             И я вывожу значение переменной "НаименованиеНоменклатурыКОбмену"   



Сценарий: Передача новой номенклатуры из центрального узла в периферийный


    Пусть Я запускаю базу центрального узла с правами администратора системы

             Дано Я подключаю клиент тестирования с параметрами:
                 | 'Имя подключения' | 'Синоним'        | 'Порт' | 'Строка соединения'                   | 'Логин'         | 'Пароль' | 'Запускаемая обработка' |  'Дополнительные параметры строки запуска'  |
                 | 'БазаИсточник'    | 'База-источник'  | '0'    | 'Srvr="HOST:1541";Ref="ut_autotest";' | 'Администратор' | ''       | ''                      |  ''                                         |

    И в базе центрального узла нет данных к обмену с базой периферийного узла

             И В командном интерфейсе я выбираю 'НСИ и администрирование' 'Синхронизация данных'             
             Тогда открылось окно 'Синхронизация данных'        
             И я нажимаю на кнопку 'Синхронизация данных'             
             Тогда открылось окно 'Список настроенных синхронизаций данных'

             И в таблице "СписокСостоянияУзлов" я перехожу к строке:
                 | 'Информационная база' | 'Программа'                          |
                 | 'Приемник'            | 'Распределенная информационная база' |
             
             И в таблице "СписокСостоянияУзлов" я активизирую поле "Программа"
             И я выбираю пункт контекстного меню с именем 'СписокСостоянияУзловКонтекстноеМенюСоставОтправляемыхДанных' на элементе формы с именем "СписокСостоянияУзлов"
             Тогда открылось окно 'Регистрация изменений для обмена с  "Приемник"'
             
             И в таблице "ДеревоМетаданных" я перехожу к строке:
                 | 'Объект конфигурации'                  |
                 | 'Источник - Управление торговлей' |
             
             И я нажимаю на кнопку 'Всех объектов выбранных типов'
             Тогда открылось окно 'Подтверждение'
             И я нажимаю на кнопку 'Да'


    Тогда я создаю новую номенклатуру с уникальным наименованием

             Тогда В панели разделов я выбираю 'НСИ и администрирование'
             И В панели функций я выбираю 'Номенклатура'
             Тогда открылось окно 'Номенклатура'
             И я нажимаю на кнопку с именем 'СписокРасширенныйПоискНоменклатураСоздать'
             Тогда открылось окно 'Номенклатура (создание)'
             И из выпадающего списка с именем "ВидНоменклатурыОбязательныеПоля" я выбираю по строке 'Кабели силовые NYM'
             И в поле 'Рабочее наименование' я ввожу значение переменной "НаименованиеНоменклатурыКОбмену"

             И из выпадающего списка "Единица хранения" я выбираю по строке 'ш'
             И из выпадающего списка "Ставка НДС" я выбираю по строке '18%'
             И из выпадающего списка "Число жил" я выбираю по строке '1'
             И из выпадающего списка "Сечение (кв_мм)" я выбираю по строке '1,5'
             И в поле 'Наружный диаметр (кв. мм)' я ввожу текст '1,0'
             И в поле 'Расчетная масса (кг/км)' я ввожу текст '1'
             И из выпадающего списка "Производитель" я выбираю по строке 'фабрика мебели'
             И я перехожу к следующему реквизиту


    И я указываю в ней артикул AA-11-BB-22
             
             И я меняю значение переключателя 'НастройкаВидимостиФормы' на 'Показать все'
             И в поле 'Артикул' я ввожу текст 'AA-11-BB-22'
             # Фиксируем ввод артикула перед тем, как его запомнить
             И я перехожу к следующему реквизиту
             И я запоминаю значение поля "Артикул" как "АртикулНоменклатурыКОбмену"

             
    И я записываю номенклатуру из формы
 
             И я нажимаю на кнопку 'Записать и закрыть'
             Когда открылось окно 'Контроль уникальности*'
             Если появилось окно с заголовком "Конртроль уникальности*" в течение 5 секунд Тогда             
                 Тогда я нажимаю на кнопку "Продолжить запись"             

    И я убеждаюсь, что созданная номенклатура зарегистрировалась к обмену

             Когда В панели открытых я выбираю 'Регистрация изменений для обмена с  \"Приемник\"'
             Тогда открылось окно 'Регистрация изменений для обмена с  "Приемник"'
             И я нажимаю на кнопку с именем 'ОбновитьВсеДанные'
             
             И в таблице "ДеревоМетаданных" я разворачиваю строку:
                 | 'Объект конфигурации' |
                 | 'Справочники'         |
             И в таблице "ДеревоМетаданных" я перехожу к строке:
                 | 'Объект конфигурации' |
                 | 'Номенклатура'        |
             И в таблице "СписокСсылок" я перехожу к строке:
                 | 'Номенклатура'                      |
                 | '$НаименованиеНоменклатурыКОбмену$' |



    И    я выполняю отправку данных в периферийный узел

             И В панели открытых я выбираю 'Список настроенных синхронизаций данных'
             Тогда открылось окно 'Список настроенных синхронизаций данных'
             И в таблице "СписокСостоянияУзлов" я перехожу к строке:
                 | 'Информационная база' | 'Программа'                          |
                 | 'Приемник'            | 'Распределенная информационная база' |
             И я нажимаю на кнопку с именем 'ВыполнитьОбменДаннымиПанельСписка'
             Тогда открылось окно 'Синхронизация данных с "Приемник"'
             # Даем 20 секунд на завершение обмена
             И Пауза 20  
             И я нажимаю на кнопку с именем 'ФормаЗакрыть'

    И    я закрываю базу центрального узла       
             
             И я закрываю TestClient "БазаИсточник"


    Тогда я запускаю базу периферийного узла с полными правами 
             Дано Я подключаю клиент тестирования с параметрами:
                 | 'Имя подключения' | 'Синоним'        | 'Порт' | 'Строка соединения'                             | 'Логин'         | 'Пароль' | 'Запускаемая обработка' |  'Дополнительные параметры строки запуска'  |
                 | 'БазаПриемник'    | 'База-приемник'  | '0'    | 'Srvr="HOST:1541";Ref="ut_autotest_reciever_";' | 'Администратор' | ''       | ''                      |  ''                                         |


    И в базе периферийного узла нет данных к обмену с базой-источником

             И В командном интерфейсе я выбираю 'НСИ и администрирование' 'Синхронизация данных'
             Тогда открылось окно 'Синхронизация данных'
             И я нажимаю на кнопку 'Синхронизация данных'
             Тогда открылось окно 'Список настроенных синхронизаций данных'
             И в таблице "СписокСостоянияУзлов" я перехожу к строке:
                 | 'Информационная база' | 'Программа'                          |
                 | 'Центральная база'    | 'Распределенная информационная база' |

             И я выбираю пункт контекстного меню с именем 'СписокСостоянияУзловКонтекстноеМенюСоставОтправляемыхДанных' на элементе формы с именем "СписокСостоянияУзлов"
             Тогда открылось окно 'Регистрация изменений для обмена с  "Центральная база"'
             И в таблице "ДеревоМетаданных" я перехожу к строке:
                 | 'Объект конфигурации'             |
                 | 'Источник - Управление торговлей' |
             И я нажимаю на кнопку 'Всех объектов выбранных типов'
             Тогда открылось окно 'Подтверждение'
             И я нажимаю на кнопку 'Да'

    Тогда я выполняю загрузку данных в периферийный узел

             И В панели открытых я выбираю 'Список настроенных синхронизаций данных'
             И в таблице "СписокСостоянияУзлов" я перехожу к строке:
                 | 'Информационная база' | 'Программа'                          |
                 | 'Центральная база'    | 'Распределенная информационная база' |   
             
             И я нажимаю на кнопку с именем 'ВыполнитьОбменДаннымиПанельСписка'
             Тогда открылось окно 'Синхронизация данных с "Центральная база"'
             # Даем 20 секунд на завершение обмена
             И Пауза 20
             И я нажимаю на кнопку с именем 'ФормаЗакрыть'
    
    
    И нахожу загруженную номенклатуру с ранее сформированным уникальным наименованием

             И В панели разделов я выбираю 'НСИ и администрирование'
             И В панели функций я выбираю 'Номенклатура'
             Тогда открылось окно 'Номенклатура'
             И я снимаю флаг с именем "ИспользоватьФильтры"
             И в таблице "СписокРасширенныйПоискНоменклатура" я перехожу к строке:
                 | 'Наименование'                      |
                 | '$НаименованиеНоменклатурыКОбмену$' |


    И убеждаюсь, что также у нее корректно установлен артикул 

             И в таблице "СписокРасширенныйПоискНоменклатура" я выбираю текущую строку
             И я перехожу к закладке "Реквизиты"
             Тогда элемент формы "Артикул" стал равен "AA-11-BB-22"

    И закрываю базу периферийного узла

             # Пауза для записи финальных кадров картинки-анимации
             И Пауза 1    
             И я закрываю TestClient "БазаПриемник"



Сценарий: Обновление свойств ранее созданной номенклатуры

             # Нереализованный сценарий будет считаться успешно выполненным
             Дано  Сценарий пока не реализован
    

 


 

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

Посмотрим, как выполняется наш сценарий :

Сценарий успешно исполняется, осуществляя поочередное подключение к двум базам.

 

Еще несколько финальных замечаний по полученному сценарию:

 

1)   Вместо одновременного запуска тест-клиентов и переключений между ними через шаг

        И я активизирую TestClient "Имя тест-клиента"

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

 

2)   Мы вновь несколько раз выполняли поиск нужной строки в списке/таблице используя поле структуры Контекст, шаги подобные :

       И в таблице "СписокСсылок" я перехожу к строке:

           | 'Номенклатура'                                              |

           | '$НаименованиеНоменклатурыКОбмену$' |

 

Это один из наиболее частых и полезных приёмов в сложных сценариях. Дальше продолжим его изучение в более сложных случаях.

 

3)   Форма номенклатуры в УТ 11 / ERP 2 очень специфична. В ней есть возможность переключаться между просмотром по иерархии (по группам номенклатуры), просмотрам по видам и свойствам, только видам, только свойствам и даже вообще отключить какую либо группировку номенклатуры при просмотре. При этом последний выбор пользователя система запоминает.  Чтобы не зависеть от этого выбора (не зависеть от других сценариев) будем создавать номенклатуру наиболее общим образом - по кнопке “Создать” не позиционируясь перед этим на виде или группе номенклатуры, а выбирая вид номенклатуры явно в самой форме. Но как уже говорилось в первой публикации такой подход вообще предпочтителен при создании тестовых объектов.

 

4)   Интересный эффект, ранее описанный во второй публикации, мы наблюдаем при исполнении второго нереализованного сценария. Vanessa-ADD встречая нереализованный шаг пропускает его и все остальные шаги этого сценария, но при этом считает, что ошибок нет.

 

 

 

 

 

Проверка движений документа через форму списка. Шаг открытия произвольной формы.

 

 


Разбирая этот пример мы будем преследовать следующие цели :

1.   Научиться работать с отборам в формах динамических списков.

2.   Научиться открывать форму регистра с учетом недоступности меню “Все функции”.

3.   Подробнее изучить шаг позиционирования на строке в таблице формы, в том числе на основе значений из структуры “Контекст”.

4.   Рассмотреть последовательность из двух сценариев в одном фича-файле.  


 

 

Поставим задачу: нам необходимо написать сценарии для регрессионного тестирования процесса проведения заказа по регистру “Расчеты с клиентами” для двух случаев:

1)   когда этапы оплаты заданы непосредственно в заказе клиента без графика платежей

2)   и когда они заполняются на основе графика платежей из соглашения с клиентом

 

Несмотря на то, что мы пишем регрессионный тест, и в этот раз не играем роли заказчиков и разработчиков, написание сценария всё равно начнем с высокоуровневых шагов. Это хорошая практика, позволяющая не просто прокликать какие-то действия, а понять что мы вообще хотим от нашей системы. Более того, это поможет впоследствии поддерживать наши сценарии в актуальном состоянии и обсуждать с коллегами.

Напишем сценарии, выделив общие шаги в контекст :

 

Функционал: Отражение заказа клиента по регистру Расчеты с клиентами



Как QA-инженер

Я хочу убедиться, что заказ клиента корректно отражается по регистру Расчеты с клиентами

Чтобы не допустить регресса системы учета при внесении в неё изменений



Контекст:

        Пусть Я запускаю систему под пользователем с правами на проведение заказа клиента и просмотр регистров

        Тогда Я создаю и записываю новый документ Заказ клиента от 01.01.2019

        И я указываю в нем контрагента, партнера, организацию и вариант продажи Реализация

        И я устанавливаю флаг отгружать одной датой с датой отгрузки 02.01.2019



Сценарий: указание трех этапов оплат непосредственно в заказе


        И я выбираю в заказе соглашение с вариантом расчетов по заказам, в рублях, ценой включающей НДС без графика платежей

        И я указываю в заказе этапы платежей Аванс 10% на 05.01.2019, Предоплата 20% на 10.01.2019 и Кредит 70% на 20.01.2019



        # Цену необходимо назначать после выбора соглашения, так как при выборе соглашения она очищается

        И я выбираю для продажи услугу на общую стоимость 1000 рублей



        Когда я провожу этот заказ клиента

        Тогда в регистре “Расчеты с клиентами” появляется три записи с регистратором равным проведенному заказу клиента

        И среди этих записей есть строка с реквизитами документа, датой оплаты 05.01.2019 и суммой 100

        И среди этих записей есть строка с реквизитами документа, датой оплаты 10.01.2019 и суммой 200

        И среди этих записей есть строка с реквизитами документа, датой оплаты 20.01.2019 и суммой 700





Сценарий: Указание двух этапов оплат в графике платежей заказе


        И я создаю график оплат Аванс 30% срок 5 дней, Предоплата 70% срок 6 дней

        И я создаю соглашение с вариантом расчетов по заказам, в рублях, ценой включающей НДС и созданным графиком

        И я записываю и выбираю это соглашение в заказе



        # Цену необходимо назначать после выбора соглашения, так как при выборе соглашения она очищается

        И я выбираю для продажи услугу на общую стоимость 1000 рублей



        И я заполняю этапы оплаты заказа по графику платежей



        Когда я провожу этот заказ клиента

        Тогда в регистре “Расчеты с клиентами” две записи с регистратором равным проведенному заказу клиента

        И среди этих записей есть строка с реквизитами документа, датой оплаты 06.01.2019 и суммой 300

        И среди этих записей есть строка с реквизитами документа, датой оплаты 07.01.2019 и суммой 700



 

Здесь мы выбрали для заказа клиента фиксированную дату. Это позволит без лишних сложностей проверять даты-периоды движений документа. Указание фиксированной даты документа и даты отгрузки из прошлых периодов для заказа клиента не несёт проблем с точки зрения типового функционала УТ 11. Также мы описали роль как QA-инженер, и допускаем, что у этого пользователя есть права на открытие регистров, отклонение от условий продаж и прочие “админские штучки”.

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

 

 

Удалим лишние шаги перехода к следующим реквизитам, оставляя такие шаги перед переключением на другую вкладку.

Затем заменим шаг

И я изменяю флаг 'Отгружать одной датой' 

на шаг

И я устанавливаю флаг 'Отгружать одной датой'

 

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


 

Контекст:



    Пусть Я запускаю систему под пользователем с правами на проведение заказа клиента и просмотр регистров

           

            Пусть Я открыл сеанс TestClient от имени "QA" с паролем "" или подключаю уже существующий

            И Я закрыл все окна клиентского приложения



    Тогда Я создаю и записываю новый документ Заказ клиента от 01.01.2019



            И В командном интерфейсе я выбираю 'Продажи' 'Заказы клиентов'

            Тогда открылось окно 'Заказы клиентов'

            И в таблице "Список" я нажимаю на кнопку с именем 'СписокСоздать'

            Тогда открылось окно 'Заказ клиента (создание)'

            И в поле 'от' я ввожу текст '01.01.2019  0:00:00'

            И я перехожу к следующему реквизиту

            И я нажимаю на кнопку 'Записать'

            И я запоминаю значение поля с именем "Номер" как "НомерДокумента"

            И я запоминаю значение поля с именем "Дата" как "ДатаДокумента"

   

    И я указываю в нем контрагента, партнера, пустой склад, организацию и вариант продажи Реализация



            И из выпадающего списка с именем "Партнер" я выбираю по строке 'Алхимов А.А.'

            И из выпадающего списка "Контрагент" я выбираю по строке 'Алхимов А.А.'

            И я нажимаю кнопку выбора у поля "Операция"

            И из выпадающего списка "Операция" я выбираю по строке 'Реализация'

            И из выпадающего списка "Организация" я выбираю по строке 'Стройснаб'

            И в поле с именем 'Склад' я ввожу текст ''

            И я нажимаю кнопку выбора у поля "Статус"

            И из выпадающего списка "Статус" я выбираю по строке 'К выполнению'

            И я перехожу к следующему реквизиту



    И я устанавливаю флаг отгружать одной датой с датой отгрузки 02.01.2019        

            И я перехожу к закладке "Товары"

            И я устанавливаю флаг 'Отгружать одной датой'

            И в поле 'ДатаОтгрузки' я ввожу текст '02.01.2019'

            И я перехожу к следующему реквизиту

 

 

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

Сначала прокликаем и запишем эти действия:

 

 

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

Внесём все необходимые корректировки и получим такие шаги :

 

Сценарий: Указание трех этапов оплат непосредственно в заказе



    И я выбираю в заказе соглашение с вариантом расчетов по заказам, в рублях, ценой включающей НДС без графика платежей



            И я нажимаю кнопку выбора у поля "Соглашение"

            Тогда открылось окно 'Соглашения об условиях продаж'

            И в таблице "Список" я нажимаю на кнопку с именем 'СписокСоздатьИндивидуальноеСоглашение'

            Тогда открылось окно 'Индивидуальное соглашение об условиях продаж'



            И Я запоминаю значение выражения '"Соглашение к выбору от " + Строка(ТекущаяДата())' в переменную 'НаименованиеСоглашения'

            И в поле 'Наименование' я ввожу значение переменной "НаименованиеСоглашения"            



            И я перехожу к закладке "Условия продаж"

            И из выпадающего списка "Валюта взаиморасчетов" я выбираю по строке 'RUB'

            И из выпадающего списка "Детализация расчетов" я выбираю по строке 'По заказам'

            И из выпадающего списка "Оплата" я выбираю по строке 'Оплата в рублях'

            И в поле 'График оплаты' я ввожу текст ''

            И из выпадающего списка "Валюта цен" я выбираю по строке 'rub'          

            И я устанавливаю флаг 'Цена включает НДС'

            Тогда открылось окно '1С:Предприятие'

            И я нажимаю на кнопку 'Да'

            И я нажимаю на кнопку 'Записать и закрыть'

            И я жду закрытия окна 'Индивидуальное соглашение об условиях продаж *' в течение 5 секунд

            Тогда открылось окно 'Соглашения об условиях продаж'

            И в таблице "Список" я перехожу к строке:

                | 'Наименование'             |

                | '$НаименованиеСоглашения$' |

            И в таблице "Список" я выбираю текущую строку

 

 

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

 

Но просмотрев результат записи мы обнаружим одну неприятную особенность  :  мы не увидим шага по открытию меню “Все функции”. Не увидим мы этого даже в исходном тексте XML от тест-клиента. В нём сразу после действий в форме документа будут узлы, описывающие переход к строке “Расчеты с клиентами”:

 

 

Таким образом для открытия формы регистра накопления нам не поможет меню “Все функции”. Но есть специальный шаг, который поможет нам открыть эту форму :

Дано Я открываю основную форму регистра накопления "РасчетыСКлиентами"

 

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

 

Как мы видим вид сравнения “меньше или равно” - это параметр шага. Вместо него можно написать просто “равно”. То есть наш шаг должен принять вид:

Тогда в таблице "Список" количество строк "равно" 3

 

Когда мы устанавливаем отбор по регистратору нам нужно как-то спозиционироваться на нашем заказе. Автоматически будет записан такой шаг, в котором номер документа и дата будут прописаны как константы:

 

    И в таблице "Список" я перехожу к строке:

        | 'Валюта' | 'Дата'                | 'Клиент'       | 'Номер'       | 'Сумма'    |

        | 'RUB'    | '01.01.2019 13:48:08' | 'Алхимов А.А.' | 'СБЦБ-000007' | '1 000,00' |

 

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

 

    И в таблице "Список" я перехожу к строке:

| 'Дата'                           | 'Номер'            |

| '$ДатаДокумента$'     | '$НомерДокумента$' |

 

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

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

 

Вместо даты регистратора опять же подставим переменную из структуры “Контекст”. Также мы можем избавиться от проверки незначащих для нас колонок, например по регистратору мы итак установили отбор и проверять его нам нет необходимости. Однако проверить, что объектом расчета действительно является заказ было бы хорошо.  

Хотелось бы записать шаг следующим образом :

            И в таблице "Список" я перехожу к строке:

                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Номер строки' | 'Объект расчетов' | 'Организация' | 'Партнер'      | 'Период'              |

                | 'RUB'    | '05.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '100,00'           | 'Алхимов А.А.' | '1'            | 'Заказ клиента *' | 'Стройснаб'   | 'Алхимов А.А.' | '05.01.2019 23:59:59' |

 

Но, к сожалению, мы не можем использовать символ подстановки - звёздочку  в этом шаге. Без проверки объекта расчета он будет выполняться успешно, но как только в колонке “Объект расчетов” мы напишем “Заказ клиента *”  тут же возникнет ошибка. На скриншоте ниже видно, что первый шаг прошел успешно, а второй аналогичный, но с объектом расчетов, выдал ошибку :

 

 

И если мы действительно хотим проверять объект расчетов, то нужно сформировать его представление в структуре “Контекст” и использовать для проверки поле этой структуры. Так и сделаем. К шагам по запоминанию номера и даты добавим шаг, запоминающий представление документа-заказа. Для этого можно было бы программно обратиться к полю Объект.Ссылка формы заказа клиента, но в нашем случае можно просто взять заголовок окна (так можно делать не всегда, для некоторых объектов в УТ 11 заголовок окна будет не соответствовать представлению объекта в отчетах по движениям) :

 

После записи документа будем теперь выполнять три шага, вместо двух:

 

            И я запоминаю значение поля с именем "Номер" как "НомерДокумента"

            И я запоминаю значение поля с именем "Дата" как "ДатаДокумента"

            И я запоминаю текущее окно как "ПредставлениеОбъетаРасчетов"

 

И тогда шаг проверки записи движения примет вид :

            И в таблице "Список" я перехожу к строке:

                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Объект расчетов'               | 'Организация' | 'Партнер'      | 'Период'              |

                | 'RUB'    | '05.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '100,00'           | 'Алхимов А.А.' | '$ПредставлениеОбъетаРасчетов$' | 'Стройснаб'   | 'Алхимов А.А.' | '05.01.2019 23:59:59' |

   

 

Тогда наш сценарий целиком примет следующий вид :


#language: ru

@tree

Функционал: Отражение заказа клиента по регистру Расчеты с клиентами



Как QA-инженер

Я хочу убедиться, что заказ клиента корректно отражается по регистру Расчеты с клиентами

Чтобы не допустить регресса системы учета при внесении в неё изменений



Контекст:



    Пусть Я запускаю систему под пользователем с правами на проведение заказа клиента и просмотр регистров

           

            Пусть Я открыл сеанс TestClient от имени "QA" с паролем "" или подключаю уже существующий

            И Я закрыл все окна клиентского приложения



    Тогда Я создаю и записываю новый документ Заказ клиента от 01.01.2019



            И В командном интерфейсе я выбираю 'Продажи' 'Заказы клиентов'

            Тогда открылось окно 'Заказы клиентов'

            И в таблице "Список" я нажимаю на кнопку с именем 'СписокСоздать'

            Тогда открылось окно 'Заказ клиента (создание)'

            И в поле с именем 'Дата' я ввожу текст '01.01.2019  0:00:00'

            И я перехожу к следующему реквизиту

            И я нажимаю на кнопку 'Записать'

            И я запоминаю значение поля с именем "Номер" как "НомерДокумента"

            И я запоминаю значение поля с именем "Дата" как "ДатаДокумента"

            И я запоминаю текущее окно как "ПредставлениеОбъетаРасчетов"



    И я указываю в нем контрагента, партнера, пустой склад, организацию и вариант продажи Реализация



            И из выпадающего списка с именем "Партнер" я выбираю по строке 'Алхимов А.А.'

            И из выпадающего списка "Контрагент" я выбираю по строке 'Алхимов А.А.'

            И я нажимаю кнопку выбора у поля "Операция"

            И из выпадающего списка "Операция" я выбираю по строке 'Реализация'

            И из выпадающего списка "Организация" я выбираю по строке 'Стройснаб'

            И в поле с именем 'Склад' я ввожу текст ''

            И я нажимаю кнопку выбора у поля "Статус"

            И из выпадающего списка "Статус" я выбираю по строке 'К выполнению'

            И я перехожу к следующему реквизиту



    И я устанавливаю флаг отгружать одной датой с датой отгрузки 02.01.2019        

            И я устанавливаю флаг 'Отгружать одной датой'

            И в поле 'ДатаОтгрузки' я ввожу текст '02.01.2019'

            И я перехожу к следующему реквизиту





Сценарий: Указание трех этапов оплат непосредственно в заказе



    И я выбираю в заказе соглашение с вариантом расчетов по заказам, в рублях, ценой включающей НДС без графика платежей



            И я нажимаю кнопку выбора у поля "Соглашение"

            Тогда открылось окно 'Соглашения об условиях продаж'

            И в таблице "Список" я нажимаю на кнопку с именем 'СписокСоздатьИндивидуальноеСоглашение'

            Тогда открылось окно 'Индивидуальное соглашение об условиях продаж'



            И Я запоминаю значение выражения '"Соглашение к выбору от " + Строка(ТекущаяДата())' в переменную 'НаименованиеСоглашения'

            И в поле 'Наименование' я ввожу значение переменной "НаименованиеСоглашения"            



            И я перехожу к закладке "Условия продаж"

            И из выпадающего списка "Валюта взаиморасчетов" я выбираю по строке 'RUB'

            И из выпадающего списка "Детализация расчетов" я выбираю по строке 'По заказам'

            И из выпадающего списка "Оплата" я выбираю по строке 'Оплата в рублях'

            И в поле 'График оплаты' я ввожу текст ''

            И из выпадающего списка "Валюта цен" я выбираю по строке 'rub'          

            И я устанавливаю флаг 'Цена включает НДС'

            Тогда открылось окно '1С:Предприятие'

            И я нажимаю на кнопку 'Да'

            И я нажимаю на кнопку 'Записать и закрыть'

            И я жду закрытия окна 'Индивидуальное соглашение об условиях продаж *' в течение 5 секунд

            Тогда открылось окно 'Соглашения об условиях продаж'

            И в таблице "Список" я перехожу к строке:
                | 'Наименование'             |
                | '$НаименованиеСоглашения$' |

            И в таблице "Список" я выбираю текущую строку





    И я указываю в заказе этапы платежей Аванс 10% на 05.01.2019, Предоплата 20% на 10.01.2019 и Кредит 70% на 20.01.2019



            И я нажимаю на гиперссылку "НадписьЭтапыОплаты"

            Тогда открылось окно 'Правила оплаты'

            И из выпадающего списка "Расчеты" я выбираю по строке 'По заказам'  

            И в поле 'Банковский счет' я ввожу текст ''

            И в таблице "ЭтапыГрафикаОплаты" я нажимаю на кнопку с именем 'ЭтапыГрафикаОплатыДобавить'  

            И в таблице "ЭтапыГрафикаОплаты" из выпадающего списка "Вариант оплаты" я выбираю по строке 'Аванс'

            И в таблице "ЭтапыГрафикаОплаты" в поле 'Дата платежа' я ввожу текст '05.01.2019'  

            И в таблице "ЭтапыГрафикаОплаты" в поле '% платежа' я ввожу текст '10,00'

            И в таблице "ЭтапыГрафикаОплаты" я завершаю редактирование строки

            И в таблице "ЭтапыГрафикаОплаты" я нажимаю на кнопку с именем 'ЭтапыГрафикаОплатыДобавить'

            И в таблице "ЭтапыГрафикаОплаты" из выпадающего списка "Вариант оплаты" я выбираю по строке 'Предоплата'

            И в таблице "ЭтапыГрафикаОплаты" в поле 'Дата платежа' я ввожу текст '10.01.2019'

            И в таблице "ЭтапыГрафикаОплаты" в поле '% платежа' я ввожу текст '20,00'

            И в таблице "ЭтапыГрафикаОплаты" я завершаю редактирование строки

            И в таблице "ЭтапыГрафикаОплаты" я нажимаю на кнопку с именем 'ЭтапыГрафикаОплатыДобавить'

            И в таблице "ЭтапыГрафикаОплаты" из выпадающего списка "Вариант оплаты" я выбираю по строке 'Кредит'

            И в таблице "ЭтапыГрафикаОплаты" в поле 'Дата платежа' я ввожу текст '20.01.2019'

            И в таблице "ЭтапыГрафикаОплаты" в поле '% платежа' я ввожу текст '70,00'

            И в таблице "ЭтапыГрафикаОплаты" я завершаю редактирование строки

            И я нажимаю на кнопку 'Перенести в документ'





    И я выбираю для продажи услугу на общую стоимость 1000 рублей



           И я перехожу к закладке "Товары"

           И в таблице "Товары" я нажимаю на кнопку с именем 'ТоварыДобавить'

           И в таблице "Товары" из выпадающего списка "Номенклатура" я выбираю по строке 'Услуга 1'

           И в таблице "Товары" в поле 'Количество' я ввожу текст '1,000'

           И в таблице "Товары" из выпадающего списка "Вид цены" я выбираю точное значение '<произвольная>'

           И в таблице "Товары" в поле 'Цена' я ввожу текст '1 000,00'

           И в таблице "Товары" я завершаю редактирование строки





    Когда я провожу этот заказ клиента

   

            И я нажимаю на кнопку 'Провести'

   

    Тогда в регистре “Расчеты с клиентами” появляется три записи с регистратором равным проведенному заказу клиента



            Дано Я открываю основную форму регистра накопления "РасчетыСКлиентами"

            Тогда открылось окно 'Расчеты с клиентами'

            И я нажимаю на кнопку 'Настроить список...'

            Тогда открылось окно 'Настройка списка'

           

            И я перехожу к закладке "Отбор"

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0ДоступныеПоляТаблица" я перехожу к строке:
                | 'Доступные поля' |
                | 'Регистратор'    |

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0ДоступныеПоляТаблица" я выбираю текущую строку

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор" я нажимаю кнопку выбора у реквизита "Значение"

            Тогда открылось окно 'Выбор типа данных'

            И В форме "Выбор типа данных" в таблице "" я перехожу к строке:
                | ''              |
                | 'Заказ клиента' |

            И в таблице "" я выбираю текущую строку

            Тогда открылось окно 'Заказы клиентов'

            И в таблице "Список" я перехожу к строке:
                | 'Дата'                | 'Номер'            |
                | '$ДатаДокумента$'     | '$НомерДокумента$' |



            И в таблице "Список" я выбираю текущую строку

            Тогда открылось окно 'Настройка списка'

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор" я завершаю редактирование строки

            И я нажимаю на кнопку 'Завершить редактирование'

            Тогда открылось окно 'Расчеты с клиентами'



            Тогда в таблице "Список" количество строк "равно" 3



    И среди этих записей есть строка с реквизитами документа, датой оплаты 05.01.2019 и суммой 100



            И в таблице "Список" я перехожу к строке:

                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Объект расчетов'               | 'Организация' | 'Партнер'      | 'Период'              |
                | 'RUB'    | '05.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '100,00'           | 'Алхимов А.А.' | '$ПредставлениеОбъетаРасчетов$' | 'Стройснаб'   | 'Алхимов А.А.' | '05.01.2019 23:59:59' |

   

    И среди этих записей есть строка с реквизитами документа, датой оплаты 10.01.2019 и суммой 200



            И в таблице "Список" я перехожу к строке:
                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Объект расчетов'               | 'Организация' | 'Партнер'      | 'Период'              |
                | 'RUB'    | '10.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '200,00'           | 'Алхимов А.А.' | '$ПредставлениеОбъетаРасчетов$' | 'Стройснаб'   | 'Алхимов А.А.' | '10.01.2019 23:59:59' |



    И среди этих записей есть строка с реквизитами документа, датой оплаты 20.01.2019 и суммой 700




            И в таблице "Список" я перехожу к строке:
                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Объект расчетов'               | 'Организация' | 'Партнер'      | 'Период'              |
                | 'RUB'    | '20.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '700,00'           | 'Алхимов А.А.' | '$ПредставлениеОбъетаРасчетов$' | 'Стройснаб'   | 'Алхимов А.А.' | '20.01.2019 23:59:59' |



 


 

И после загрузки в Vanessa-ADD будет выглядеть так :

 

 

Наш сценарий всё ещё содержит ошибки!  Он не позволит выполниться следующему после него сценарию. И даже не позволит выполниться самому себе во второй раз. Чтобы продемонстрировать проблему давайте выполним его дважды. В первый раз ошибок не будет, а во второй раз мы увидим проблему :

 

 

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

Для исправления поведения можно поступить двумя способами - снять все флаги в таблице отборов или просто удалить все строки из таблицы отборов. Мы воспользуемся вторым способом. В этом нам поможет шаг :

И я удаляю все строки таблицы "ИмяТаблицы"

 

Добавим в конец нашего сценария следующий текст


    И я отключаю отбор в списке регистра, чтобы не влиять на другие сценарии

            И я нажимаю на кнопку 'Настроить список...'

            Тогда открылось окно 'Настройка списка'

            И я перехожу к закладке "Отбор"

            И я удаляю все строки таблицы "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор"

            И я нажимаю на кнопку 'Завершить редактирование'



 

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

 

 

Итак, финальный текст нашей спецификации (фича-файла)  получился таким:

 


 

#language: ru

@tree


Функционал: Отражение заказа клиента по регистру Расчеты с клиентами


Как QA-инженер
Я хочу убедиться, что заказ клиента корректно отражается по регистру Расчеты с клиентами
Чтобы не допустить регресса системы учета при внесении в неё изменений


Контекст:


    Пусть Я запускаю систему под пользователем с правами на проведение заказа клиента и просмотр регистров

           
            Пусть Я открыл сеанс TestClient от имени "QA" с паролем "" или подключаю уже существующий
            И Я закрыл все окна клиентского приложения


    Тогда Я создаю и записываю новый документ Заказ клиента от 01.01.2019



            И В командном интерфейсе я выбираю 'Продажи' 'Заказы клиентов'

            Тогда открылось окно 'Заказы клиентов'

            И в таблице "Список" я нажимаю на кнопку с именем 'СписокСоздать'

            Тогда открылось окно 'Заказ клиента (создание)'

            И в поле с именем 'Дата' я ввожу текст '01.01.2019  0:00:00'

            И я перехожу к следующему реквизиту

            И я нажимаю на кнопку 'Записать'

            И я запоминаю значение поля с именем "Номер" как "НомерДокумента"

            И я запоминаю значение поля с именем "Дата" как "ДатаДокумента"

            И я запоминаю текущее окно как "ПредставлениеОбъетаРасчетов"



    И я указываю в нем контрагента, партнера, пустой склад, организацию и вариант продажи Реализация



            И из выпадающего списка с именем "Партнер" я выбираю по строке 'Алхимов А.А.'

            И из выпадающего списка "Контрагент" я выбираю по строке 'Алхимов А.А.'

            И я нажимаю кнопку выбора у поля "Операция"

            И из выпадающего списка "Операция" я выбираю по строке 'Реализация'

            И из выпадающего списка "Организация" я выбираю по строке 'Стройснаб'

            И в поле с именем 'Склад' я ввожу текст ''

            И я нажимаю кнопку выбора у поля "Статус"

            И из выпадающего списка "Статус" я выбираю по строке 'К выполнению'

            И я перехожу к следующему реквизиту



    И я устанавливаю флаг отгружать одной датой с датой отгрузки 02.01.2019        

            И я устанавливаю флаг 'Отгружать одной датой'

            И в поле 'ДатаОтгрузки' я ввожу текст '02.01.2019'

            И я перехожу к следующему реквизиту





Сценарий: Указание трех этапов оплат непосредственно в заказе



    И я выбираю в заказе соглашение с вариантом расчетов по заказам, в рублях, ценой включающей НДС без графика платежей



            И я нажимаю кнопку выбора у поля "Соглашение"

            Тогда открылось окно 'Соглашения об условиях продаж'

            И в таблице "Список" я нажимаю на кнопку с именем 'СписокСоздатьИндивидуальноеСоглашение'

            Тогда открылось окно 'Индивидуальное соглашение об условиях продаж'



            И Я запоминаю значение выражения '"Соглашение к выбору от " + Строка(ТекущаяДата())' в переменную 'НаименованиеСоглашения'

            И в поле 'Наименование' я ввожу значение переменной "НаименованиеСоглашения"            



            И я перехожу к закладке "Условия продаж"

            И из выпадающего списка "Валюта взаиморасчетов" я выбираю по строке 'RUB'

            И из выпадающего списка "Детализация расчетов" я выбираю по строке 'По заказам'

            И из выпадающего списка "Оплата" я выбираю по строке 'Оплата в рублях'

            И в поле 'График оплаты' я ввожу текст ''

            И из выпадающего списка "Валюта цен" я выбираю по строке 'rub'          

            И я устанавливаю флаг 'Цена включает НДС'

            Тогда открылось окно '1С:Предприятие'

            И я нажимаю на кнопку 'Да'

            И я нажимаю на кнопку 'Записать и закрыть'

            И я жду закрытия окна 'Индивидуальное соглашение об условиях продаж *' в течение 5 секунд

            Тогда открылось окно 'Соглашения об условиях продаж'

            И в таблице "Список" я перехожу к строке:
                | 'Наименование'             |
                | '$НаименованиеСоглашения$' |

            И в таблице "Список" я выбираю текущую строку





    И я указываю в заказе этапы платежей Аванс 10% на 05.01.2019, Предоплата 20% на 10.01.2019 и Кредит 70% на 20.01.2019



            И я нажимаю на гиперссылку "НадписьЭтапыОплаты"

            Тогда открылось окно 'Правила оплаты'

            И из выпадающего списка "Расчеты" я выбираю по строке 'По заказам'  

            И в поле 'Банковский счет' я ввожу текст ''

            И в таблице "ЭтапыГрафикаОплаты" я нажимаю на кнопку с именем 'ЭтапыГрафикаОплатыДобавить'  

            И в таблице "ЭтапыГрафикаОплаты" из выпадающего списка "Вариант оплаты" я выбираю по строке 'Аванс'

            И в таблице "ЭтапыГрафикаОплаты" в поле 'Дата платежа' я ввожу текст '05.01.2019'  

            И в таблице "ЭтапыГрафикаОплаты" в поле '% платежа' я ввожу текст '10,00'

            И в таблице "ЭтапыГрафикаОплаты" я завершаю редактирование строки

            И в таблице "ЭтапыГрафикаОплаты" я нажимаю на кнопку с именем 'ЭтапыГрафикаОплатыДобавить'

            И в таблице "ЭтапыГрафикаОплаты" из выпадающего списка "Вариант оплаты" я выбираю по строке 'Предоплата'

            И в таблице "ЭтапыГрафикаОплаты" в поле 'Дата платежа' я ввожу текст '10.01.2019'

            И в таблице "ЭтапыГрафикаОплаты" в поле '% платежа' я ввожу текст '20,00'

            И в таблице "ЭтапыГрафикаОплаты" я завершаю редактирование строки

            И в таблице "ЭтапыГрафикаОплаты" я нажимаю на кнопку с именем 'ЭтапыГрафикаОплатыДобавить'

            И в таблице "ЭтапыГрафикаОплаты" из выпадающего списка "Вариант оплаты" я выбираю по строке 'Кредит'

            И в таблице "ЭтапыГрафикаОплаты" в поле 'Дата платежа' я ввожу текст '20.01.2019'

            И в таблице "ЭтапыГрафикаОплаты" в поле '% платежа' я ввожу текст '70,00'

            И в таблице "ЭтапыГрафикаОплаты" я завершаю редактирование строки

            И я нажимаю на кнопку 'Перенести в документ'





    И я выбираю для продажи услугу на общую стоимость 1000 рублей



           И я перехожу к закладке "Товары"

           И в таблице "Товары" я нажимаю на кнопку с именем 'ТоварыДобавить'

           И в таблице "Товары" из выпадающего списка "Номенклатура" я выбираю по строке 'Услуга 1'

           И в таблице "Товары" в поле 'Количество' я ввожу текст '1,000'

           И в таблице "Товары" из выпадающего списка "Вид цены" я выбираю точное значение '<произвольная>'

           И в таблице "Товары" в поле 'Цена' я ввожу текст '1 000,00'

           И в таблице "Товары" я завершаю редактирование строки





    Когда я провожу этот заказ клиента

   

            И я нажимаю на кнопку 'Провести'

   

    Тогда в регистре “Расчеты с клиентами” появляется три записи с регистратором равным проведенному заказу клиента



            Дано Я открываю основную форму регистра накопления "РасчетыСКлиентами"

            Тогда открылось окно 'Расчеты с клиентами'

            И я нажимаю на кнопку 'Настроить список...'

            Тогда открылось окно 'Настройка списка'

           

            И я перехожу к закладке "Отбор"

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0ДоступныеПоляТаблица" я перехожу к строке:
                | 'Доступные поля' |
                | 'Регистратор'    |

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0ДоступныеПоляТаблица" я выбираю текущую строку

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор" я нажимаю кнопку выбора у реквизита "Значение"

            Тогда открылось окно 'Выбор типа данных'

            И В форме "Выбор типа данных" в таблице "" я перехожу к строке:
                | ''              |
                | 'Заказ клиента' |

            И в таблице "" я выбираю текущую строку

            Тогда открылось окно 'Заказы клиентов'

            И в таблице "Список" я перехожу к строке:
                | 'Дата'                | 'Номер'            |
                | '$ДатаДокумента$'     | '$НомерДокумента$' |



            И в таблице "Список" я выбираю текущую строку

            Тогда открылось окно 'Настройка списка'

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор" я завершаю редактирование строки

            И я нажимаю на кнопку 'Завершить редактирование'

            Тогда открылось окно 'Расчеты с клиентами'



            Тогда в таблице "Список" количество строк "равно" 3



    И среди этих записей есть строка с реквизитами документа, датой оплаты 05.01.2019 и суммой 100



            И в таблице "Список" я перехожу к строке:
                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Объект расчетов'               | 'Организация' | 'Партнер'      | 'Период'              |
                | 'RUB'    | '05.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '100,00'           | 'Алхимов А.А.' | '$ПредставлениеОбъетаРасчетов$' | 'Стройснаб'   | 'Алхимов А.А.' | '05.01.2019 23:59:59' |

   

    И среди этих записей есть строка с реквизитами документа, датой оплаты 10.01.2019 и суммой 200



            И в таблице "Список" я перехожу к строке:
                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Объект расчетов'               | 'Организация' | 'Партнер'      | 'Период'              |
                | 'RUB'    | '10.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '200,00'           | 'Алхимов А.А.' | '$ПредставлениеОбъетаРасчетов$' | 'Стройснаб'   | 'Алхимов А.А.' | '10.01.2019 23:59:59' |



    И среди этих записей есть строка с реквизитами документа, датой оплаты 20.01.2019 и суммой 700





            И в таблице "Список" я перехожу к строке:
                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Объект расчетов'               | 'Организация' | 'Партнер'      | 'Период'              |
                | 'RUB'    | '20.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '700,00'           | 'Алхимов А.А.' | '$ПредставлениеОбъетаРасчетов$' | 'Стройснаб'   | 'Алхимов А.А.' | '20.01.2019 23:59:59' |





    И я отключаю отбор в списке регистра, чтобы не влиять на другие сценарии



            И я нажимаю на кнопку 'Настроить список...'

            Тогда открылось окно 'Настройка списка'

            И я перехожу к закладке "Отбор"

            И я удаляю все строки таблицы "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор"

            И я нажимаю на кнопку 'Завершить редактирование'







Сценарий: Указание двух этапов оплат в графике платежей заказе



    И я создаю график оплат Аванс 30% срок 5 дней, Предоплата 70% срок 6 дней



            И В командном интерфейсе я выбираю 'CRM и маркетинг' 'Графики оплаты'

            Тогда открылось окно 'Графики оплаты'

            И я нажимаю на кнопку с именем 'ФормаСоздать'

            Тогда открылось окно 'График оплаты (создание)'



            И Я запоминаю значение выражения '"График к выбору от " + Строка(ТекущаяДата())' в переменную 'НаименованиеГрафика'

            И в поле 'Наименование' я ввожу значение переменной "НаименованиеГрафика"          

            И в таблице "Этапы" я нажимаю на кнопку с именем 'ЭтапыДобавить'            

            И в таблице "Этапы" из выпадающего списка "Вариант оплаты" я выбираю по строке 'Аванс'

            И в таблице "Этапы" в поле 'Срок (дн)' я ввожу текст '5'            

            И в таблице "Этапы" в поле '% платежа' я ввожу текст '30,00'

            И в таблице "Этапы" я завершаю редактирование строки

            И в таблице "Этапы" я нажимаю на кнопку с именем 'ЭтапыДобавить'

            И в таблице "Этапы" из выпадающего списка "Вариант оплаты" я выбираю по строке 'Пре'

            И в таблице "Этапы" в поле 'Срок (дн)' я ввожу текст '6'

            И в таблице "Этапы" в поле '% платежа' я ввожу текст '70,00'

            И в таблице "Этапы" я завершаю редактирование строки

            И я меняю значение переключателя 'Учет отсрочки по' на 'календарным дням'

            И я нажимаю на кнопку 'Записать и закрыть'

            И я жду закрытия окна 'График оплаты (создание)' в течение 20 секунд





    И я создаю соглашение с вариантом расчетов по заказам, в рублях, ценой включающей НДС



            Когда В панели открытых я выбираю 'Заказ клиента *'

            Тогда открылось окно 'Заказ клиента *'

            И я перехожу к закладке "Основное"



            И я нажимаю кнопку выбора у поля "Соглашение"

            Тогда открылось окно 'Соглашения об условиях продаж'

            И в таблице "Список" я нажимаю на кнопку с именем 'СписокСоздатьИндивидуальноеСоглашение'

            Тогда открылось окно 'Индивидуальное соглашение об условиях продаж'



            И Я запоминаю значение выражения '"Соглашение к выбору от " + Строка(ТекущаяДата())' в переменную 'НаименованиеСоглашения'

            И в поле 'Наименование' я ввожу значение переменной "НаименованиеСоглашения"            

           

            И я перехожу к закладке "Условия продаж"

            И из выпадающего списка "Валюта взаиморасчетов" я выбираю по строке 'RUB'

            И из выпадающего списка "Детализация расчетов" я выбираю по строке 'По заказам'

            И из выпадающего списка "Оплата" я выбираю по строке 'Оплата в рублях'

            И в поле 'График оплаты' я ввожу значение переменной "НаименованиеГрафика"

            И из выпадающего списка "Валюта цен" я выбираю по строке 'rub'          

            И я устанавливаю флаг 'Цена включает НДС'

            Тогда открылось окно '1С:Предприятие'

            И я нажимаю на кнопку 'Да'



    И я записываю и выбираю это соглашение в заказе



            И я нажимаю на кнопку 'Записать и закрыть'

            И я жду закрытия окна 'Индивидуальное соглашение об условиях продаж *' в течение 5 секунд

            Тогда открылось окно 'Соглашения об условиях продаж'

            И в таблице "Список" я перехожу к строке:
                | 'Наименование'             |
                | '$НаименованиеСоглашения$' |

            И в таблице "Список" я выбираю текущую строку





    И я выбираю для продажи услугу на общую стоимость 1000 рублей



           И я перехожу к закладке "Товары"

           И в таблице "Товары" я нажимаю на кнопку с именем 'ТоварыДобавить'

           И в таблице "Товары" из выпадающего списка "Номенклатура" я выбираю по строке 'Услуга 1'

           И в таблице "Товары" в поле 'Количество' я ввожу текст '1,000'

           И в таблице "Товары" из выпадающего списка "Вид цены" я выбираю точное значение '<произвольная>'

           И в таблице "Товары" в поле 'Цена' я ввожу текст '1 000,00'

           И в таблице "Товары" я завершаю редактирование строки





    И я заполняю этапы оплаты заказа по графику платежей

           

            И я перехожу к закладке "Основное"

            И я нажимаю на гиперссылку "НадписьЭтапыОплаты"

            Тогда открылось окно 'Правила оплаты'

            И в таблице "ЭтапыГрафикаОплаты" я нажимаю на кнопку с именем 'ЗаполнитьЭтапыГрафикаОплатыТаблица'          

            И я нажимаю на кнопку 'Перенести в документ'





    Когда я провожу этот заказ клиента

   

            И я нажимаю на кнопку 'Провести'

   

    Тогда в регистре “Расчеты с клиентами” появляется две записи с регистратором равным проведенному заказу клиента



            Дано Я открываю основную форму регистра накопления "РасчетыСКлиентами"

            Тогда открылось окно 'Расчеты с клиентами'

            И я нажимаю на кнопку 'Настроить список...'

            Тогда открылось окно 'Настройка списка'

           

            И я перехожу к закладке "Отбор"

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0ДоступныеПоляТаблица" я перехожу к строке:
                | 'Доступные поля' |
                | 'Регистратор'    |

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0ДоступныеПоляТаблица" я выбираю текущую строку

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор" я нажимаю кнопку выбора у реквизита "Значение"

            Тогда открылось окно 'Выбор типа данных'

            И В форме "Выбор типа данных" в таблице "" я перехожу к строке:
                | ''              |
                | 'Заказ клиента' |

            И в таблице "" я выбираю текущую строку

            Тогда открылось окно 'Заказы клиентов'

            И в таблице "Список" я перехожу к строке:
                | 'Дата'                | 'Номер'            |
                | '$ДатаДокумента$'     | '$НомерДокумента$' |



            И в таблице "Список" я выбираю текущую строку

            Тогда открылось окно 'Настройка списка'

            И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор" я завершаю редактирование строки

            И я нажимаю на кнопку 'Завершить редактирование'

            Тогда открылось окно 'Расчеты с клиентами'



            Тогда в таблице "Список" количество строк "равно" 2



    И среди этих записей есть строка с реквизитами документа, датой оплаты 06.01.2019 и суммой 300



            И в таблице "Список" я перехожу к строке:
                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Объект расчетов'               | 'Организация' | 'Партнер'      | 'Период'              |
                | 'RUB'    | '06.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '300,00'           | 'Алхимов А.А.' | '$ПредставлениеОбъетаРасчетов$' | 'Стройснаб'   | 'Алхимов А.А.' | '06.01.2019 23:59:59' |

   

    И среди этих записей есть строка с реквизитами документа, датой оплаты 07.01.2019 и суммой 700



            И в таблице "Список" я перехожу к строке:
                | 'Валюта' | 'Дата платежа'        | 'Дата регистратора'   | 'Исключать при контроле' | 'К оплате клиенту' | 'Контрагент'   | 'Объект расчетов'               | 'Организация' | 'Партнер'      | 'Период'              |
                | 'RUB'    | '07.01.2019 23:59:59' | '$ДатаДокумента$'     | 'Да'                     | '700,00'           | 'Алхимов А.А.' | '$ПредставлениеОбъетаРасчетов$' | 'Стройснаб'   | 'Алхимов А.А.' | '07.01.2019 23:59:59' |





    И я отключаю отбор в списке регистра, чтобы не влиять на другие сценарии



            И я нажимаю на кнопку 'Настроить список...'

            Тогда открылось окно 'Настройка списка'

            И я перехожу к закладке "Отбор"

            И я удаляю все строки таблицы "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор"

            И я нажимаю на кнопку 'Завершить редактирование'      

 

 

Посмотрим на результат выполнения обоих сценариев :

 

 

Оба сценария выполняются успешно.

 

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

Заметьте, что добавление новых реквизитов в структуру регистра не потребует адаптации сценария. Но преимущество ли это? Ведь по хорошему, если мы проверяем именно движения документа, то при изменении структуры регистра проверки тоже должны измениться и быть адаптированы под новую структуру.

 

В этом случае может быть полезна проверка движений через входящий в состав БСП отчет о движениях. Общий подход проверки табличных документов и пример проверки этого отчета приводился в прошлой публикации, когда мы разбирали команду “Получить состояние текущего элемента формы”. Подробно на сценарии проверки движений через отчет останавливаться в этот раз не будем - попробуйте повторить действия из прошлой публикации, и если возникнут сложности - пишите, разберём возникшие вопросы в комментариях. Просто перечислю плюсы и минусы такого подхода при использовании библиотечных (типовых) шагов.

Проверка движений через отчет обладает важным преимуществами :

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

Но в то же время есть и недостатки

  • Мы не можем отказаться от проверки всех колонок (ячеек) табличного документа в строке, даже если захотим. Мы обязаны перечислить их все, даже пустые ячейки. Иногда это делает описание шага в сценарии очень громоздким.
  • Мы не можем менять порядок проверяемых колонок, перечисляя сначала наиболее важные для нас. Происходит последовательная проверка всех ячеек строки до правой границы табличного документа.
  • Мы не можем использовать подстановку значений из структуры “Контекст”. Если мы передадим для проверки $ДатаДокумента$, то будет искаться именно эта строка, а не значение даты, сохраненное в структуре “Контекст”.

 

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

 

 


 

Ну что же, мы закончили рассмотрение трёх сложных примеров. Надеюсь, что теперь в работе Vanessa-ADD для вас меньше секретов и вы сможете с эффективнее применять этот инструмент для повышения качества разработки на своих проектах.

В следующей части будут разобраны вопросы, которые позволят вам не только использовать Vanessa-ADD “из коробки”, но и значительно расширять её возможности:

  • Создание собственных шагов
  • Создание новых библиотек шагов
  • Экспортные сценарии

 

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

 

 

91

Скачать файлы

Наименование Файл Версия Размер
Присоединенные файлы для ПТУ
.feature 10,34Kb
28.01.19
0
.feature 10,34Kb Скачать
Обмен РИБ через план обмена
.feature 16,24Kb
28.01.19
0
.feature 16,24Kb Скачать
Движения заказа через форму регистра
.feature 30,31Kb
28.01.19
1
.feature 30,31Kb 1 Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
2. script 200 28.01.19 18:45 Сейчас в теме
Капец, какой титанический труд. Мне теперь будет плохо от любых словосочетаний автоматическое тестирование.
3. Vladimir Litvinenko 1695 28.01.19 19:10 Сейчас в теме
(2) Большая часть шагов ведь автоматически записывается. Дальше дело за малым - либо объединить исходный тест-кейс/сценарий c автоматически записанными шагами, либо наоборот, разбить автоматически записанные шаги на логические группы. Некоторые даже и этого не делают, хотя сценарии тогда сложно читать и адаптировать.

И уж точно это проще, чем разработать и запрограммировать механизм. Написание сценария занимает меньше 10% от всей разработки и может выполняться даже не программистом или с его небольшой помощью. Конечно при условии, что разработка ведётся по чётким требованиям, на основе которых можно составить хотя бы тест-кейс. А ещё лучше - сценарий, похожий на тот, что был в начале каждого примера.

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


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

Главная проблема - не написать сценарий, а адаптировать его к изменениям в конфигурации. Чем чаще и масшатбнее меняется функционал, тем больше времени требуется на адаптацию. Об этом собственно уже писал во вводной публикации: https://infostart.ru/public/969637, а вот здесь http://forum.infostart.ru/forum9/topic207123/message2134231/#message2134231 о том же самом писал Денис Олейник. Но это проблема любого тестирования, даже ручного. Оно хорошо работает когда требования к системе изначально поступают обдуманные и не хаотичные. Точно также, как и любая автоматизация.
4. tsukanov 69 28.01.19 20:16 Сейчас в теме
(3)
Большая часть шагов ведь автоматически записывается


Все таки стоит оговариваться, что результат автоматической записи сильно далек от идеального.
Требуется внимательная вычитка, удаление мусора, и замена многих неадекватных шагов.
А неадекватных шагов будет много. Например везде придется заменять шаг переключения флага, т.к. это очевидно рандом. Мы либо ставим флаг, либо снимаем, но не просто меняем несмотря на его состояние. И это далеко не все. Надо будет вырабатывать культуру выбора значений в ссылочных полях, т.к. автоматика будет выдавать что-то типа: "нажать выбор, выбрать текущую строку", что тоже рандом.
Времени на первых порах это занимает довольно много. И избавиться от этого процесса полностью видимо вообще не удастся.

Думаю вы это конечно где-то уже говорили. Оставляю тут эту информацию, чтобы картина была полнее.
7. Vladimir Litvinenko 1695 28.01.19 21:59 Сейчас в теме
(4) Не воспринимайте как критику. Просто когда я смотрю, как работают разработчики на других платформах с аналогичными фреймворками, то начинает казаться, что мы в мире 1С вообще избалованы и капризны )) А ведь на других платформах покрытие систем юнит- и функциональными тестами гораздо чаще является нормой, чем в наших процессах разработки. Может быть у них тоже есть какие-то секреты, позволяющие автоматизировать процесс создания функциональных тестов. Но судя по тому, что можно найти в сети, как раз в 1С сейчас одни из самых удобных фреймворков.

https://www.youtube.com/watch?v=xoS-lsbEojk

https://www.youtube.com/watch?v=55vJUqHSbkQ
8. tsukanov 69 28.01.19 22:15 Сейчас в теме
(7) Не понял что я вообще мог принять за критику ) Ну да ладно (вы вроде всегда максимально тактичны).

К чему вы привели видео не понял, ведь на них вроде программисты )
Для программиста и голое API платформы вполне норм. А если хочется быстро и удобно, то берешь Тестер и погнал.

Мой коммент был не про программистов, а про вероятных пользователей записывалки шагов (тестировщиков и аналитиков).
9. Vladimir Litvinenko 1695 28.01.19 22:29 Сейчас в теме
(8) Комментарий выше и ссылки на видео были к тому, что похоже именно фреймворки для 1С сейчас дают возможность максимально автоматизировать функциональное и сценарное тестирование. По сравнению с инструментами для других платформ. Особенно это касается подходов с использованием Gherkin, которые в случае 1С позволяют заниматься сценарным тестированием и созданием исполняемой документации с минимальным знанием программирования.

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

"Тестер" тоже для 1С, и "Тестирование 3.0". У нас сейчас очень классные инструменты есть. Кажется, что специалистам на других платформах намного сложнее приходится с решением тех же вопросов. Они глубже в техническую сторону вопроса должны погружаться.
10. tsukanov 69 28.01.19 22:39 Сейчас в теме
(9) Я походу переутомился. Не понимаю что мне пишут )

Я понял, что не понял вас до этого, но теперь не могу понять этот коммент.
Пойду посплю, пожалуй ) Переработал )
Vladimir Litvinenko; +1 Ответить
11. Vladimir Litvinenko 1695 28.01.19 22:51 Сейчас в теме
(10) Хорошая мысль. Поступлю аналогично ))
5. tsukanov 69 28.01.19 21:27 Сейчас в теме
Владимир, сделайте, пожалуйста, оглавление. Вы выдаете огромные объемы, но не учитываете, что читать это целиком мало кто решится. Очень тяжело без навигации. И код наверно лучше в спойлеры спрятать.
6. Vladimir Litvinenko 1695 28.01.19 21:52 Сейчас в теме
(5) Предыдущие публикации были с подробным оглавлением. Но здесь сквозные примеры, их сложно разбить на составляющие. В рамках одного примера все действия плавно перетекают одно в другое.

Да, понимаю, что публикация имеет этот недостаток. Поэтому постарался уменьшить его, описав в начале каждого примера какие вопросы будут в ходе него рассмотрены и чему можно на каждом примере научиться. Публикация рассчитана уже на практиков. Тех, кто действительно решил применять VA на своих проектах и кому для старта не хватает может быть только сквозных примеров. И подсказок, которые помогут преодолеть первые препятствия.

Больше таких длинных примеров приводить не планирую, их здесь уже четыре штуки накопилось, учитывая первую часть. Следующая публикация будет для разработчиков. По теме реализации своих шагов, библиотек и экспортных сценариев. Там точно получится сделать нормальную структуру и оглавление.
12. grumagargler 519 28.01.19 23:38 Сейчас в теме
Прошу не делать вывод на основе приводимых примеров о чрезмерной сложности Vanessa-ADD для практического применения


Владимир, отлично, пошли примеры. Но почему не делать выводы, ведь это важно с точки зрения применимости технологии. Так или иначе (даже если его упростить), думаю невооруженным взглядом видно, например, почему простой по сути и очень сложный по форме, является первый сценарий. Безотносительно к вашему труду, а лишь правды ради - назвать сложным сценарий “прикрепления файла к документу” ну ведь никак нельзя. Уверен, вы ожидали подобный комментарий-придирку о недостаточной сложности, но ведь именно в этом и вся суть, а в не в многообещающей методологии.
Для контраста, вот как ваш первый тест выглядит в Тестере:
// Проверка присоединения файла к документу ПоступлениеТоваровУслуг
исходнаяКартинка = "c:\pic1.png";
сохраненнаяКартинка = "c:\pic1_сохраненный.png";

Подключить ();
ЗакрытьВсе ();

// Создаем и записываем документ
Коммандос("e1cib/command/Документ.ПоступлениеТоваровУслуг.Создать");
Здесь();
Нажать("!ФормаЗаписать");

// Открываем список файлов и загружаем картинку
Нажать("Файлы", ПолучитьСсылки());
Здесь();
Приложение.УстановитьРезультатДиалогаВыбораФайла(истина, исходнаяКартинка);
Нажать("!Добавить");

// Выгружаем картинку из бызы предварительно удалив её на диске и проверяем успешность выгрузки
УдалитьФайлы(сохраненнаяКартинка);
Приложение.УстановитьРезультатДиалогаВыбораФайла(Истина, сохраненнаяКартинка);
Нажать("!ФормаСохранитьКак");
файл = Новый Файл(сохраненнаяКартинка);
если не файл.Существует() тогда
	Стоп("Файл " + сохраненнаяКартинка + " не найден");
конецесли;
Показать
JohnyDeath; +1 Ответить
13. Vladimir Litvinenko 1695 29.01.19 00:19 Сейчас в теме
(12) Уверен, каждый инструмент найдёт свою нишу.

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

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

С другой стороны видео, записанное для демонстрации возможностей Тестера, тоже показывает достаточно большое количество ручных операций и программирования: https://www.youtube.com/watch?v=ZyqQ-YjKB3A. И в документации http://www.test1c.com/#ReplayErrors также сказано о том, что не всегда с первого раза получается записать сценарий, который воспроизводится без ошибок. И дана рекомендация записывать накликиванием короткие сценарии, а затем дополнять их кодом.


Просто у каждого инструмента своё назначение. Программисту для регрессионного тестирования наверное будет удобно "Тестер" использовать. Я вот смотрю в документацию и видео-примеры и понимаю, что удобно. Но я разработчик. А если аналитиков подключать или QA, то надо уже думать, смогут ли они адаптировать сценарии к изменениям в системе, когда это понадобится (а ведь точно понадобится, система - штука живая).

Ещё у Тестера есть неоспоримое преимущество - документация по инструменту, очень хорошая. Лучшая из всех имеющихся инструментов и программисту очевидно легко изучить будет. Я вот пытаюсь восполнить этот недостаток у Ванессы.

Было бы интересно увидеть пример адаптации готового сценария для Тестера, разбитого на процедуры, к изменениям в системе. Думаю это не должно быть сложнее, чем в случае с Ванессой.

Нет ли у Вас в планах записать такое видео или публикацию сделать? Например для типовой конфигурации, так как это наиболее актуально. Или может быть оно уже есть, а я пропустил?
grumagargler; +1 Ответить
14. grumagargler 519 29.01.19 00:53 Сейчас в теме
Спасибо за поддержание конструктива!
Нет ли у Вас в планах записать такое видео или публикацию сделать? Например для типовой конфигурации, так как это наиболее актуально. Или может быть оно уже есть, а я пропустил?

Да, такой пример я рассматривал, вот ссылка Тестер, практический пример
На счет человеко-читаемости. Сложный вопрос. К примеру, такие шаги: “Это необходимо чтобы в списке файлов появилось две строки и мы могли автоматически записать шаг”, “И я запоминаю значение поля с именем "Номер" как "НомерДокумента"” и другие, накапливают особенности и соглашения, а сам (общий, даже с учетом возможности подшагов) объем сценария растет серьёзно с ростом кол-ва тестируемых объектов. В итоге получается, что ну ведь не сложный сценарий прикрепления файла, через призму кнопконаждималки + человеко-понятности, делает этот сценарий совсем уже не простым.
В тестере, кнопконажимался была реализована для быстрого входа в систему, реальные тесты, насколько я знаю, со временем люди начинают писать руками.
1ceo_2015; Vladimir Litvinenko; +2 Ответить
15. Pr-Mex 117 30.01.19 18:05 Сейчас в теме
(14)
Вы сами решаете на каком уровне детализации остановиться.
Можно создать сценарий вообще с одним шагом "Сделать всё" и спрятать детали реализации внутрь.
22. grumagargler 519 30.01.19 18:42 Сейчас в теме
(15) можно и вручную протестировать, можно обработками и многими другими способами. Но речь об удобстве применения инструмента, а не только о его теоретических возможностях, а это включает в себя оперативный и понятный анализ падений, оперативность рефакторинга, оперативный запуск и обмен сценариями других программистов команды, запуск сценариев во время разработки при каждом F5, без необходимости очистки базы и многое-многое другое, запуск сценариев в фоне и многое другое. В свое время, я приложил достаточно усилий (со своей точки зрения) чтобы получить требуемый уровень комфорта в работе и качестве результата используя сценарное тестирвоание и ванесса-инструменты, не получилось. Затем посмотрел в код нескольких обработок "по промышленным стандартам", затем часовые видео о том, как настраивать окружение, и почти ничего а самом тестировании и пришел к выводу, что продолжать бесполезно, нужно делать самим. И я без претензий, никто ведь никому ничего не должен, но для конструктивного продолжения разговора, подскажите пожалуйста, где найти видео-или-документацию с разбором практического примера, по сути не уступающей разбору в этой ссылке Тестер, практический пример
23. Pr-Mex 117 30.01.19 18:48 Сейчас в теме
(22)
Но речь об удобстве применения инструмента, а не только о его теоретических возможностях, а это включает в себя оперативный и понятный анализ падений, оперативность рефакторинга, оперативный запуск и обмен сценариями других программистов команды, запуск сценариев во время разработки при каждом F5, без необходимости очистки базы и многое-многое другое, запуск сценариев в фоне и многое другое.


Тут непонятно - в чём у вас возникла проблема в ванессой при
- оперативный и понятный анализ падений
- оперативность рефакторинга
- оперативный запуск и обмен сценариями других программистов команды
- запуск сценариев во время разработки при каждом F5, без необходимости очистки базы

Это, на мой взгляд, всё реализуемо и в Ванессе (как бы она не называлась).

Я не встречал развёрнутого комментария по этим темам, что вы попробовали - но не получилось то-то и то-то.
24. grumagargler 519 30.01.19 19:06 Сейчас в теме
(23)
Это, на мой взгляд, всё реализуемо и в Ванессе (как бы она не называлась).

Возможно так и есть, но мне этим овладеть не удалось, во всяком случае в моем понимании процесса.
Я не встречал развёрнутого комментария по этим темам, что вы попробовали - но не получилось то-то и то-то.

я их не писал, а должен был? мне хватило информации, которой я почерпнул из открытых источников.
28. Pr-Mex 117 31.01.19 11:31 Сейчас в теме
(24)
я их не писал, а должен был? мне хватило информации, которой я почерпнул из открытых источников.


У меня сложилось впечатление, что вы попробовали - но не получилось.
В открытых источниках информация может быть противоречивой.
Вы можете смело спрашивать, например, у меня по возможностям Ванессы и как реализовать тот или иной патерн.
16. Pr-Mex 117 30.01.19 18:08 Сейчас в теме
(0)
В заключение отмечу, что тестирование движений через формы списков регистров - это только один из возможных подходов.


Не рекомендую проверять движения регистра на прямую.
Лучше проверять отчеты.
Структура регистра может сто раз ещё поменяться, но отчет будет меняться синхронно с ним и будет учитывать эти изменения регистра.
1ceo_2015; Vladimir Litvinenko; +2 Ответить
25. Vladimir Litvinenko 1695 30.01.19 20:10 Сейчас в теме
(16) Да, тоже отметил в конце публикации, что проверка через отчет гораздо надёжнее.

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

Может быть зря так перегружаю информацией, но всё таки публикации нацелены на тех, кто хочет научиться применять разные приёмы, а не просто прочитать про базовые возможности. Надеюсь что тем, кто серьёзно нацелен на применение Ванессы эта информация будет полезна. Как и информация из комментариев.
17. Pr-Mex 117 30.01.19 18:11 Сейчас в теме
(0)
# Даем 20 секунд на завершение обмена


Это странное решение. Лучше так не делать, а ждать асинхронного события.
Я сам писал сценарий для тестирования обмена в РИБ и точно могу сказать, что паузы при синхронизации не нужны.
26. Vladimir Litvinenko 1695 30.01.19 20:19 Сейчас в теме
(17) Леонид, не могли бы Вы пожалуйста написать, как следовало поступить в этом случае? Явная установка паузы - это единственное решение, которое я нашёл в случае применения встроенной библиотеки шагов.

Есть ещё шаг
Дано Ожидаем завершения фонового формирования отчета в течение "10" секунд

У этого шага есть пояснение
Шаг работает только когда TestManager и TestClient работают в одной и той же базе. Шаг ждёт указанное время, что завершились активные фоновые задания.

Согласно пояснению это подходящий для ожидания завершения обмена шаг. Но его название не соответствует тому, что от него бы потребовалось в данном случае. Поэтому показалось, что выхода два - создавать новый шаг на основе существующего (а эту тему ещё не рассматривали, она будет дальше) или применить паузу.
29. Pr-Mex 117 31.01.19 11:35 Сейчас в теме
(26)
Ок. Постараюсь показать на примере.
30. Pr-Mex 117 01.02.19 10:45 Сейчас в теме
(26)
Дано Ожидаем завершения фонового формирования отчета в течение "10" секунд


Этот шаг, как вы правильно написали, работает на стороне TestManager.
Мы его не используем, т.к. в качестве TestManager используем пустую базу, а не ERP.


У меня в сценарии используется шаг, ожидающий появления элемента:

И я нажимаю на кнопку с именем 'СписокПриложенийВыполнитьСинхронизацию'
Тогда открылось окно 'Синхронизация данных с*'
И я жду появления элемента с именем "ЗавершениеОбмена" в течение 100 секунд
Vladimir Litvinenko; +1 Ответить
31. Vladimir Litvinenko 1695 01.02.19 12:34 Сейчас в теме
18. Pr-Mex 117 30.01.19 18:13 Сейчас в теме
(0)
Мы не можем отказаться от проверки всех колонок (ячеек) табличного документа в строке, даже если захотим. Мы обязаны перечислить их все, даже пустые ячейки. Иногда это делает описание шага в сценарии очень громоздким.


1) можно проверять область макета
2) есть шаги, которые не зависят от порядка строк и в таблицах и в макетах
19. Pr-Mex 117 30.01.19 18:14 Сейчас в теме
(0)
Мы не можем использовать подстановку значений из структуры “Контекст”. Если мы передадим для проверки $ДатаДокумента$, то будет искаться именно эта строка, а не значение даты, сохраненное в структуре “Контекст”.


В Vanessa-Automation это работает. Можно в ячейке указывать $ДатаДокумента$.
Vladimir Litvinenko; +1 Ответить
27. Vladimir Litvinenko 1695 30.01.19 20:23 Сейчас в теме
(19) Классно. Хотел в следующий раз на этом примере продемонстрировать, как можно сделать собственный шаг на основе существующего. Теперь знаю, что сначала лучше посмотреть на реализацию в Vanessa-Automation ))
32. AntonSm 24 18.03.19 09:49 Сейчас в теме
(19) подскажите, пожалуйста, по использованию такого шага:
"И табличный документ формы с именем "РеквизитТабличныйДокумент" содержит строки:
| Значение1 | Значение2 |
| Значение3 | Значение4 |"

Как правильно написать проверку строки, чтобы задействовать ранее сохраненные переменные?
Хочется сохранить дату и номер документа, а потом проверить, что строка с документом есть в отчете по структуре подчиненности.

Пробовал несколько вариантов, но не смог найти как сделать.

Первый вариант:
И табличный документ "ТаблицаОтчета" содержит значения:
| 'Перемещение товаров $НомерДокумента$ от $ДатаДокумента$' |

Второй вариант:
И табличный документ формы с именем "ТаблицаОтчета" содержит строки:
| '' | 'Перемещение товаров $НомерДокумента$ от $ДатаДокумента$' | '' |
20. Pr-Mex 117 30.01.19 18:14 Сейчас в теме
21. Pr-Mex 117 30.01.19 18:15 Сейчас в теме
(0)
Ещё в макетах можно указывать симол *, тогда ячейка не будет участвовать в сравнении.
Оставьте свое сообщение