Перейти к основному содержимому

Взаимодействие с внешними системами, используя Vanessa Automation

Подготовка

примечание

Для того чтобы ванесса могла использовать шаги, поставляемые расширением, необходимо использовать версию ванессы не меньше 1.2.036 (в Vanessa Automation 1.2.036 добавлена возможность загрузки "известных шагов" из конфигурации или расширения).

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

  2. Подключить расширение к внешней базе и опубликовать http-сервис, с данными которой будут проводиться манипуляции.

  3. Выполнить настройку ванессы одним из перечисленных способов:

    • Создать файл настроек ванессы VAParams.json или добавить настройку в существующий.

      {
         "МетаданныеБиблиотек": [
            "Обработка.РатШагиVA.Форма.Форма"
         ]
      }

      Эти настройки можно загрузить используя параметры командной строки (параметр VAParams или вручную).

      Загрузка настроек

    • Выполнить ручную настройку, указав в "Шаги из метаданных" Обработка.РатШагиVA.Форма.Форма.

      Загрузка настроек из расширения

Экспортируемые "известные шаги" для Vanessa Automation (с версии 1.2.036)

Полный и актуальный список шагов

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

Известные шаги

Настройка параметров подключения

Настройка параметров подключения к внешним системам:

# На основании URL
И Я устанавливаю настройки подключения к внешней системе "jsonplaceholder"
  | Сервер  | https://jsonplaceholder.typicode.com/todos |
  | Таймаут | 30                                         |

# На основании параметров подключения
И Я устанавливаю настройки подключения к внешней системе "jsonplaceholder"
  | Сервер       | jsonplaceholder.typicode.com |
  | Схема        | https                        |
  | Ресурс       | todos                        |
  | Порт         | 443                          |
  | Таймаут      | 30                           |
  | Пользователь |                              |
  | Пароль       |                              |

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

  • И Я устанавливаю заголовки запроса к внешней системе "jsonplaceholder"
  • И Я устанавливаю разрешенные коды ответов от внешней системы "jsonplaceholder"

Эффект шагов распространяется на все запросы к этому источнику данных. При выполнении шага (установка заголовков или кодов ответов) старые настройки затираются.

Базовые шаги - HTTP-запросы, формирование данных, извлечение данных из ответа, проверки

HTTP запросы

Выполнение запросов к любому http-сервису, передающему данные в формате JSON:

  • И Я выполняю запрос "GET" к ресурсу "/posts" внешней системы "jsonplaceholder"
  • И Я выполняю запрос "POST" к ресурсу "/РегламентныеЗадания/Перезапустить" внешней системы "RAT_REST" с параметрами

Формирование данных

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

  • И Я создаю структуру "ДанныеПоста"
  • И Я создаю таблицу данных ""ДанныеПоста""

Работа с ответом

Ответ на запрос сохраняется в текущем контексте выполнения (хранится только последний ответ), что позволяет в дальнейшем с ним работать:

  • И Я сохраняю в переменную "post_id" реквизит результата запроса "[-1].id"
  • И реквизит результата запроса "[0].id" равен "11"
  • И Я сохраняю в переменную "count" количество элементов результата запроса
  • И Количество элементов результата запроса равно "2"

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

Чтобы самому указать нужный путь, следует различать объекты и массивы. Объекты, имеют именованные реквизиты (свойства) и в JSON заключены в фигурные скобки. Массивы, это упорядоченные множества значений, в JSON заключены в квадратные скобки.

При указании пути применяются:

  1. Имя реквизита объекта - для обращения к реквизиту объекта указываем после точки (если не реквизит коневого объекта) имя реквизита, например user, user.id

  2. Индекс элемента массива - для обращения к элементу массива - указываем индекс элемента в квадратных скобках (нумерация индекса начинается с 0), например users[0].id, users[2].id

    Для обращения к последним элементам используйте - (минус), например: users[-1].id - id последнего пользователя, users[-2].id - id предпоследнего пользователя

Если нужно, например, сохранить весь ответ в переменную, то путь не указываем, просто пустая строка.

Предположим, что имеем такой ответ от произвольного сервиса

{
"page_info": {
   "total_results": 4930,
   "results_per_page": 10,
   "current_page": 1
},
"kind": "ShippingCollection",
"items": [
   {
      "kind": "Shipping",
      "id": "1",
      "assigned_resources": [
         {
            "driver_contact_info": "+79000000000",
            "route_segment_id": 1,
            "drivers_ids": [
               "1", "2"
            ],
            "car_id": "3",
            "trailer_id": "d"
         }
      ]
   }
]}

