Подтвердить что ты не робот

Как создавать и запускать скрипты тестирования Apache JMeter из программы Java?

Я хочу использовать API, предоставляемый Apache JMeter, для создания и запуска тестовых скриптов из программы Java. Я понял основы ThreadGroup и Samplers. Я могу создать их в своем классе Java с помощью JMeter API.

ThreadGroup threadGroup = new ThreadGroup();
    LoopController lc = new LoopController();
    lc.setLoops(5);
    lc.setContinueForever(true);
    threadGroup.setSamplerController(lc);
    threadGroup.setNumThreads(5);
    threadGroup.setRampUp(1);

HTTPSampler sampler = new HTTPSampler();
    sampler.setDomain("localhost");
    sampler.setPort(8080);
    sampler.setPath("/jpetstore/shop/viewCategory.shtml");
    sampler.setMethod("GET");

    Arguments arg = new Arguments();
    arg.addArgument("categoryId", "FISH");

    sampler.setArguments(arg);

Однако я не знаю, как создать тест script, объединяющий группу потоков и сэмплер, а затем выполнить его из той же программы. Есть идеи?

4b9b3361

Ответ 1

Если я правильно понимаю, вы хотите программно запустить весь план тестирования из программы Java. Лично мне легче создать файл плана тестирования .JMX и запустить его в режиме JMeter без GUI:)

Вот простой пример Java, основанный на контроллере и сэмплере, который используется в исходном вопросе.

import org.apache.jmeter.control.LoopController;
import org.apache.jmeter.engine.StandardJMeterEngine;
import org.apache.jmeter.protocol.http.sampler.HTTPSampler;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.TestPlan;
import org.apache.jmeter.threads.SetupThreadGroup;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.collections.HashTree;

public class JMeterTestFromCode {

    public static void main(String[] args){
        // Engine
        StandardJMeterEngine jm = new StandardJMeterEngine();
        // jmeter.properties
        JMeterUtils.loadJMeterProperties("c:/tmp/jmeter.properties");

        HashTree hashTree = new HashTree();     

        // HTTP Sampler
        HTTPSampler httpSampler = new HTTPSampler();
        httpSampler.setDomain("www.google.com");
        httpSampler.setPort(80);
        httpSampler.setPath("/");
        httpSampler.setMethod("GET");

        // Loop Controller
        TestElement loopCtrl = new LoopController();
        ((LoopController)loopCtrl).setLoops(1);
        ((LoopController)loopCtrl).addTestElement(httpSampler);
        ((LoopController)loopCtrl).setFirst(true);

        // Thread Group
        SetupThreadGroup threadGroup = new SetupThreadGroup();
        threadGroup.setNumThreads(1);
        threadGroup.setRampUp(1);
        threadGroup.setSamplerController((LoopController)loopCtrl);

        // Test plan
        TestPlan testPlan = new TestPlan("MY TEST PLAN");

        hashTree.add("testPlan", testPlan);
        hashTree.add("loopCtrl", loopCtrl);
        hashTree.add("threadGroup", threadGroup);
        hashTree.add("httpSampler", httpSampler);       

        jm.configure(hashTree);

        jm.run();
    }
}

Зависимости

Это голые минимальные JAR, требуемые на основе JMeter 2.9 и используемого HTTPSampler. Другие сэмплеры, скорее всего, будут иметь разные зависимости JAR библиотеки.

  • ApacheJMeter_core.jar
  • jorphan.jar
  • Авалон-каркасного 4.1.4.jar
  • ApacheJMeter_http.jar
  • Обще-каротаж 1.1.1.jar
  • logkit-2.0.jar
  • орально-2.0.8.jar
  • Обще-ю-2.2.jar
  • Обще-lang3-3.1.jar

Примечание

  • Я также установил путь к jmeter.properties в c:\tmp в Windows после первого его копирования из каталога установки /bin JMeter.
  • Я не был уверен, как установить прокси-сервер для HTTPSampler.

Ответ 2

package jMeter;

import java.io.File;
import java.io.FileOutputStream;

import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.config.gui.ArgumentsPanel;
import org.apache.jmeter.control.LoopController;
import org.apache.jmeter.control.gui.LoopControlPanel;
import org.apache.jmeter.control.gui.TestPlanGui;
import org.apache.jmeter.engine.StandardJMeterEngine;
import org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui;
import org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy;
import org.apache.jmeter.reporters.ResultCollector;
import org.apache.jmeter.reporters.Summariser;
import org.apache.jmeter.save.SaveService;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.TestPlan;
import org.apache.jmeter.threads.ThreadGroup;
import org.apache.jmeter.threads.gui.ThreadGroupGui;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.collections.HashTree;

public class JMeterFromScratch {

