Запуск сервера Hybris для тестов производительности JMeter

Я пытаюсь автоматизировать тесты производительности JMeter для моей PR-сборки Jenkins для платформы Hybris.

Очевидно, что для запуска моего сценария производительности JMeter сначала должен быть запущен hybrisserver, чтобы был доступен localhost.

Мой подход заключался в том, чтобы запустить сервер так же, как это делалось для интеграционных тестов, а затем выполнить тесты производительности. Я вижу, что сервер запускается точно так же, как и в цели интеграционных тестов, но все мои запросы из сценария jmeter не работают, поскольку localhost недоступен.

Кто-нибудь может с этим помочь?

Изменить: Подход к запуску сервера Hybris, как это сделано для интеграционного теста

Изменить: подход к запуску Hybris Server в моей цели ANT, которая запускает мой тест производительности JMeter - он также запускает Hybris Server, но localhost также недоступен

    <yrun>
         de.hybris.platform.core.Registry.setCurrentTenantByID("junit");

         de.hybris.platform.util.RedeployUtilities.shutdown();
     </yrun>

person Theo    schedule 19.11.2019    source источник
comment
Привет, @Theo - Пожалуйста, добавьте команды и любые связанные снимки экрана, если это возможно. Как вы пытаетесь этого добиться, когда говорите same way as its done for integration tests ?. Пожалуйста, добавьте еще немного информации, и вы получите больше ответов. Спасибо   -  person www.hybriscx.com    schedule 20.11.2019
comment
Привет, спасибо за подсказку. Я добавил больше информации   -  person Theo    schedule 20.11.2019
comment
Привет, @Theo, я думаю, тебе тоже нужно позвонить Registry.activateMasterTenant(); или activateTenant   -  person www.hybriscx.com    schedule 20.11.2019


Ответы (4)


Вы можете поместить свою логику, которая будет «ждать», пока сервер станет доступным, в setUp Thread Group, что-то вроде:

однако таким образом вы получите дополнительные отрицательные результаты в вашем файле результатов .jtl, я бы выбрал JSR223 Sampler и такой код, как:

SampleResult.setIgnore()
def attempt = 1
def host = 'localhost'
def port = 8080
while (true) {
    try {
        def s = new Socket(host, port)
        if (s.isConnected()) {
            log.info('Server is available, starting the test')
            s.close()
            break
        }
    }
    catch (Exception ex) {
        log.info('Server is not available after ' + attempt + ' attempts, retrying...')
        attempt++
        sleep(5000)
    }
}

он попытается установить соединение Socket с данной конечной точкой и в случае сбоя подождите 5 секунд и повторите попытку. Когда сервер станет доступным, он выйдет из цикла и запустит другие «нормальные» группы потоков.

введите здесь описание изображения

person Dmitri T    schedule 19.11.2019
comment
Спасибо, Дмитрий Т. Проблема не в том, что JMeter запускается до запуска сервера. Похоже, это проблема со стороны Hybris = ›сервер либо запущен в сокращенном режиме, либо localhost находится на другом порту, о котором я не знаю. - person Theo; 19.11.2019

Попробуйте использовать порты 9001 или 9002.

person BNR    schedule 19.11.2019
comment
Откройте порты, если они находятся за брандмауэром. какую операционную систему вы используете ?. Hybris обычно требует 80, 443, 9001, 9002 и 8983 (для solr) - person BNR; 20.11.2019
comment
Привет @BNR, я использую mac os, я думаю, что порт должен быть открыт, потому что, когда я запускаю свой сервер, например ./hybrisserver.sh, localhost доступен, и все работает - person Theo; 21.11.2019

Я думаю, вам также нужно будет активировать свой клиент, используя что-то вроде ...
de.hybris.platform.core.Registry.activateTenant(); (проверьте доступные функции, которые вы можете использовать в классе Registery)

<yrun>
         de.hybris.platform.core.Registry.activateTenant(de.hybris.platform.core.Registry.getTenantByID("junit"));
         de.hybris.platform.util.RedeployUtilities.shutdown();
</yrun>

Также проверьте web=true в platform / build.xml, если что-то вызывает загрузку веб-контекста.

<target name="allwebtests" description="">
        <callback extname="" target="before_yunitweb"/>
        <annotationtests annotations="unittests,demotests,integrationtests" web="true"/>
        <callback extname="" target="after_yunitweb"/>
    </target>
person www.hybriscx.com    schedule 20.11.2019
comment
Я запустил сервер таким образом, но все еще не могу получить доступ к localhost: / Я использовал эти строки для запуска сервера de.hybris.platform.core.Registry.setCurrentTenantByID (master); de.hybris.platform.core.Registry.activateMasterTenant (); - person Theo; 20.11.2019
comment
О, следует проверить, загружает ли hybris веб-контекст с помощью activateTanent или просто загружает только контекст приложения Spring. Если вы не выключите его с помощьюde.hybris.platform.util.RedeployUtilities.shutdown(), сможете ли вы получить доступ к сайту с помощью браузера? - person www.hybriscx.com; 20.11.2019
comment
Это очень интересный момент. Я не могу получить доступ к сайту с помощью своего браузера. Я пробовал с localhost: 9002 и localhost: 9001 оба недоступны - person Theo; 20.11.2019
comment
Возможно, вы можете обратиться к платформе / build.xml для целевого allwebtests. Вы увидите, что здесь передан атрибут web=true. - person www.hybriscx.com; 21.11.2019
comment
Даже когда я запускаю allwebtests, локальный хост недоступен в моем браузере: / - person Theo; 21.11.2019

Вы можете запустить встроенный сервер с помощью аннотации «@NeedsEmbeddedServer», например, это используется в тестах Spock (BDD) в расширении «ycommercewebservicestest».

Обратите внимание, что при этом будет использоваться клиент junit, а встроенный сервер по умолчанию работает на портах 8001 (http) и 8002 (https).

Вы можете проверить порты в своих свойствах:

# specifies default http port for embedded server
embeddedserver.http.port=8001

# specifies default https port for embedded server
embeddedserver.ssl.port=8002

Например:

@IntegrationTest
@NeedsEmbeddedServer(webExtensions = {"ycommercewebservices"})
public class ExampleWebTest extends ServicelayerTest {

    @Test
    public void exampleTest() {
        // YOUR IMPLEMENTATION
    }
}
person Eike S.    schedule 16.01.2020