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

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

Разработка - Практика программирования

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

Третья часть цикла публикаций, посвященных 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 “из коробки”, но и значительно расширять её возможности:

  • Создание собственных шагов
  • Создание новых библиотек шагов
  • Экспортные сценарии

 

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

 

 

Скачать файлы

Наименование Файл Версия Размер
Присоединенные файлы для ПТУ

.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 220 28.01.19 18:45 Сейчас в теме
Капец, какой титанический труд. Мне теперь будет плохо от любых словосочетаний автоматическое тестирование.
3. Vladimir Litvinenko 2333 28.01.19 19:10 Сейчас в теме
(2) Большая часть шагов ведь автоматически записывается. Дальше дело за малым - либо объединить исходный тест-кейс/сценарий c автоматически записанными шагами, либо наоборот, разбить автоматически записанные шаги на логические группы. Некоторые даже и этого не делают, хотя сценарии тогда сложно читать и адаптировать.

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

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


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

Главная проблема - не написать сценарий, а адаптировать его к изменениям в конфигурации. Чем чаще и масшатбнее меняется функционал, тем больше времени требуется на адаптацию. Об этом собственно уже писал во вводной публикации: https://infostart.ru/public/969637, а вот здесь http://forum.infostart.ru/forum9/topic207123/message2134231/#message2134231 о том же самом писал Денис Олейник. Но это проблема любого тестирования, даже ручного. Оно хорошо работает когда требования к системе изначально поступают обдуманные и не хаотичные. Точно также, как и любая автоматизация.
4. tsukanov 28.01.19 20:16 Сейчас в теме
(3)
Большая часть шагов ведь автоматически записывается


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

Думаю вы это конечно где-то уже говорили. Оставляю тут эту информацию, чтобы картина была полнее.
7. Vladimir Litvinenko 2333 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 28.01.19 22:15 Сейчас в теме
(7) Не понял что я вообще мог принять за критику ) Ну да ладно (вы вроде всегда максимально тактичны).

К чему вы привели видео не понял, ведь на них вроде программисты )
Для программиста и голое API платформы вполне норм. А если хочется быстро и удобно, то берешь Тестер и погнал.

Мой коммент был не про программистов, а про вероятных пользователей записывалки шагов (тестировщиков и аналитиков).
9. Vladimir Litvinenko 2333 28.01.19 22:29 Сейчас в теме
(8) Комментарий выше и ссылки на видео были к тому, что похоже именно фреймворки для 1С сейчас дают возможность максимально автоматизировать функциональное и сценарное тестирование. По сравнению с инструментами для других платформ. Особенно это касается подходов с использованием Gherkin, которые в случае 1С позволяют заниматься сценарным тестированием и созданием исполняемой документации с минимальным знанием программирования.

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

"Тестер" тоже для 1С, и "Тестирование 3.0". У нас сейчас очень классные инструменты есть. Кажется, что специалистам на других платформах намного сложнее приходится с решением тех же вопросов. Они глубже в техническую сторону вопроса должны погружаться.
10. tsukanov 28.01.19 22:39 Сейчас в теме
(9) Я походу переутомился. Не понимаю что мне пишут )

Я понял, что не понял вас до этого, но теперь не могу понять этот коммент.
Пойду посплю, пожалуй ) Переработал )
Vladimir Litvinenko; +1 Ответить
11. Vladimir Litvinenko 2333 28.01.19 22:51 Сейчас в теме
(10) Хорошая мысль. Поступлю аналогично ))
5. tsukanov 28.01.19 21:27 Сейчас в теме
Владимир, сделайте, пожалуйста, оглавление. Вы выдаете огромные объемы, но не учитываете, что читать это целиком мало кто решится. Очень тяжело без навигации. И код наверно лучше в спойлеры спрятать.
6. Vladimir Litvinenko 2333 28.01.19 21:52 Сейчас в теме
(5) Предыдущие публикации были с подробным оглавлением. Но здесь сквозные примеры, их сложно разбить на составляющие. В рамках одного примера все действия плавно перетекают одно в другое.

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

Больше таких длинных примеров приводить не планирую, их здесь уже четыре штуки накопилось, учитывая первую часть. Следующая публикация будет для разработчиков. По теме реализации своих шагов, библиотек и экспортных сценариев. Там точно получится сделать нормальную структуру и оглавление.
12. grumagargler 662 28.01.19 23:38 Сейчас в теме
Прошу не делать вывод на основе приводимых примеров о чрезмерной сложности Vanessa-ADD для практического применения


