Статьи

Реализация пользовательских сэмплеров JMeter

По мере того, как мы работаем с различными архитектурами и реализациями, растет необходимость в универсальных инструментах для стресс-тестирования.

Apache Jmeter — один из самых известных инструментов для нагрузочного тестирования. Он поддерживает множество протоколов, таких как ftp http tcp, а также может легко использоваться для распределенного тестирования.

Jmeter также предоставляет вам простой способ создания пользовательских сэмплеров. Например, если вам нужно выполнить нагрузочное тестирование конечной точки http, которая требует специальной процедуры для подписи заголовков, тогда вам пригодится специальный сэмплер.

Цель состоит в том, чтобы реализовать собственный проект сэмплера, который будет загружать тест простой функцией.

Я использую Gradle для этого примера.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
group 'com.gkatzioura.jmeter'
version '1.0-SNAPSHOT'
 
apply plugin: 'java'
 
sourceCompatibility = 1.6
 
repositories {
    mavenCentral()
}
 
 
dependencies {
    compile 'org.apache.jmeter:ApacheJMeter_java:2.11'
    compile 'org.json:json:20151123'
    testCompile group: 'junit', name: 'junit', version: '4.11'
}
 
task copySample(type:Copy,dependsOn:[build]) {
 
    copy {
        from project.buildDir.getPath()+'/libs/jmeter-sampler-1.0-SNAPSHOT.jar'
        into 'pathtoyourjmeterinstallation/apache-jmeter-2.13/lib/ext/'
    }
}

Я включил зависимость ApacheJMeter от проекта, так как сэмплер должен будет расширить AbstractJavaSamplerClient. Задача copySample скопирует jar-файл в путь lib / ext Jmeter, где находятся все сэмплеры.

Простая функция будет вызываться сэмплером:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
package com.gkatzioura.jmeter;
 
/**
 * Created by gkatzioura on 30/1/2016.
 */
public class FunctionalityForSampling {
 
    public String testFunction(String arguement1,String arguement2) throws Exception {
 
        if (arguement1.equals(arguement2)) {
            throw new Exception();
        }
 
        else return arguement1+arguement2;
    }
 
}

Класс CustomSampler расширяет класс AbstractJavaSamplerClient и вызывает функцию testFunction. Переопределив функцию getDefaultParameters, мы можем применить параметры по умолчанию, которые можно использовать с запросом.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package com.gkatzioura.jmeter;
 
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import java.io.Serializable;
 
/**
 * Created by gkatzioura on 30/1/2016.
 */
public class CustomSampler extends AbstractJavaSamplerClient implements Serializable {
 
    private static final String METHOD_TAG = "method";
    private static final String ARG1_TAG = "arg1";
    private static final String ARG2_TAG = "arg2";
 
    private static final Logger LOGGER = LoggerFactory.getLogger(CustomSampler.class);
 
    @Override
    public Arguments getDefaultParameters() {
 
        Arguments defaultParameters = new Arguments();
        defaultParameters.addArgument(METHOD_TAG,"test");
        defaultParameters.addArgument(ARG1_TAG,"arg1");
        defaultParameters.addArgument(ARG2_TAG,"arg2");
 
        return defaultParameters;
    }
 
    @Override
    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
 
        String method = javaSamplerContext.getParameter(METHOD_TAG);
        String arg1 = javaSamplerContext.getParameter(ARG1_TAG);
        String arg2 = javaSamplerContext.getParameter(ARG2_TAG);
 
        FunctionalityForSampling functionalityForSampling = new FunctionalityForSampling();
 
        SampleResult sampleResult = new SampleResult();
        sampleResult.sampleStart();
 
        try {
            String message = functionalityForSampling.testFunction(arg1,arg2);
            sampleResult.sampleEnd();;
            sampleResult.setSuccessful(Boolean.TRUE);
            sampleResult.setResponseCodeOK();
            sampleResult.setResponseMessage(message);
        } catch (Exception e) {
            LOGGER.error("Request was not successfully processed",e);
            sampleResult.sampleEnd();
            sampleResult.setResponseMessage(e.getMessage());
            sampleResult.setSuccessful(Boolean.FALSE);
 
        }
 
        return sampleResult;
    }
 
}

После завершения компиляции созданный jar-файл должен быть скопирован в каталог lib / ext домашнего каталога установки JMeter. Кроме того, в случае если нужно импортировать больше зависимостей, они также должны быть скопированы в путь lib домашнего каталога установки JMeter.

Как только процесс завершится добавлением Java Sampler в группу потоков JMeter, мы можем выбрать наш собственный сэмплер.

Скриншот-от-2016-01-31-013006

  • Вы также можете найти исходный код здесь .