Корреляция — трудный путь в JMeter

Я уже публиковал много видеоуроков о корреляции в JMeter, LoadRunner и других инструментах на своем канале YouTube. Но все методы, которые я объяснял, были абстрактными и традиционными. В этой статье блога мы рассмотрим, как это можно сделать сложным способом.

Что такое корреляция?

В экосистеме JMeter нет официального термина корреляция. Это общий термин, используемый инженерами/тестировщиками производительности. Кроме того, озаглавливание этой статьи в блоге словом корреляция помогает в SEO 🙂

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

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

Корреляция — жесткий способ в JMeter

Давайте начнем с извлечения тега title из ответа с помощью сценария Groovy, добавив JSR223 Post processor в JMeter. Ниже представлено дерево плана тестирования.

Вот сценарий Groovy.

response = prev.getResponseDataAsString() //Extract the previous response

def extractTitle = /<title>(.+?)</title>/
def matcher = response =~ extractTitle

if (matcher.size() >=1) {
    println matcher.findAll()[0][1]
    vars.put("extractTitle",matcher.findAll()[0][1])
}

Вот URL https://jpetstore-qainsights.cloud.okteto.net/jpetstore/actions/Catalog.action

Первым шагом является чтение HTTP-ответа как строки с помощью prev.getResponseDataAsString().

prev — это вызов API, который извлекает предыдущий SampleResult. Используя метод getResponseDataAsString() мы можем извлечь весь ответ в виде строки и сохранить его в переменной.

Следующие две строки определяют наш шаблон регулярного выражения и условия соответствия. Groovy поставляется с мощной системой сопоставления шаблонов регулярных выражений.

def extractTitle = /<title>(.+?)</title>/
def matcher = response =~ extractTitle

Следующий блок проверяет наличие совпадений >=1, затем выводит извлеченную строку из списка массива. Затем он сохранит значение в переменной extractTitle с помощью метода vars.put.

if (matcher.size() >=1) {
    println matcher.findAll()[0][1]
    vars.put("extractTitle",matcher.findAll()[0][1])
}

Вот результат:

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

GitHub Repo

Использование JSoup

Для эффективной обработки HTML-ответов лучше использовать HTML-парсеры, такие как JSoup.

JSoup — это библиотека Java для работы с реальным HTML. Она предоставляет очень удобный API для получения URL, извлечения и манипулирования данными, используя лучшие методы HTML5 DOM и селекторы CSS.

Давайте воспользуемся Grab, чтобы JMeter самостоятельно загрузил зависимости, в противном случае вам нужно скачать JSoup jar и сохранить его в папке lib или ext.

import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import org.jsoup.select.Elements

@Grab(group='org.jsoup', module='jsoup', version='1.15.2')

response = prev.getResponseDataAsString() // Extract response

Document doc = Jsoup.parse(response)
println doc.title()

Объект doc разберет ответ и выведет заголовок в командную строку в JMeter.

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


import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import org.jsoup.select.Elements

@Grab(group='org.jsoup', module='jsoup', version='1.15.2')

response = prev.getResponseDataAsString() // Extract response

Document doc = Jsoup.parse(response)
println doc.title()

// To print all the links and its text

Elements links = doc.body().getElementsByTag("a");
for (Element link : links) {
    String linkHref = link.attr("href");
    String linkText = link.text();
    println linkHref + linkText
}

Для печати всех элементов поля списка и случайных значений поля списка для url (http://computer-database.gatling.io/computers/new), используйте приведенный ниже фрагмент кода.

import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import org.jsoup.select.Elements

@Grab(group='org.jsoup', module='jsoup', version='1.15.2')

response = prev.getResponseDataAsString() // Extract response
companyList = []
Random random = new Random()

Document doc = Jsoup.parse(response)

// To print all the list box elements

Elements lists = doc.body().select("select option")
for (Element list : lists) {
    println "Company is " + list.text()
    companyList.add(list.text())
}

// To print random list box element

println("The total companies are " + companyList.size())
println(companyList[random.nextInt(companyList.size())])

Заключительные слова

Как вы узнали, используя API prev, мы можем извлечь ответ, а затем разобрать его с помощью библиотеки JSoup или написав нужные регулярные выражения сложным способом, не используя встроенные элементы, такие как Regular Expression Extractor или JSON Extractor и другие. Возможно, этот подход не сэкономит время, но его стоит освоить, он пригодится в ситуациях, подобных интервью.

Оцените статью
devanswers.ru
Добавить комментарий