Владимир, отлично, пошли примеры. Но почему не делать выводы, ведь это важно с точки зрения применимости технологии. Так или иначе (даже если его упростить), думаю невооруженным взглядом видно, например, почему простой по сути и очень сложный по форме, является первый сценарий. Безотносительно к вашему труду, а лишь правды ради - назвать сложным сценарий “прикрепления файла к документу” ну ведь никак нельзя. Уверен, вы ожидали подобный комментарий-придирку о недостаточной сложности, но ведь именно в этом и вся суть, а в не в многообещающей методологии.
Для контраста, вот как ваш первый тест выглядит в Тестере:
// Проверка присоединения файла к документу ПоступлениеТоваровУслуг
исходнаяКартинка = "c:\pic1.png";
сохраненнаяКартинка = "c:\pic1_сохраненный.png";

Подключить ();
ЗакрытьВсе ();

// Создаем и записываем документ
Коммандос("e1cib/command/Документ.ПоступлениеТоваровУслуг.Создать");
Здесь();
Нажать("!ФормаЗаписать");

// Открываем список файлов и загружаем картинку
Нажать("Файлы", ПолучитьСсылки());
Здесь();
Приложение.УстановитьРезультатДиалогаВыбораФайла(истина, исходнаяКартинка);
Нажать("!Добавить");

// Выгружаем картинку из бызы предварительно удалив её на диске и проверяем успешность выгрузки
УдалитьФайлы(сохраненнаяКартинка);
Приложение.УстановитьРезультатДиалогаВыбораФайла(Истина, сохраненнаяКартинка);
Нажать("!ФормаСохранитьКак");
файл = Новый Файл(сохраненнаяКартинка);
если не файл.Существует() тогда
	Стоп("Файл " + сохраненнаяКартинка + " не найден");
конецесли;
Показать
JohnyDeath; +1 Ответить
13. Vladimir Litvinenko 2333 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 662 29.01.19 00:53 Сейчас в теме
Спасибо за поддержание конструктива!
Нет ли у Вас в планах записать такое видео или публикацию сделать? Например для типовой конфигурации, так как это наиболее актуально. Или может быть оно уже есть, а я пропустил?

Да, такой пример я рассматривал, вот ссылка Тестер, практический пример
На счет человеко-читаемости. Сложный вопрос. К примеру, такие шаги: “Это необходимо чтобы в списке файлов появилось две строки и мы могли автоматически записать шаг”, “И я запоминаю значение поля с именем "Номер" как "НомерДокумента"” и другие, накапливают особенности и соглашения, а сам (общий, даже с учетом возможности подшагов) объем сценария растет серьёзно с ростом кол-ва тестируемых объектов. В итоге получается, что ну ведь не сложный сценарий прикрепления файла, через призму кнопконаждималки + человеко-понятности, делает этот сценарий совсем уже не простым.
В тестере, кнопконажимался была реализована для быстрого входа в систему, реальные тесты, насколько я знаю, со временем люди начинают писать руками.
1ceo_2015; Vladimir Litvinenko; +2 Ответить
15. Pr-Mex 125 30.01.19 18:05 Сейчас в теме
(14)
Вы сами решаете на каком уровне детализации остановиться.
Можно создать сценарий вообще с одним шагом "Сделать всё" и спрятать детали реализации внутрь.
22. grumagargler 662 30.01.19 18:42 Сейчас в теме
(15) можно и вручную протестировать, можно обработками и многими другими способами. Но речь об удобстве применения инструмента, а не только о его теоретических возможностях, а это включает в себя оперативный и понятный анализ падений, оперативность рефакторинга, оперативный запуск и обмен сценариями других программистов команды, запуск сценариев во время разработки при каждом F5, без необходимости очистки базы и многое-многое другое, запуск сценариев в фоне и многое другое. В свое время, я приложил достаточно усилий (со своей точки зрения) чтобы получить требуемый уровень комфорта в работе и качестве результата используя сценарное тестирвоание и ванесса-инструменты, не получилось. Затем посмотрел в код нескольких обработок "по промышленным стандартам", затем часовые видео о том, как настраивать окружение, и почти ничего а самом тестировании и пришел к выводу, что продолжать бесполезно, нужно делать самим. И я без претензий, никто ведь никому ничего не должен, но для конструктивного продолжения разговора, подскажите пожалуйста, где найти видео-или-документацию с разбором практического примера, по сути не уступающей разбору в этой ссылке Тестер, практический пример
23. Pr-Mex 125 30.01.19 18:48 Сейчас в теме
(22)
Но речь об удобстве применения инструмента, а не только о его теоретических возможностях, а это включает в себя оперативный и понятный анализ падений, оперативность рефакторинга, оперативный запуск и обмен сценариями других программистов команды, запуск сценариев во время разработки при каждом F5, без необходимости очистки базы и многое-многое другое, запуск сценариев в фоне и многое другое.