Тогда мы можем сформировать такие пути

  • items[0].id - получаем ID первого элемента массива items
  • page_info.total_results - общее количество ресурсов
  • items[0].assigned_resources[0].drivers_ids[1] - идентификатор второго водителя

Шаги-обертки запросов в базе 1С

Ниже представлены шаги для работы с сервисом, опубликованным из баз 1С. Эти шаги являются обертками над http-запросами и для них также работают все остальные шаги (настройки, работа с ответом и тд)

  • И Я ищу записи "Справочник.Пользователи" внешней системы "RAT_REST" по условиям
  • И Я получаю запись "Справочник.Пользователи.ИмяПользователя" внешней системы "RAT_REST"
  • И Я создаю запись "Справочник.Пользователи" внешней системы "RAT_REST"
  • И Я изменяю запись "Справочник.Пользователи.ИмяПользователя" внешней системы "RAT_REST"
  • И Я удаляю запись "Справочник.Пользователи.ИмяПользователя" внешней системы "RAT_REST"
  • И Я получаю движения документа "ПКО.0000000001" внешней системы "RAT_REST"
  • И Я получаю движения документа "ПКО.0000000001" по регистру "ВзаиморасчетыМФУЗакрытые" внешней системы "RAT_REST"
  • И Я изменяю движения документа "ПКО.0000000001" по регистру "ВзаиморасчетыМФУЗакрытые" внешней системы "RAT_REST"
  • И Я запускаю регламентное задание "Представление регламентного задания" внешней системы "RAT_REST"
  • И Я ожидаю завершения регламентного задания "Представление регламентного задания" внешней системы "RAT_REST"
  • И Я перезапускаю регламентное задание "Представление регламентного задания" внешней системы "RAT_REST"
  • И если не существует запись "Справочник.Страны.$УникальноеИмяСтраны$" внешней системы "RAT_REST"
  • И если не существует записей "Справочник.Страны" внешней системы "RAT_REST" по условиям
  • И Я провожу документ "ПКО.0000000001" внешней системы "RAT_REST"
  • И Я отменяю проведение документа "ПКО.0000000001" внешней системы "RAT_REST"

Особенности написания интеграционных тестов

Общие

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

  2. Отправка данных во внешний сервис

    1. Если вам необходимо передать простой объект (без вложений и коллекций), то просто указываем таблицу ключ-значение (таблица не содержит заголовков, первая колонка - ключ, вторая - значение)

      И Я выполняю запрос "POST" к ресурсу "/auth/token" внешней системы "SIMPLE_REST" с параметрами
         |grant_type |password    |
         |username   |user        |
         |password   |password    |

      В результате, будет отправлен следующий запрос

      POST /auth/token
      Content-Type: application/json
      {
         "grant_type": "password",
         "username": "user",
         "password": "password"
      }
    2. Если вам необходимо передать список простых объектов (без вложений), то просто указываем таблицу с заголовком, в которому указываем колонки

      И Я выполняю запрос "POST" к ресурсу "/auth/token" внешней системы "SIMPLE_REST" с параметрами
         |grant_type |username    | password |
         |password   |user        | qwerty   |
         |password   |user2       | 123      |

      В результате, будет отправлен следующий запрос

      POST /auth/token
      Content-Type: application/json
      [
         {
            "grant_type": "password",
            "username": "user",
            "password": "qwerty"
         },
         {
            "grant_type": "password",
            "username": "user2",
            "password": "123"
         }
      ]
    3. Если необходимо отправить объект, содержащий вложенный объект или вложенную коллекцию (табличную часть). То сначала создаем вложенный объект и сохраняем его в переменную, а потом используя переменную указываем значение поля

      И Я задаю таблицу данных "Комментарии"
      | text |
      | Первый |
      | Второй |
      И Я создаю структуру "ДанныеПоста"
      | title    | Тестовый пост     |
      | body     | Это тестовый пост |
      | userId   | 1                 |
      | comments | $Комментарии$     |
      # Передача в запрос переменной
      И Я выполняю запрос "POST" к ресурсу "/posts" внешней системы "jsonplaceholder" с параметрами "$ДанныеПоста$"
      
      # Или передача в запрос таблицы параметров
      И Я выполняю запрос "POST" к ресурсу "/posts" внешней системы "jsonplaceholder" с параметрами
      | title    | Тестовый пост     |
      | body     | Это тестовый пост |
      | userId   | 1                 |
      | comments | $Комментарии$     |

      Для обоих вариантов в результате, будет отправлено следующее тело

      POST /posts
      Content-Type: application/json
      {
         "title": "Тестовый пост",
         "body": "Это тестовый пост",
         "userId": 1,
         "comments": [
            { "text": "Первый"},
            { "text": "Второй"}
         ]
      }
  3. Для проверки случаев, когда сервис отвечает с кодом ответа, отличным от 200 (201, 202) нужно воспользоваться шагом

    И Я устанавливаю разрешенные коды ответов от внешней системы "jsonplaceholder"
    | 404 |
    | 400 |
  4. Если установить настройку ванессы "Включить отладочные сообщения", то будут выводиться данные отправляемых запросов и ответов