        public static void main(String[] argv) throws Exception {

            String jmeterHome1 = "/home/ksahu/apache-jmeter-2.13";
            File jmeterHome=new File(jmeterHome1);
//          JMeterUtils.setJMeterHome(jmeterHome);
            String slash = System.getProperty("file.separator");

            if (jmeterHome.exists()) {
                File jmeterProperties = new File(jmeterHome.getPath() + slash + "bin" + slash + "jmeter.properties");
                if (jmeterProperties.exists()) {
                    //JMeter Engine
                    StandardJMeterEngine jmeter = new StandardJMeterEngine();

                    //JMeter initialization (properties, log levels, locale, etc)
                    JMeterUtils.setJMeterHome(jmeterHome.getPath());
                    JMeterUtils.loadJMeterProperties(jmeterProperties.getPath());
                    JMeterUtils.initLogging();// you can comment this line out to see extra log messages of i.e. DEBUG level
                    JMeterUtils.initLocale();

                    // JMeter Test Plan, basically JOrphan HashTree
                    HashTree testPlanTree = new HashTree();

                    // First HTTP Sampler - open example.com
                    HTTPSamplerProxy examplecomSampler = new HTTPSamplerProxy();
                    examplecomSampler.setDomain("www.google.com");
                    examplecomSampler.setPort(80);
                    examplecomSampler.setPath("/");
                    examplecomSampler.setMethod("GET");
                    examplecomSampler.setName("Open example.com");
                    examplecomSampler.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName());
                    examplecomSampler.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName());


                    // Second HTTP Sampler - open blazemeter.com
                    HTTPSamplerProxy blazemetercomSampler = new HTTPSamplerProxy();
                    blazemetercomSampler.setDomain("www.tripodtech.net");
                    blazemetercomSampler.setPort(80);
                    blazemetercomSampler.setPath("/");
                    blazemetercomSampler.setMethod("GET");
                    blazemetercomSampler.setName("Open blazemeter.com");
                    blazemetercomSampler.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName());
                    blazemetercomSampler.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName());


                    // Loop Controller
                    LoopController loopController = new LoopController();
                    loopController.setLoops(1);
                    loopController.setFirst(true);
                    loopController.setProperty(TestElement.TEST_CLASS, LoopController.class.getName());
                    loopController.setProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName());
                    loopController.initialize();

                    // Thread Group
                    ThreadGroup threadGroup = new ThreadGroup();
                    threadGroup.setName("Example Thread Group");
                    threadGroup.setNumThreads(1);
                    threadGroup.setRampUp(1);
                    threadGroup.setSamplerController(loopController);
                    threadGroup.setProperty(TestElement.TEST_CLASS, ThreadGroup.class.getName());
                    threadGroup.setProperty(TestElement.GUI_CLASS, ThreadGroupGui.class.getName());

                    // Test Plan
                    TestPlan testPlan = new TestPlan("Create JMeter Script From Java Code");
                    testPlan.setProperty(TestElement.TEST_CLASS, TestPlan.class.getName());
                    testPlan.setProperty(TestElement.GUI_CLASS, TestPlanGui.class.getName());
                    testPlan.setUserDefinedVariables((Arguments) new ArgumentsPanel().createTestElement());

                    // Construct Test Plan from previously initialized elements
                    testPlanTree.add(testPlan);
                    HashTree threadGroupHashTree = testPlanTree.add(testPlan, threadGroup);
                    threadGroupHashTree.add(blazemetercomSampler);
                    threadGroupHashTree.add(examplecomSampler);

                    // save generated test plan to JMeter .jmx file format
                    SaveService.saveTree(testPlanTree, new FileOutputStream(jmeterHome + slash + "example.jmx"));

                    //add Summarizer output to get test progress in stdout like:
                    // summary =      2 in   1.3s =    1.5/s Avg:   631 Min:   290 Max:   973 Err:     0 (0.00%)
                    Summariser summer = null;
                    String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary");
                    if (summariserName.length() > 0) {
                        summer = new Summariser(summariserName);
                    }


                    // Store execution results into a .jtl file
                    String logFile = jmeterHome + slash + "example.jtl";
                    ResultCollector logger = new ResultCollector(summer);
                    logger.setFilename(logFile);
                    testPlanTree.add(testPlanTree.getArray()[0], logger);

                    // Run Test Plan
                    jmeter.configure(testPlanTree);
                    jmeter.run();

                    System.out.println("Test completed. See " + jmeterHome + slash + "example.jtl file for results");
                    System.out.println("JMeter .jmx script is available at " + jmeterHome + slash + "example.jmx");
                    System.exit(0);

                }
            }

            System.err.println("jmeter.home property is not set or pointing to incorrect location");
            System.exit(1);


        }
    }

Ответ 3

Я создал простое доказательство концептуального проекта с использованием JMeter Java Api с зависимостями Maven: https://github.com/piotrbo/jmeterpoc

Вы можете создать файл jmx проекта JMeter и выполнить его из командной строки или выполнить его непосредственно из java-кода.

Это было сложно, так как файл jmx требует наличия атрибута guiclass для каждого TestElement. Для выполнения jmx достаточно добавить guiclass (даже с неправильным значением). Для открытия в JMeter GUI требуется установить правильное значение для каждого guiclass.

Гораздо более раздражающей проблемой являются контроллеры потока на основе условий. JMeter API не дает вам гораздо больше графического интерфейса. Вам все равно нужно пройти a condition например. в IfController как обычный String. Строка должна содержать javascript. Таким образом, у вас есть Java-проект с javascript, например. синтаксическая ошибка, вы не узнаете ее до тех пор, пока не выполните свой тест производительности: - (

Вероятно, лучшей альтернативой оставаться с кодом и поддержкой IDE вместо JMeter GUI является изучение Scala бит и использование http://gatling.io/

Ответ 4

Работа в режиме без GUI намного быстрее. Сделали один проект, который использует Jmeter в бэкэнд-режиме, а затем анализирует XML файл для отображения результатов теста. Взгляните на этот репо https://github.com/rohitjaryal/RESTApiAutomation.git

Ответ 5

У меня нет опыта работы с Apache JMeter, но, как правило, если вы хотите использовать свою Java-программу для запуска чего-то еще, вы используете класс Process через класс Runtime. Код для этого -

Runtime runtime = Runtime.getRuntime();
Process p = runtime.exec("the script");//Thats it! You have now started your script!

Обратите внимание, что вы не увидите вывод слияния процесса на консоль. Вы можете программно захватывать входные и выходные потоки с помощью класса Process:

InputStream input = p.getInputStream();
OutputStream output = p.getOutputStream();

И это позволит вам анализировать ввод/вывод во время запуска вашей Java-программы.