Тут непонятно - в чём у вас возникла проблема в ванессой при
- оперативный и понятный анализ падений
- оперативность рефакторинга
- оперативный запуск и обмен сценариями других программистов команды
- запуск сценариев во время разработки при каждом F5, без необходимости очистки базы

Это, на мой взгляд, всё реализуемо и в Ванессе (как бы она не называлась).

Я не встречал развёрнутого комментария по этим темам, что вы попробовали - но не получилось то-то и то-то.
24. grumagargler 662 30.01.19 19:06 Сейчас в теме
(23)
Это, на мой взгляд, всё реализуемо и в Ванессе (как бы она не называлась).

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

я их не писал, а должен был? мне хватило информации, которой я почерпнул из открытых источников.
28. Pr-Mex 125 31.01.19 11:31 Сейчас в теме
(24)
я их не писал, а должен был? мне хватило информации, которой я почерпнул из открытых источников.


У меня сложилось впечатление, что вы попробовали - но не получилось.
В открытых источниках информация может быть противоречивой.
Вы можете смело спрашивать, например, у меня по возможностям Ванессы и как реализовать тот или иной патерн.
16. Pr-Mex 125 30.01.19 18:08 Сейчас в теме
(0)
В заключение отмечу, что тестирование движений через формы списков регистров - это только один из возможных подходов.


Не рекомендую проверять движения регистра на прямую.
Лучше проверять отчеты.
Структура регистра может сто раз ещё поменяться, но отчет будет меняться синхронно с ним и будет учитывать эти изменения регистра.
1ceo_2015; Vladimir Litvinenko; +2 Ответить
25. Vladimir Litvinenko 2333 30.01.19 20:10 Сейчас в теме
(16) Да, тоже отметил в конце публикации, что проверка через отчет гораздо надёжнее.

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

Может быть зря так перегружаю информацией, но всё таки публикации нацелены на тех, кто хочет научиться применять разные приёмы, а не просто прочитать про базовые возможности. Надеюсь что тем, кто серьёзно нацелен на применение Ванессы эта информация будет полезна. Как и информация из комментариев.
17. Pr-Mex 125 30.01.19 18:11 Сейчас в теме
(0)
# Даем 20 секунд на завершение обмена


Это странное решение. Лучше так не делать, а ждать асинхронного события.
Я сам писал сценарий для тестирования обмена в РИБ и точно могу сказать, что паузы при синхронизации не нужны.
26. Vladimir Litvinenko 2333 30.01.19 20:19 Сейчас в теме
(17) Леонид, не могли бы Вы пожалуйста написать, как следовало поступить в этом случае? Явная установка паузы - это единственное решение, которое я нашёл в случае применения встроенной библиотеки шагов.

Есть ещё шаг
Дано Ожидаем завершения фонового формирования отчета в течение "10" секунд

У этого шага есть пояснение
Шаг работает только когда TestManager и TestClient работают в одной и той же базе. Шаг ждёт указанное время, что завершились активные фоновые задания.

Согласно пояснению это подходящий для ожидания завершения обмена шаг. Но его название не соответствует тому, что от него бы потребовалось в данном случае. Поэтому показалось, что выхода два - создавать новый шаг на основе существующего (а эту тему ещё не рассматривали, она будет дальше) или применить паузу.
29. Pr-Mex 125 31.01.19 11:35 Сейчас в теме
(26)
Ок. Постараюсь показать на примере.
30. Pr-Mex 125 01.02.19 10:45 Сейчас в теме
(26)
Дано Ожидаем завершения фонового формирования отчета в течение "10" секунд


Этот шаг, как вы правильно написали, работает на стороне TestManager.
Мы его не используем, т.к. в качестве TestManager используем пустую базу, а не ERP.


У меня в сценарии используется шаг, ожидающий появления элемента:

И я нажимаю на кнопку с именем 'СписокПриложенийВыполнитьСинхронизацию'
Тогда открылось окно 'Синхронизация данных с*'
И я жду появления элемента с именем "ЗавершениеОбмена" в течение 100 секунд
Andrei_Zoteev; Vladimir Litvinenko; +2 Ответить
31. Vladimir Litvinenko 2333 01.02.19 12:34 Сейчас в теме
18. Pr-Mex 125 30.01.19 18:13 Сейчас в теме
(0)
Мы не можем отказаться от проверки всех колонок (ячеек) табличного документа в строке, даже если захотим. Мы обязаны перечислить их все, даже пустые ячейки. Иногда это делает описание шага в сценарии очень громоздким.