Отладка

Особенности работы с произвольными сервисами

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

       И Я устанавливаю заголовки запроса к внешней системе "SIMPLE_REST"
          | Content-type  | application/json; charset=UTF-8 |
          | Authorization | Bearer $access_token$           |
  2. Параметры в запросах

    • Если используется GET запрос, то параметры подставляются в URL:

      И Я выполняю запрос "GET" к ресурсу "/posts" внешней системы "jsonplaceholder" с параметрами
         | userId | 2 |
      GET /posts?userID=2
    • Если используется другой HTTP-метод (POST, PUT), то параметры сериализуются в JSON и указываются в теле:

      И Я выполняю запрос "POST" к ресурсу "/posts" внешней системы "jsonplaceholder" с параметрами
         | title  | Тестовый пост     |
         | body   | Это тестовый пост |
         | userId | 1                 |
      POST /posts
      Content-Type: application/json
      {
         "title": "Тестовый пост",
         "body": "Это тестовый пост",
         "userId": 1
      }

Особенности взаимодействия с внешними базами 1С

  1. Для создания данных в другой системе 1С необходимо указывать полное имя таблицы информационной базы, например: Справочник.Пользователи, Документ.ПКО

    И я получаю записи "Справочник.Пользователи" внешней системы "RAT_REST"
    И я создаю запись "Документ.ПКО" внешней системы "RAT_REST"
    И я удаляю запись "Справочник.Пользователи.ИмяПользователя" внешней системы "RAT_REST"
  2. Формат данных

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

  3. Составные реквизиты

    В 1С есть такое понятие, как реквизит составного типа, это означает, что в реквизите могут храниться значения разных типов. Например, регистратор любого регистра содержит ссылки на разные виды документов, справочник "Константы" может хранить в одном реквизите числа, даты, ссылки и прочее. Для того чтобы передать сервису значение такого реквизита, необходимо явно указать тип значения, потому что сервис не может определить, как обработать переданные данные.

    Есть два варианта указать тип:

    1. Указать вместе со значением - 'CatalogRef.Банки.a772d037-9519-4c2b-8c9b-ad9de187fe90' или Документ.ПКО.0000000001. Этот формат работает только для ссылок!

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

      И Я создаю структуру "Параметры0_Параметр"
         | 'type' | 'boolean' |
         | 'id'   | 'Да' |
      И Я создаю структуру "Параметры2_Параметр"
         | 'type' | 'string' |
         | 'id'   | '123123' |
      И Я создаю структуру "Параметры3_Параметр"
         | 'type' | 'decimal' |
         | 'id'   | 1111 |
      И Я создаю структуру "Объект"
         | 'type' | 'dateTime' |
         | 'id'   | '2021-07-08T00:00:00' |
      И Я создаю таблицу данных "Параметры"
         | 'Параметр' |
         | $Параметры0_Параметр$ |
         | 'CatalogRef.Банки.a772d037-9519-4c2b-8c9b-ad9de187fe90' |
         | $Параметры2_Параметр$ |
         | $Параметры3_Параметр$ |
         | 'CatalogRef.НоменклатураЧекаККМ.a772d037-9519-4c2b-8c9b-ad9de187fe90' |

      Типы нужно писать правильно, с соблюдением регистра.

      Тип значенияТип, который нужно указывать в сценарии
      Строкаstring
      Булевоboolean
      Числоdecimal
      ДатаdateTime

Генератор сценариев

В помощь тестировщикам создана обработка "Генератор сценариев Gherkin", позволяет по выбранному объекту получить сценарий создания объекта через сервис.

Генератор поставляется вместе с расширением (встроена в него).

Примеры тестов