Size: a a a

QA — Load & Performance

2020 June 08

ВС

Вячеслав Смирнов... in QA — Load & Performance
Viktor Bashkatov
ActiveMQ уже используется для MQ-запросов, потому решили переиспользовать для SOAP. Или плохой вариант?
Тогда могу сказать, что да, плохой вариант. Я создаю очередь на каждый идентификатор запроса. На каждую строку пула тестовых данных. Такое легко реализируется просто внутри JVM. Но не является хорошим вариантом для ActiveMQ.

Плюсом ActiveMQ будет то, что тест можно будет запускать распределённо, с 10-ти JMeter. Если вам такое нужно, то используйте ActiveMQ. Понимая накладные расходы
источник

ВС

Вячеслав Смирнов... in QA — Load & Performance
Если нагрузка подаётся с одного JMeter, то проще использовать ConcurrentHashMap + LinkedBlockingQueue + HashMap
источник

VB

Viktor Bashkatov in QA — Load & Performance
Вячеслав Смирнов
Если нагрузка подаётся с одного JMeter, то проще использовать ConcurrentHashMap + LinkedBlockingQueue + HashMap
Понятно. Спасибо.
источник

МВ

Максим Варанкевич... in QA — Load & Performance
Привет, столкнулся с такой штукой, используется в приложении сторонняя тула (cryptopro) плагин для браузера который создает сертификат с шифрованием. в теле запроса передает уже енкоженнные параметры, при попытке их б64декоднуть малу часть только декодит, остальное ерунда. может кто-то сталкивался с похожим.
источник

VG

Viktor Ganeles in QA — Load & Performance
знакомая штука
источник

VG

Viktor Ganeles in QA — Load & Performance
там наверняка строка подписи - это склеенные данные + бинарь  и всё это завёрнуто в b64
источник

VG

Viktor Ganeles in QA — Load & Performance
не парься из-за того, что когда b64 разворачиваешь, там половина текста не читаемая
источник

VG

Viktor Ganeles in QA — Load & Performance
вполне может быть что так и надо
источник

VG

Viktor Ganeles in QA — Load & Performance
судя по крипто про - там сертификаты ГОСТ ?
источник

VG

Viktor Ganeles in QA — Load & Performance
мы напилили заглушку на основе bouncyCastle, которая выполняет работу этого браузерного плагина.

Сертификатов нагенерили с помощью OpenSSL, засунули их в базу объекта тестирования

И когда надо подписать что-то - jmeter суёт в реквесте отправляет в заглушку то, что нужно подписать и приватный ключик, которым подписать.
А в респонзе получает строчку в b64, которую нужно вернуть в объект тестирования.
источник

?

? in QA — Load & Performance
Viktor Ganeles
мы напилили заглушку на основе bouncyCastle, которая выполняет работу этого браузерного плагина.

Сертификатов нагенерили с помощью OpenSSL, засунули их в базу объекта тестирования

И когда надо подписать что-то - jmeter суёт в реквесте отправляет в заглушку то, что нужно подписать и приватный ключик, которым подписать.
А в респонзе получает строчку в b64, которую нужно вернуть в объект тестирования.
👍
источник

VG

Viktor Ganeles in QA — Load & Performance
если нужно будет, стучись в личку, немножко поможем
источник

VB

Viktor Bashkatov in QA — Load & Performance
Вячеслав Смирнов
Привет, а почему в качестве очереди выбран вариант ActiveMQ? Я не помню, чтобы советовал помещать ответы в очередь.

Я использую такую структуру:
ConcurrentHashMap, где ключом явдяется идентификатор запроса, который смогу получить и из ответа - логин пользователя, CorrelationID, ...
А значением является LinkedBlockingQueue со списком запросов, которые отправил по этому идентификатору.
В очереди структуры данных, на groovy их формировать просто

dataSet = [:]
dataSet["id"] = id
dataSet["startTime"] = ...

Помещаю в очередь (внутри JVM) идентификатор запроса, время старта, что-то нибудь ещё. Не ответ.

А уже когда получаю ответ, в другом потоке, получаю из него идентификатор, по идентификатору получаю из ConcurrentHashMap очередь запросов по этому идентификатору, беру самый старый запрос из очереди.
Так получается, что "вспоминаю" параметры запроса и момент отправки. И могу программно сформировать SampleResult чтобы статистика отразилась в логе JMeter
Пытаюсь понять, как это реализовать. Смотрю blocktest.jmx.