1) можно проверять область макета
2) есть шаги, которые не зависят от порядка строк и в таблицах и в макетах
19. Pr-Mex 125 30.01.19 18:14 Сейчас в теме
(0)
Мы не можем использовать подстановку значений из структуры “Контекст”. Если мы передадим для проверки $ДатаДокумента$, то будет искаться именно эта строка, а не значение даты, сохраненное в структуре “Контекст”.


В Vanessa-Automation это работает. Можно в ячейке указывать $ДатаДокумента$.
Andrei_Zoteev; Vladimir Litvinenko; +2 Ответить
27. Vladimir Litvinenko 2333 30.01.19 20:23 Сейчас в теме
(19) Классно. Хотел в следующий раз на этом примере продемонстрировать, как можно сделать собственный шаг на основе существующего. Теперь знаю, что сначала лучше посмотреть на реализацию в Vanessa-Automation ))
32. AntonSm 27 18.03.19 09:49 Сейчас в теме
(19) подскажите, пожалуйста, по использованию такого шага:
"И табличный документ формы с именем "РеквизитТабличныйДокумент" содержит строки:
| Значение1 | Значение2 |
| Значение3 | Значение4 |"

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

Пробовал несколько вариантов, но не смог найти как сделать.

Первый вариант:
И табличный документ "ТаблицаОтчета" содержит значения:
| 'Перемещение товаров $НомерДокумента$ от $ДатаДокумента$' |

Второй вариант:
И табличный документ формы с именем "ТаблицаОтчета" содержит строки:
| '' | 'Перемещение товаров $НомерДокумента$ от $ДатаДокумента$' | '' |
20. Pr-Mex 125 30.01.19 18:14 Сейчас в теме
21. Pr-Mex 125 30.01.19 18:15 Сейчас в теме
(0)
Ещё в макетах можно указывать симол *, тогда ячейка не будет участвовать в сравнении.
33. alx1c 04.08.19 20:28 Сейчас в теме
1. Как сменить каталог для фич, который Ванесса сама определяет по умолчанию?
2. Как удалять фичи из дерева с родителем "vanessa-add-temp.feature"?
3. Как сделать, чтобы фичи записывались в разные файлы, а не только в "vanessa-add-temp.feature"?

+ вечно сыпятся ошибки, использую версию 6.0.0:
1. При записи тест клиента с кнопки "начать запись действий пользователя" всегда выдается сообщение "04.08.2019 21:40:39 Порт 48 000 занят или находится вне указанного диапазона, порт подключения изменен на 48 001". В итоге запись действий не выполняется.
Сделал по другому:
Сначала нажимаю кнопка "Запустить тест-клиент", затем нажимаю "начать запись действий пользователя" - вроде работает, но при попытке воспроизвести тест с прикреплением файла падают ошибки:
1. в тест клиенте "ошибка записи XML"
2. В основном сеансе:
ЗавершитьЗаписьДействийПользователя:{ВнешняяОбработка.bddRunner.Форма.УправляемаяФорма.Форма(3076)}: Ошибка при вызове метода контекста (ЗавершитьЗаписьЖурналаДействийПользователя): Ошибка сетевого взаимодействия при вызове.
34. alx1c 04.08.19 21:13 Сейчас в теме
И еще один вопрос:
Редактирую фичу через VS, затем перезагружаю ее, но сама фича не меняется, т.е. как ее первый раз Ванесса запомнила, так вся фича и выглядит.
Открываю фича файл - там удаленные мной шаги удалены, я не сошел с ума..
35. artkor 127 15.01.20 16:20 Сейчас в теме
Спасибо большое за отличные статьи по Ванессе! Подскажите, можно ли обойти как-то шаг "Дано Я подключаю клиент тестирования с параметрами..." на случай если сторонняя база на другой платформе работает? Ругается на несовместимость платформ на клиенте тестирования.
36. Vladimir Litvinenko 2333 16.01.20 13:33 Сейчас в теме
(35) Видимо это ограничение платформы. Она ведь у нас очень чувствительная к разнице версий различных компонент: клиента и сервера, сервера и консоли администрирования, сервера хранилища и конфигуратора. Обязательно всё должно быть на одной платформе.

Я сейчас для реализации механизмов тестирования переехал на Linux на виртуальных машинах, где платформа 1С вообще одна ставится. Вопрос тестирования на разных платформах решается простым поднятием еще одной виртуалки из образа, включающего другую версию платформы. Машины на Linux + PostgreSQL очень компактны и такое решение оказывается удобным. VA в этом случае работает медленнее (из за особенностей платформы) но зато возможностей намного больше.

