Корреляция запросов#

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

Данные извлекаются с помощью экстракторов:

  • Regex. Извлекает данные с помощью регулярных выражений. Подробнее о синтаксисе см. в статье Regular expression syntax cheat sheet;

  • jSONPath. Извлекает данные из ответов в jSON-формате, например, при тестировании REST API. Используется язык запросов jSONPath. Подробнее о синтаксисе см. в статье JSONPath expressions;

  • XPath. Извлекает данные из ответов в HTML- и XML-форматах, например, при тестировании сайтов или приложений, которые используют SOAP. Используется язык запросов XPath. Подробнее о синтаксисе см. в статье XPath Syntax;

  • Границы. Извлекает данные с помощью Boundary Extractor, используя левую и правую границы. Подробнее см. в документации JMeter.

Выделим преимущества и недостатки экстракторов:

Regex

jSONPath

XPath

Границы

Плюсы

Поиск данных с помощью сложных шаблонов

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

Анализ HTML-тегов без атрибутов

Прост в использовании. Не требуется знать синтаксис регулярных выражений, jSONPath и XPath

Производительнее, чем jSONPath и XPath

Полезен при тестировании одностраничных веб-приложений, разработанные с помощью React и AngularJS

Анализ RSS-каналов

Производительнее других экстракторов

Возможность использования парсера Tidy

Анализ JSON с одинаковыми именами атрибутов

Минусы

Менее производителен, чем Boundary Extractor

Менее производителен, чем Regex и Boundary Extractor

Менее производителен, чем другие экстракторы

Не предназначен для сложных случаев

Может быть излишним, когда поиск данных относительно прост

Строит DOM-дерево для анализа HTML-кода, потребляет ресурсы ЦП и памяти

Добавление экстракторов#

Чтобы настроить извлечение из ответа:

  1. Откройте тест.

  2. Перейдите в группу или нажмите на кнопку edit_button.

  3. Нажмите на кнопку edit_button для нужного запроса и перейдите на вкладку Извлечение из ответа:

    _images/um_extract_from_response.ru.png
  4. В выпадающем списке выберите одно из значений:

    • Regex. Регулярное выражение.
      1. Заполните поля:

        • Наименование переменной. Переменная, в которую сохранятся результаты парсинга;

        • Регулярное выражение. Подробнее см. статью Regular expression syntax cheatsheet и раздел Пример использования регулярных выражений.

        • Номер группы. Группа, которую необходимо извлечь из регулярного выражения. Например, если указать значение 1, извлекается первая группа. Если указать значение 0, извлекается все регулярное выражение. Значение по умолчанию 0.

      2. Выберите поле, из которого необходимо извлечь данные:

        • Body. Тело ответа кроме заголовков;

        • Request headers. Заголовки ответа;

        • Response code. Код ответа, например, 200;

        • Response message. Ответное сообщение;

        • Url. URL запроса.

      3. В выпадающем списке выберите одно из значений:

        • Случайный номер вхождения. Номер вхождения выбирается случайно;

        • Определенный номер вхождения. Укажите номер вхождения;

        • Все номера вхождений. Извлекаются все вхождения из ответа. В результате формируется массив значений: Param_1, Param_2, Param_n, где Param – наименование переменной, n – размер массива.

          Примечание

          При использовании извлеченного параметра укажите вручную порядковый номер вхождения: ${param_n}, где n – это порядковый номер вхождения. Если использовать такой параметр или заголовок без уточнения номера вхождения, то отправляется пустое значение.

    • jSONPath. Запрос к элементам JSON-файла.
      1. Заполните поля:

      2. В выпадающем списке выберите одно из значений:

        • Случайный номер вхождения. Номер вхождения выбирается случайно;

        • Определенный номер вхождения. Укажите номер вхождения;

        • Все номера вхождений. Извлекаются все вхождения из ответа. В результате формируется массив значений: Param_1, Param_2, Param_n, где Param – наименование переменной, n – размер массива.

          Примечание

          При использовании извлеченного параметра укажите вручную порядковый номер вхождения: ${param_n}, где n – это порядковый номер вхождения. Если использовать такой параметр или заголовок без уточнения номера вхождения, то отправляется пустое значение.

    • XPath. Запрос к элементам XML-документа.
      1. Заполните поля:

      2. В выпадающем списке выберите одно из значений:

        • Случайный номер вхождения. Номер вхождения выбирается случайно;

        • Определенный номер вхождения. Укажите номер вхождения;

        • Все номера вхождений. Извлекаются все вхождения из ответа. В результате формируется массив значений: Param_1, Param_2, Param_n, где Param – наименование переменной, n – размер массива.

          Примечание

          При использовании извлеченного параметра укажите вручную порядковый номер вхождения: ${param_n}, где n – это порядковый номер вхождения. Если использовать такой параметр или заголовок без уточнения номера вхождения, то отправляется пустое значение.

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

        • Наименование переменной. Переменная, в которую сохранятся результаты парсинга;

        • Левая граница. Левая граница значения, которое требуется найти. Необязательное поле;

        • Правая граница. Правая граница значения, которое требуется найти. Необязательное поле.

      2. Выберите поле, из которого необходимо извлечь данные:

        • Body. Тело ответа кроме заголовков;

        • Request headers. Заголовки ответа;

        • Response code. Код ответа, например, 200;

        • Response message. Ответное сообщение;

        • Url. URL запроса.

      3. В выпадающем списке выберите одно из значений:

        • Случайный номер вхождения. Номер вхождения выбирается случайно;

        • Определенный номер вхождения. Укажите номер вхождения. Номера вхождения начинаются с 1;

        • Все номера вхождений. Извлекаются все вхождения из ответа. В результате формируется массив значений: Param_1, Param_2, Param_n, где Param – наименование переменной, n – размер массива.

          Примечание

          При использовании извлеченного параметра укажите вручную порядковый номер вхождения: ${param_n}, где n – это порядковый номер вхождения. Если использовать такой параметр или заголовок без уточнения номера вхождения, то отправляется пустое значение.

  5. Нажмите на кнопку Сохранить.