ConcurrentHashMap map = props.get("data");
LinkedBlockingQueue in_game_users = map.get("in_game_users");

def value = [:]
value["id"] = ${id}
value["startTime"] = ...

in_game_users.add(value);

Т.е. так я сохраню айди и время отправки запроса. Но как тогда ловить ответ? Куда его должна отправлять заглушка?
источник

VB

Viktor Bashkatov in QA — Load & Performance
Viktor Bashkatov
Коллеги, добрый день!

Продолжаю разбираться с JMeter и SOAP-запросами. Получил эндпоинты, но вместе с ними следующий комментарий к асинхронным сервисам: "данный сервис должен быть опубликован на стороне Jmeter, поскольку в него ответит Шина". Подскажите, пожалуйста, как это понимать?

Также хочу узнать, корректно ли реализовал асинхронные SOAP-запросы. Вдохновлялся https://www.blazemeter.com/blog/how-to-load-test-async-requests-with-jmeter , сделал следующим образом: создал Thread Group, в ней - bzm - Parallel Controller, в контроллере содержатся асинхронные запросы с Response=30000. Верна ли эта реализация? Есть ли более логичные/производительные альтернативы?
Вот тут начало эпопеи с асинхронными запросами.
источник

ВС

Вячеслав Смирнов... in QA — Load & Performance
Viktor Bashkatov
Пытаюсь понять, как это реализовать. Смотрю blocktest.jmx.

ConcurrentHashMap map = props.get("data");
LinkedBlockingQueue in_game_users = map.get("in_game_users");

def value = [:]
value["id"] = ${id}
value["startTime"] = ...

in_game_users.add(value);

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

1. Вариант с очередями
Тест в очередь А отправляет запрос и из очереди B получает ответ, когда именно получит неизвестно. Ответ сравнивается по CorrelationID или другим признакам.

Тест в REST-ручку отправляет запрос и из очереди B получает ответ. Ответ сравнивается по другим признакам.

Тест создаёт временную очередь для принятия ответа и вместе с запросом отправляет и очередь в которую нужно положить ответ. Дожидается ответа в указанную очередь.

2. Вариант с callback-ом
Тест передаёт вместе с запросом к сервису А метод другого сервиса B, который нужно вызвать когда сервис А сформирует ответ

То есть как-то но ответ на запрос можно получить
источник

ВС

Вячеслав Смирнов... in QA — Load & Performance
3. Pooling
Тест отправляет запрос в метод А, а потом долго вызывает метод B, чтобы получить ответ на свой запрос. Сначала метод B возвращает, что ответа нет, но когда-нибудь отдает ответ
источник

l

lejng in QA — Load & Performance
А нормальная практика например тесты для нагрузочного тестирования запускать в докере?
источник

МВ

Максим Варанкевич... in QA — Load & Performance
Viktor Ganeles
судя по крипто про - там сертификаты ГОСТ ?
ага
источник

VB

Viktor Bashkatov in QA — Load & Performance
Вячеслав Смирнов
Пока ничего не знаю о вашей системе. Обычно асинхронный тест выглядит так:

1. Вариант с очередями
Тест в очередь А отправляет запрос и из очереди B получает ответ, когда именно получит неизвестно. Ответ сравнивается по CorrelationID или другим признакам.

Тест в REST-ручку отправляет запрос и из очереди B получает ответ. Ответ сравнивается по другим признакам.

Тест создаёт временную очередь для принятия ответа и вместе с запросом отправляет и очередь в которую нужно положить ответ. Дожидается ответа в указанную очередь.

2. Вариант с callback-ом
Тест передаёт вместе с запросом к сервису А метод другого сервиса B, который нужно вызвать когда сервис А сформирует ответ

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

ВС

Вячеслав Смирнов... in QA — Load & Performance
Viktor Bashkatov
Система не наша, потому глубоких технических деталей не знаю. Какую информацию нужно запросить у коллег, чтобы определиться с реализацией асинхронных тестов?
Простой вопрос. Как приходит ответ на запрос, который считается асинхронным
источник