Если задача заключается в тестировании на разных версиях платформы, то может быть стоит попробовать такой способ?
37. artkor 127 17.01.20 09:32 Сейчас в теме
(36) К своему стыду никогда не "баловался" виртуалками. Скажите, Вы virtualBox или vmVare используете? И где эти готовые образы "Linux + PostgreSQL" можно взять (если они не закрыты конечно) ? Просто чтобы понимать куда "копать".
38. Vladimir Litvinenko 2333 17.01.20 16:02 Сейчас в теме
(37) Образы самостоятельно готовить надо. В них ведь ещё платформа 1С должна быть и сборка PostgreSQL желательно должна быть именно для 1С - либо с сайта ИТС , либо от команды Postgres Pro (хотя фактически они все от Postgres Pro).

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

Я использую для этого Packer, Vagrant и VirtualBox. Для VirtualBox это сочетание бесплатно, для VMWare платно. Packer и Vagrant позволяют автоматизировать весь процесс и быстро разворачивать сразу набор виртуальных машин.

Вы можете подписать на публикации от моего аккаунта, через какое-то время будут материалы на эту тему. Правда не могу сейчас сказать когда именно. Наверное отпуск нужен, руки не доходят довести публикацию до ума )) Но обязательно доведу как только появится свободное время ))
39. artkor 127 17.01.20 19:56 Сейчас в теме
(38) спасибо за развернутый ответ. Кое-что понятно но пока не все). Если будет статья на данную тему обязательно прочтем )
40. Spakus 01.04.20 09:53 Сейчас в теме
Добрый день.
Владимир, у нас в компании конфигурация написана на обычных формах, поэтому нет возможности использовать функциональность кнопконажималки. Приходится все писать вручную.

Подскажите, пожалуйста, можно ли в ванессе осуществить ветвление?

Например, у меня есть некая переменная, значение которого я получил на одном из шагов тестирования и сохранил в контекст. В зависимости от значения этой переменной у меня должен отличаться алгоритм следующего шага.
Если "Переменная > 5", то "Я выполняю действие 1"
Если "Переменная < 5", то "Я выполняю действие 2"
42. Andrei_Zoteev 27.05.20 18:53 Сейчас в теме
(40)
На сколько я понимаю, это обычный механизм условий.
Посмотрите видео: https://www.youtube.com/watch?v=1UBlV4kWx_o&t=825s Леонид Паутов записывал, там об этом говориться немного. Да и вообще очень полезный материал!
41. Olenevod 24 01.04.20 12:29 Сейчас в теме
Интересно, а нет ли где примеров различных фич файлов?
Пробую сотворить сценарии, но возникают различные трудности. Так-то если смотреть какие-то примеры, то вытащить можно некоторые полезные вещи, а самое главное понять и запомнить как можно писать.
43. Andrei_Zoteev 27.05.20 19:02 Сейчас в теме
(41) Если не критично именно Vanessa ADD, то на данном канале https://www.youtube.com/channel/UC114RqHhG__1gET8pzs3AHA есть видео с описанием возможностей Vanessa automation! В описании как правило есть ссылки в GitHub на фичи для видео. Из них можно что то подчерпнуть, я например подглядываю в них когда пишу фичи для видеоинструкций.
44. Andrei_Zoteev 27.05.20 19:05 Сейчас в теме
(0)Владимир, спасибо!

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

См. также

Безопасная работа с транзакциями во встроенном языке Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

Разбираемся с опасностями использования транзакций во встроенном языке 1С. Познаем ошибку "В данной транзакции уже происходили ошибки". Учимся защищаться от них.

1 стартмани

25.03.2019    30431    10    tormozit    44    

Краткое руководство по внесению изменений в конфигурацию

Практика программирования v8 1cv8.cf Абонемент ($m)

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

1 стартмани

13.01.2020    14430    17    sapervodichka    41    

Vanessa Automation + СППР

Vanessa Automation СППР v8 Бесплатно (free)

Vanessa Automation. Использование автоматизированного тестирования в СППР.

07.11.2019    11071    0    SvVik    14    

Полезные процедуры и функции для программиста

Практика программирования Универсальные функции v8 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

07.10.2019    26698    14    HostHost    40    

Вам нравятся запросы в 1С? Промо

Практика программирования Разработка v8 v8::Запросы 1cv8.cf Абонемент ($m)

Речь не только о том, что простейший запрос с "легальным" оформлением растянется на пол-экрана, речь еще обо всем, что нужно написать "в нагрузку" к тексту запроса. Все эти "Новый Запрос", "УстановитьПараметр" и последующие пляски с обработкой результата... Пора с этим заканчивать!