Чтобы удалить настройку, нажмите на кнопку delete_button.

См.также

Предпросмотр ответа#

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

  1. Выберите источник данных, например, HAR.

  2. Перейдите на необходимую вкладку: Headers, Body, Cookies:

    _images/um_preview_response.ru.png

Примеры использования экстракторов#

Регулярное выражение#

Пример 1#

Задача: получить список валют в интернет-магазине https://ecommerce.pflb.us/.

Решение:

  1. Откройте сайт в браузере, например, в Google Chrome.

  2. Откройте инструмент разработчика.

  3. Перейдите на вкладку Сеть и в столбце Название выберите /ecommerce.pflb.us/.

  4. Перейдите на вкладку Ответ и проанализируйте ответ:

    _images/um_devtools.png
  5. Сформируйте регулярное выражение, например, в онлайн-сервисе RegEx101:

    1. В поле Test String скопируйте ответ.

    2. В поле Regular Expression укажите строку с тегом button:

      <button class="currency-select btn btn-link btn-block" type="button" name="EUR">€ Euro</button>
      
    3. Замените значение атрибута name и содержимое тега button на выражение (.*?). Выражение заменяет любые символы:

      <button class="currency-select btn btn-link btn-block" type="button" name="(.*?)">(.*?)</button>
      
    4. Экранируйте спецсимволы [ ] \ ^ $ . | ? * + ( ) с помощью символа \. В нашем случае: <\/button>.

    5. Добавьте в конце выражения флаг g. Флаг возвращает все совпадения из ответа.

    6. Убедитесь, что выражение извлекает необходимые значения.

  6. Откройте тест Boomq и добавьте GET-запрос https://ecommerce.pflb.us/.

  7. Перейдите на вкладку Извлечение из ответа.

  8. В выпадающем списке выберите значение Regex.

  9. Укажите наименование переменной, например currency.

  10. Укажите регулярное выражение:

    /<button class="currency-select btn btn-link btn-block" type="button" name="(.*?)">(.*?)<\/button>/g
    
  11. В поле Номер группы укажите значение 2.

  12. В выпадающем списке выберите значение Response headers.

  13. В выпадающем списке выберите значение Все номера вхождений.

Пример 2#

Задача: получить значение cookie при тестировании сайта https://ecommerce.pflb.us/.

