JMeter как утверждения кода не учитывается в результатах теста - PullRequest
0 голосов
/ 28 октября 2018

Я использую JMeter в качестве кода (программный подход вместо графического интерфейса пользователя в проекте Java Maven) для стресс-тестирования AWS Lambda Serverless API.

Я уже разработал план тестирования, группу потоков, HTTPSamplerProxy и так далее ...

Выполнение вызовов API работает отлично, но это не так, например. для DurationAssertion, которое я добавил в HTTP Sampler ..

Я также установил CSV-файл для вывода, где после выполнения я вижу все в порядке (код состояния 200 ..), но тест должен завершиться неудачей, поскольку он находится над настроенным DurationAssertion (в дополнение к другим проверочные элементы).

Я подумал, что, возможно, мне нужно было установить "enabled" = true в объекте DurationAssertion, но безрезультатно. Также я попытался получить доступ к контексту JMeter следующим образом:

JMeterContextService.getContext().getPreviousResult()

Я ожидал, что приведенный выше код извлечет SampleResult (который имеет коллекцию AssertionResult), но SampleResult имеет значение null ..

План тестирования с элементами тестирования (в данном случае DurationAssertion) без соответствующего анализа результатов этих утверждений не имеет смысла. Я хочу видеть сообщение об ошибке в каждом вызове, превышающее определенный порог. Если я ' Если бы я использовал графический интерфейс JMeter, я бы добавил ViewResultTree, который отображает представление результатов сэмплера с подробностями запроса, ответа и связанных тестовых утверждений. И в дополнение к результату утверждения (для каждого запроса) я хочу увидеть полезную нагрузку запроса, полный ответ, заголовки. Но в программном режиме (без использования графического интерфейса пользователя).

Так что я был бы очень признателен, если бы кто-нибудь дал мне подсказку о том, как достичь этой цели, но с помощью кода.

ОБНОВЛЕНИЕ 1 : Я делюсь фрагментом github со всем исходным кодом, например, пользователь UBIK LOAD PACK предложил мне:

https://gist.github.com/svillarreal/5eb90a66b8972633b95c249abb3566da

ОБНОВЛЕНИЕ 2 : Проверка объекта контекста (оценивается после завершения работы двигателя JMeter) - все пусто внутри

ОБНОВЛЕНИЕ 3

i) Недавно я нашел файл jmeter.properties, в котором я настроил следующие свойства:

    jmeter.save.saveservice.output_format=xml
    jmeter.save.saveservice.assertion_results=all

И теперь вывод в виде XML вместо CSV показывает, по крайней мере, полезную нагрузку отправленного запроса и данные ответа, что ОЧЕНЬ полезно для анализа случаев ошибок.

ii) Я выполнил проверку JMeterContextService.getContext () внутри выполнения JMeterEngine, а не после того, как он завершил выполнение, и затем я смог понять, что для каждой группы потоков существует один контекст, и во время его выполнения этот объект заполнен, так что теперь понятно, почему в ОБНОВЛЕНО 2 все свойства равны нулю ..

С уважением и благодарностью!

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Наконец-то я смог это исправить.Проблема заключалась в том, что я ошибочно управлял деревом, которое передается в StandardJMeterEngine.

В JMeter все основано на этом дереве, и, как и в GUI, мы должны позаботиться о том, как элементы расположены в его иерархии.

Анализируя библиотеку и интенсивно отлаживая ее, я 'я более глубоко понял, как работает JMeter, и я понял, что все управляется, начиная с HashTree.Поэтому решение состояло в том, чтобы добавить DurationAssertion и ResponseAssertion как дочерние узлы HTTPSamplerProxy вместо того, чтобы помещать их в качестве тестовых элементов HTTPSamplerProxy.

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

    // org.apache.jmeter.threads.TestCompiler 

    private void saveSamplerConfigs(Sampler sam) {
        List<ConfigTestElement> configs = new LinkedList<>();
        List<Controller> controllers = new LinkedList<>();
        List<SampleListener> listeners = new LinkedList<>();
        List<Timer> timers = new LinkedList<>();
        List<Assertion> assertions = new LinkedList<>();
        LinkedList<PostProcessor> posts = new LinkedList<>();
        LinkedList<PreProcessor> pres = new LinkedList<>();
        for (int i = stack.size(); i > 0; i--) {
            addDirectParentControllers(controllers, stack.get(i - 1));
            List<PreProcessor>  tempPre = new LinkedList<>();
            List<PostProcessor> tempPost = new LinkedList<>();
            List<Assertion> tempAssertions = new LinkedList<>();
            for (Object item : testTree.list(stack.subList(0, i))) {
                if (item instanceof ConfigTestElement) {
                    configs.add((ConfigTestElement) item);
                }
                if (item instanceof SampleListener) {
                    listeners.add((SampleListener) item);
                }
                if (item instanceof Timer) {
                    timers.add((Timer) item);
                }
                if (item instanceof Assertion) {
                    tempAssertions.add((Assertion) item);
                }
                if (item instanceof PostProcessor) {
                    tempPost.add((PostProcessor) item);
                }
                if (item instanceof PreProcessor) {
                    tempPre.add((PreProcessor) item);
                }
            }
            assertions.addAll(0, tempAssertions);
            pres.addAll(0, tempPre);
            posts.addAll(0, tempPost);
        }

        SamplePackage pack = new SamplePackage(configs, listeners, timers, assertions,
                posts, pres, controllers);
        pack.setSampler(sam);
        pack.setRunningVersion(true);
        samplerConfigMap.put(sam, pack);
    }

Также мне пришлось активировать следующее свойство:

jmeter.save.saveservice.assertion_results_failure_message=true

В результате теперь у меня есть отчет в файле CSV с результатами утверждений.сообщения, включенные в эксклюзивную колонку для этого.

Что ж, проблема решена.** Я обновил суть фрагмента github с окончательным решением ** Большое спасибо всем, кто прочитал этот пост и попытался сотрудничать.

С уважением,

0 голосов
/ 29 октября 2018

Я могу вспомнить хотя бы один случай использования, когда ваш подход не сработает: JMeter вообще не получил ответа от сервера.

Например, если ваш сервер перегружен, возможно, JMeter никогда не получит ответ, поэтому ваше утверждение продолжительности просто не будет применено, поскольку PostProcessors, Listeners и Assertions не запускаются , учитывая, что SampleResult равен ноль.

Поэтому, чтобы быть в безопасности, я бы порекомендовал применить connect и response timeout к вашему сэмплеру (ам) HTTP Request

HTTPSamplerProxy httpSampler = new HTTPSamplerProxy();
httpSampler.setConnectTimeout("3000");
httpSampler.setResponseTimeout("3000");
//etc.

Если в плане тестирования> 1 HTTP-сэмплер имеет значение>, имеет смысл перейти на HTTP-запрос по умолчанию вместо индивидуальной установки таймаутов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...