1 стартмани

03.07.2019    17338    4    m-rv    86    

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

Практика программирования Внешние источники данных v8 v8::УФ 1cv8.cf Абонемент ($m)

Фирма 1С не рекомендует использовать внутреннее представление данных для любых целей, которые отличны от обмена с 1С:Предприятием 7.7. Но сама возможность заглянуть на "внутреннюю кухню" платформы с помощью функций ЗначениеВСтрокуВнутр(), ЗначениеВФайл(), ЗначениеИзСтрокиВнутр() и ЗначениеИзФайла(), дала возможность сообществу программистов 1С разработать новые приемы разработки и анализа. Так, именно на использовании внутреннего представления был построен алгоритм "быстрого массива", который позволяет практически мгновенно создать массив в памяти на основании строки с разделителями. С помощью разбора внутреннего представления можно "на лету" программным кодом выполнить анализ обычной формы и даже сделать редактор графической схемы. Во внутреннем формате сохраняют свои данные между сеансами различные популярные внешние обработки. А еще это возможность сделать быстрый обмен с внешними системами.

1 стартмани

06.09.2019    17072    11    Dementor    30    

Конвейер проверки качества кода

Инструментарий разработчика Практика программирования Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Jenkinsfile для выполнения проверки качества кода. Собирает информацию с АПК, EDT и BSL-LS. Сопоставляет ошибки с гит-репозиторием, выгруженным ГитКонвертором. Отправляет в Сонар.

3 стартмани

04.09.2019    20907    21    Stepa86    44    

Процедура ПриКомпоновкеРезультата

Практика программирования v8 1cv8.cf Абонемент ($m)

Коллекция кода

1 стартмани

26.07.2019    31881    13    vasilev2015    63    

ВСТАВИТЬ В Справочник.Номенклатура (Код, Наименование) ЗНАЧЕНИЯ ("001", "Новый товар") Промо

Практика программирования v8 v8::Запросы 1cv8.cf Абонемент ($m)

Вас не обманывают ваши глаза, это запрос на изменение данных! И это работает без прямого доступа к БД, регистрации и смс.

1 стартмани

01.06.2018    27617    86    m-rv    57    

1С:Ассемблер. Немного летнего веселья!

Практика программирования Разработка v8 1cv8.cf Абонемент ($m)

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

1 стартмани

21.06.2019    26412    77    Evil Beaver    119    

Простые примеры сложных отчетов на СКД

Практика программирования v8 v8::СКД 1cv8.cf Абонемент ($m)

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

1 стартмани

12.06.2019    26871    19    Hatson    22    

Разработка и сценарное тестирование с Vanessa-ADD. Отчетность Allure. Автоматизация запуска сценариев

Практика программирования Vanessa Automation v8 Россия Бесплатно (free)

Формируем отчетность о результатах выполнения сценариев. Автоматизируем запуск.

26.02.2019    20089    0    Vladimir Litvinenko    27    

Заполняем по шаблону (по умолчанию) Промо

Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

08.02.2018    25507    19    mvxyz    17    

Баг или фича? Неожиданное поведение платформы

Практика программирования Тестирование и исправление Разработка v8 1cv8.cf Абонемент ($m)

Рассмотрим несколько случаев неожиданного поведения платформы 1С, а также что с этим можно cделать.

18.02.2019    21550    0    YPermitin    89    

HTML в новой версии 8.3.14 на примере 3-х JavaScript библиотек: AmCharts, HighCharts, DHTMLX

Универсальные обработки Практика программирования Разработка v8 1cv8.cf Абонемент ($m)

Тестируем возможности HTML в новой версии 8.3.14 платформы на примере 3-х JavaScript библиотек: AmCharts, HighCharts, DHTMLX.

1 стартмани

29.01.2019    26746    90    Synoecium    46    

Нечеткий поиск одним запросом Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

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

1 стартмани

28.12.2015    25126    66    vasvl123    9    

Разработка и сценарное тестирование с Vanessa-ADD. Установка инструментов. Запись действий пользователя и выполнение сценариев

Практика программирования Vanessa Automation Бесплатно (free)

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

21.01.2019    30562    0    Vladimir Litvinenko    96    

Отладка сложных отчетов на СКД

Практика программирования v8 v8::СКД 1cv8.cf Россия Абонемент ($m)

Расширение для отладки сложных отчетов на СКД (в т.ч. для собираемых программно "на лету") и быстрого перехода к отладке таких отчетов в консоли запросов и отчетов на СКД.

1 стартмани

28.12.2018    24654    85    maxx    58    

Работа с публикациями "Инфостарт" Промо