Решение:

  1. Запишите HAR-файл и импортируйте его в тест или в группу.

  2. Откройте запрос, в ответе на который сервер возвращает уникальное значение Cookie.

  3. Перейдите на вкладку Извлечение из ответа.

  4. Проанализируйте cookies, получаемые от сайта https://ecommerce.pflb.us/:

    1. Раскройте предварительный просмотр ответа.

    2. Выберите источник данных HAR.

    3. Перейдите на вкладку Cookies и получите значение Cookie OCSESSID:

      _images/um_preview_cookies.ru.png

    Примечание

    Проанализировать cookie в заголовке ответа можно также с помощью инструмента разработчика в браузере, приложений Fiddler или Charles.

  5. На вкладке Извлечение из ответа в выпадающем списке выберите значение Regex.

  6. Укажите наименование переменной, например OCSESSID.

  7. Укажите регулярное выражение /Set-Cookie: OCSESSID=(.*?);/. До выполнения теста проверьте свое выражение в online-сервисах, например RegEx101.

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

    Примечание

    Группа — часть шаблона регулярного выражения, заключенного в круглые скобки. Группа позволяет получить конкретную часть строки, удовлетворяющую выражению.

  9. В выпадающем списке выберите значение Response headers.

  10. В выпадающем списке выберите значение Определенный номер вхождения и укажите значение 1.

jSONPath#

Задача: получить цены для всех товаров в магазине из ответа на запрос в формате jSON:

{
   "store": {
      "item": [
         {
            "category": "laptops",
            "name": "Sony VAIO",
            "brand": "Sony",
            "availability": "In Stock",
            "price": 1200,
            "CPU": "Intel"
         },
         {
            "category": "phones",
            "name": "IPhone",
            "brand": "Apple",
            "availability": "In Stock",
            "price": 150
         }
      ]
  }
}

Решение:

  1. В выпадающем списке выберите значение jSONPath.

  2. Укажите наименование переменной, например price.

  3. В поле Выражение jSONPath укажите: $.store..price. До выполнения теста проверьте свое выражение в online-сервисах, например JSONPath Online Evaluator или JSON Path Finder.

    Что еще можно получить из ответа с помощью jSONPath?

    Выражение jSONPath

    Результат

    $.store.item[*].name

    Все имена товаров

    $..brand

    Все бренды

    $.store.*

    Все товары в магазине

    $..item[1]

    Второй товар

    $..item[0,1]

    $..item[:2]

    Первые 2 товара

    $..item[(@.length-1)]

    $..item[-1:]

    Последний товар

    $..item[?(@.CPU)]

    Все товары, для которых указан процессор

    $.store.item[?(@.price < 1000)]

    Все товары дешевле 1000$

    $..*

    Все элементы JSON

  4. Выберите значение Все номера вхождений.

XPath#

Задача: получить имена товаров дороже 200$ из ответа на запрос в формате XML:

<?xml version="1.0" encoding="UTF-8"?>

<store>

<item category="laptops">
  <name>Sony VAIO</name>
  <brand>Sony</brand>
  <availability>In Stock</availability>
  <price>1200.00</price>
  <CPU>Intel</CPU>
</item>

<item category="phones">
  <name>IPhone</name>
  <brand>Apple</brand>
  <availability>In Stock</availability>
  <price>150.00</price>
</item>

</store>

Решение:

  1. В выпадающем списке выберите значение XPath.

  2. Укажите наименование переменной, например item.

  3. В поле Выражение XPath укажите: /store/item[price>200]/name. До выполнения теста проверьте свое выражение в online-сервисах, например xpather или XPath Tester.

    Что еще можно получить из ответа с помощью XPath?

    Выражение XPath

    Результат

    /store/item/name

    Все имена товаров

    //brand

    Все бренды

    /store/*

    Все товары в магазине

    /store//price

    Все цены товаров

    //item[2]

    Второй товар

    //item[position()<3]

    Первые 2 товара

    //item[last()]

    Последний товар

    //item[CPU]

    Все товары, для которых указан процессор

    //item[price<1000]

    Все товары дешевле 1000$

    //*

    Все элементы XML

  4. Выберите значение Все номера вхождений.

Границы#

Задача: получить имя первого товара из ответа:

{
   "store": {
      "item": [
         {
            "category": "laptops",
            "name": "Sony VAIO",
            "brand": "Sony",
            "availability": "In Stock",
            "price": 1200,
            "CPU": "Intel"
         },
         {
            "category": "phones",
            "name": "IPhone",
            "brand": "Apple",
            "availability": "In Stock",
            "price": 150
         }
      ]
  }
}

Решение:

  1. В выпадающем списке выберите значение Границы.

  2. Укажите наименование переменной, например item.

  3. В поле Левая граница укажите: "name": ".

  4. В поле Правая граница укажите: ",.

  5. Выберите поле Response message.

  6. Выберите значение Определенный номер вхождения и укажите 1.