Практика программирования О сообществе WEB v8 УУ Абонемент ($m)

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

1 стартмани

13.09.2018    18866    12    RocKeR_13    16    

Реализация простого http-сервиса "Просмотр карточки номенклатуры(товара) в браузере"

Практика программирования v8 1cv8.cf Абонемент ($m)

Практический пример реализации простого http-сервиса средствами 1С Предприятие 8.3. Обеспечивает просмотр списка товаров и просмотр данных товара в браузере.

1 стартмани

07.12.2018    20876    16    dmitry1975    32    

HTTP Сервисы: Путь к своему сервису. Часть 3

Инструментарий разработчика Практика программирования v8 1cv8.cf Абонемент ($m)

Продолжение статьи «HTTP Сервисы: Путь к своему сервису. Часть 2». В предыдущих частях мы использовали только Get, в этой части поговорим о других методах и длительных операциях.

1 стартмани

27.08.2018    30849    48    dsdred    15    

Позиционирование в помещении с помощью нейросети по сигналу Wi-Fi. Интерактивная карта склада в 1С с показом позиции

Инструментарий разработчика Практика программирования v8 Абонемент ($m)

Данная публикация содержит в себе редактор и интерактивную карту склада или иного помещения, на которой в реальном времени отображается позиция устройства, координаты которого вычисляются по уровням сигнала нескольких роутеров Wi-Fi. В статье и приложенным к ней разработкам предлагаются инструменты и методика для реализации вычисления точной геопозиции внутри помещений с помощью нейронной сети. Конфигурация написана на релизе 1С:Предприятие 8.3.12.1412, клиентское приложение имеет минимальный уровень совместимости SDK -16.

5 стартмани

09.08.2018    25462    25    informa1555    26    

Как выполнить отчет на СКД через COM и получить данные отчета? Промо

Практика программирования v8 УПП1 Россия Абонемент ($m)

Для чего это нужно. Например, нужно в одной базе получить какой-либо показатель из другой базы. Этот показатель вычисляется в каком-либо сложном отчете, который написан на СКД. Можно, конечно, "скопипастить" текст запроса из другой базы, немного подправить его и выполнять в том же COM подключении. Но с этим теряется гибкость: если отчет изменился, то нужно помнить о том, что где-то есть его "немного модифицированная" копия. В статье будет рассмотрен пример получения данных из базы ЗУП.

2 стартмани

08.05.2018    25724    8    wowik    3    

Работа с данными выбора

Практика программирования Работа с интерфейсом v8 Россия Абонемент ($m)

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

1 стартмани

17.07.2018    39401    17    kalyaka    16    

HTTP Сервисы: Путь к своему сервису. Часть 1

Практика программирования WEB v8 1cv8.cf Абонемент ($m)

Уже много было написано про http-сервисы, но то и дело всплывают «Новые» статьи по обмену между базами V8 по COM, что «Немножко» удивляет. Решил внести свои 5 копеек, поработаем с http-сервисом.

1 стартмани

15.07.2018    74007    23    dsdred    24    

Полезные примеры составления схемы компоновки данных #2

Практика программирования v8 v8::СКД 1cv8.cf Абонемент ($m)

Еще один набор примеров как решить частные задачи в СКД

1 стартмани

22.05.2018    27405    11    SITR-utyos    13    

1С: Предприятие + корпоративный чат, как наладить оперативные уведомления за 10 минут Промо

Практика программирования v8 Абонемент ($m)

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

1 стартмани

14.08.2016    44742    36    Demanoidos    60    

БСП: Дополнительная обработка (Регламенты), примеры от простого к сложному

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Абонемент ($m)

Очень много попадается странных решений, которые можно решить через БСП:Дополнительные отчеты и обработки. Я бы вообще БСП из-за этой подсистемы переименовал в «Большое Спасибо Программистам». Поработаем с подсистемой в части написания регламентных заданий.

1 стартмани

10.05.2018    41188    33    dsdred    36    

Работа со схемой запроса

Инструментарий разработчика Практика программирования v8 v8::Запросы Абонемент ($m)

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

1 стартмани

24.04.2018    41048    86    kalyaka    34    

Бесплатная проверка контрагентов в ФНС (общий модуль с алгоритмом). На примере выводим статус в список справочника контрагентов

Практика программирования v8 1cv8.cf Абонемент ($m)

Если вам интересно проверить контрагенте в ФНС, вам поможет данная публикация. Весь алгоритм работы строится на основе данных, полученных с сервиса http://npchk.nalog.ru совершенно бесплатно.

1 стартмани

01.02.2018    33194    54    rpgshnik    48    

Как нарисовать граф на 1С Промо

Практика программирования v8 Абонемент ($m)

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

1 стартмани

09.08.2013    68782    206    ildarovich    117    

Расширение возможностей печати: Вывод произвольного нижнего и верхнего колонтитула

Печатные формы документов Практика программирования Универсальные функции v8 1cv8.cf Абонемент ($m)

Расширяем функционал вывода нижнего / верхнего колонтитула. Стандартно 1С имеет достаточно ограничений по выводу и наполнению колонтитулов содержимым, взять хотя бы такие, как вывод только текста и отсутствие ограничения на номер конечной страницы. А при разработке кода сталкиваешься с тем, что свой блок с нижним колонтитулом нужно прижимать к низу страницы. Казалось бы быстро решаемый вопрос, но и в нем есть нюансы. Сейчас я расскажу о том, как решалась эта задача. UPD 15.02.2018. Добавлен вывод верхнего колонтитула; Вывод колонтитулов на первой и последней странице управляется параметрами; Научился считать страницы: Добавлено заполнение переменных аналогичных стандартным из колонтитулов; Задаются форматы даты и времени. Ограничения прежние: 1. Повторно сформировать табличный документ после смены параметров страницы интерактивно.; 2. Передавать данные для более плотной печати как можно более мелко нарезанными кусками.

1 стартмани

29.12.2017    36630    27    agent00mouse    0    

Практика доступа в базу 1С через протокол oData. Чтение данных

Сервисные утилиты Практика программирования Администрирование данных 1С v8 1cv8.cf Абонемент ($m)

Для чего нужен доступ в базу 1С через REST-интерфейс по протокол oData? Как его организовать? Как не будучи гуру в JavaScript и .NET получить быстрый визуальный доступ к данным базы 1С? Попробую дать ответ на эти вопросы и прокомментирую некоторые нюансы, с которыми я столкнулся.

1 стартмани

11.12.2017    87611    301    Dementor    49    

Печатная форма, сделанная как расширение конфигурации для БП 3.0. Новые возможности БСП

Практика программирования Универсальные печатные формы v8 БП3.0 Абонемент ($m)

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

1 стартмани

06.12.2017    24858    49    kwazi    6    

Быстрое определение интервалов в запросе Промо

Практика программирования v8 Абонемент ($m)

В статье описывается новый метод определения интервалов между данными различных записей в запросе. В отличие от общеизвестного метода, время работы предлагаемого метода зависит от объема данных ЛИНЕЙНО. Это обеспечивает ему значительный выигрыш по быстродействию на больших объемах данных. В качестве иллюстрации возможностей метода приведен отчет, показывающий гистограмму распределения времени между продажами.

1 стартмани

01.10.2015    47854    32    ildarovich    41    

Простой бесплатный DashBoard с помощью http сервиса

Практика программирования v8 Абонемент ($m)

Как создать свой DashBoard без дополнительных затрат и сложных технических доработок.

1 стартмани

25.11.2017    51786    63    dewersia    32    

Полезный код для программистов 1С (часть 1). Управление свойствами элементов формы. Хранение копии данных реквизитов

Инструментарий разработчика Практика программирования v8 Абонемент ($m)

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

1 стартмани

24.09.2017    40198    15    vandalsvq    80    

Telegram-боты

Практика программирования v8 Абонемент ($m)

Описание теории, разбор архитектуры и пример реализации telegram-ботов. Сразу скажу, со структурированием изложения мало что могу поделать. :) редакция от 18.07.2018 Правки последней редакции выделены жирным.

1 стартмани

01.09.2017    28995    127    PLAstic    54    

Простой способ индексирования интервалов Промо

Практика программирования v8 Абонемент ($m)

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

1 стартмани

28.09.2016    38158    38    ildarovich    22    

Макеты СКД

Практика программирования v8 v8::СКД 1cv8.cf Абонемент ($m)

Рассмотрены некоторые типовые задачи, которые решаются с помощью предопределенных макетов, а также перечислены несколько случаев, для которых макеты не подходят

1 стартмани

25.07.2017    91040    122    json    27    

Расширения конфигураций 1С: учимся перехватывать методы

Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

30.05.2017    116707    13    signum2009    46    

Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов

Практика программирования Математика и алгоритмы Универсальные функции Производительность и оптимизация (HighLoad) v8 1cv8.cf Россия Абонемент ($m)

Восстановление партий, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

26.05.2017    47374    15    DarkAn    86    

Регулярные выражения – это просто. Построитель и отладчик регулярных выражений

Инструментарий разработчика Практика программирования v8 1cv8.cf Абонемент ($m)

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

1 стартмани

13.03.2017    28629    111    romasna    49