Стандартный метод запускаJMeterEngine, не запускающий HTTPSampler - PullRequest
3 голосов
/ 09 апреля 2020

Я пытаюсь создать класс Java, который может вызывать REST API с помощью JMeter. Я делаю это, так как мне понадобится это для создания утилиты для какого-либо нагрузочного тестирования.

Я установил JMeter и, используя режим GUI, смог создать и запустить тест, который способен ударить мой API. Затем я взял пример кода, предложенный на многих веб-сайтах, и попытался запустить его.

Код указан ниже:

public class JMeterTestRunner {

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

    //JMeter Engine
    StandardJMeterEngine jmeter = new StandardJMeterEngine();

    //JMeter initialization (properties, log levels, locale, etc)
    JMeterUtils.loadJMeterProperties("/Users/something/apache-jmeter-5.2.1/bin/jmeter.properties");
    JMeterUtils.initLogging();// you can comment this line out to see extra log messages of i.e. DEBUG level
    JMeterUtils.initLocale();

    // JMeter Test Plan, basic all u JOrphan HashTree
    HashTree testPlanTree = new HashTree();

    // HTTP Sampler
    HTTPSampler httpSampler = new HTTPSampler();
    httpSampler.setDomain("localhost");
    httpSampler.setPort(8405);
    httpSampler.setPath("/some_path");
    httpSampler.setMethod("GET");

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

    // Thread Group
    ThreadGroup threadGroup = new ThreadGroup();
    threadGroup.setNumThreads(1);
    threadGroup.setRampUp(1);
    threadGroup.setSamplerController(loopController);

    // Test Plan
    TestPlan testPlan = new TestPlan("Create JMeter Script From Java Code");

    // Construct Test Plan from previously initialized elements
    testPlanTree.add("testPlan", testPlan);
    testPlanTree.add("loopController", loopController);
    testPlanTree.add("threadGroup", threadGroup);
    testPlanTree.add("httpSampler", httpSampler);

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

}

Что теперь происходит, так это работает нормально, но конечная точка API не получает удар. Я отладил это, и конфигурация Jmeter выглядит отлично. Вывод, который я получаю, упомянут ниже:

2020-04-10 01:11:36 [main] WARN  JMeterUtils:732 - Exception 'null' occurred when fetching boolean property:'server.exitaftertest', defaulting to: false
2020-04-10 01:11:36 [main] WARN  JMeterUtils:732 - Exception 'null' occurred when fetching boolean property:'jmeterengine.remote.system.exit', defaulting to: false
2020-04-10 01:11:36 [main] WARN  JMeterUtils:732 - Exception 'null' occurred when fetching boolean property:'jmeterengine.stopfail.system.exit', defaulting to: true
2020-04-10 01:11:36 [main] WARN  JMeterUtils:732 - Exception 'null' occurred when fetching boolean property:'jmeterengine.force.system.exit', defaulting to: false
2020-04-10 01:11:36 [main] INFO  JMeterUtils:365 - Setting Locale to en_IN
2020-04-10 01:11:36 [main] INFO  HTTPSamplerBase:1465 - Parser for text/html is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser
2020-04-10 01:11:36 [main] INFO  HTTPSamplerBase:1465 - Parser for application/xhtml+xml is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser
2020-04-10 01:11:36 [main] INFO  HTTPSamplerBase:1465 - Parser for application/xml is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser
2020-04-10 01:11:36 [main] INFO  HTTPSamplerBase:1465 - Parser for text/xml is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser
2020-04-10 01:11:36 [main] INFO  HTTPSamplerBase:1465 - Parser for text/vnd.wap.wml is org.apache.jmeter.protocol.http.parser.RegexpHTMLParser
2020-04-10 01:11:36 [main] INFO  HTTPSamplerBase:1465 - Parser for text/css is org.apache.jmeter.protocol.http.parser.CssParser
2020-04-10 01:11:36 [main] INFO  HTTPJavaImpl:71 - Maximum connection retries = 0
2020-04-10 01:11:36 [main] INFO  StandardJMeterEngine:351 - Running the test!
2020-04-10 01:11:36 [main] INFO  SampleEvent:64 - List of sample_variables: []
2020-04-10 01:11:36 [main] INFO  SampleEvent:64 - List of sample_variables: []
2020-04-10 01:11:36 [main] INFO  CompoundVariable:66 - Note: Function class names must contain the string: '.functions.'
2020-04-10 01:11:36 [main] INFO  CompoundVariable:69 - Note: Function class names must not contain the string: '.gui.'
2020-04-10 01:11:36 [main] WARN  CompoundVariable:83 - Did not find any functions
2020-04-10 01:11:36 [main] INFO  StandardJMeterEngine:450 - Starting ThreadGroup: 1 : 
2020-04-10 01:11:36 [main] INFO  StandardJMeterEngine:510 - Starting 1 threads for group .
2020-04-10 01:11:36 [main] INFO  StandardJMeterEngine:520 - Thread will continue on error
2020-04-10 01:11:36 [main] INFO  ThreadGroup:220 - Starting thread group... number=1 threads=1 ramp-up=1 delayedStart=false
2020-04-10 01:11:36 [main] INFO  ThreadGroup:246 - Started thread group number 1
2020-04-10 01:11:36 [main] INFO  StandardJMeterEngine:461 - All thread groups have been started
2020-04-10 01:11:36 [ 1-1] INFO  JMeterThread:711 - Thread started:  1-1
2020-04-10 01:11:36 [ 1-1] INFO  JMeterThread:299 - Thread is done:  1-1
2020-04-10 01:11:36 [ 1-1] INFO  JMeterThread:328 - Thread finished:  1-1
2020-04-10 01:11:36 [main] INFO  StandardJMeterEngine:214 - Notifying test listeners of end of test
2020-04-10 01:11:36 [main] INFO  FileServer:87 - Default base='/Users/somepath'

Я сделал свою долю в поиске и попробовал много предложений, упомянутых в различных ссылках, таких как: Код API JMeter для запуска HttpSampler не работает

Но, похоже, это не решает и не решает мою проблему.

Я новичок в этом Jmeter, поэтому любая помощь будет приветствоваться. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 13 апреля 2020
  1. Ваш способ добавления элементов теста в план тестирования неверен, вам нужно изменить его на следующее:

    testPlanTree.add(testPlan);
    HashTree threadGroupHashTree = testPlanTree.add(testPlan, threadGroup);
    threadGroupHashTree.add(httpSampler);
    
  2. Похоже, вы нигде не храните свои результаты, было бы неплохо сохранить их в .jtl файле результатов для последующего анализа, например:

    Summariser summer = null;
    String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary");
    if (summariserName.length() > 0) {
        summer = new Summariser(summariserName);
    }
    
    String logFile = "/Users/something/apache-jmeter-5.2.1/bin/result.jtl";
    ResultCollector logger = new ResultCollector(summer);
    logger.setFilename(logFile);
    testPlanTree.add(testPlanTree.getArray()[0], logger);
    
  3. Наличие тестируемого приложения и JMeter на одной машине - не лучшая идея, поскольку вы не получите надежных результатов тестирования, подумайте о запуске JMeter с другого хоста. Также было бы неплохо отслеживать основные показатели работоспособности ОС, такие как ЦП, ОЗУ, сетевой и дисковый ввод-вывод и т. Д. c. как на JMeter, так и на тестируемой системе, это можно сделать с помощью JMeter PerfMon Plugin

Полный код на всякий случай:

public static void main(String[] args) throws IOException {
    //JMeter Engine
    StandardJMeterEngine jmeter = new StandardJMeterEngine();

    //JMeter initialization (properties, log levels, locale, etc)
    JMeterUtils.loadJMeterProperties("/Users/something/apache-jmeter-5.2.1/bin/jmeter.properties");
    JMeterUtils.initLogging();// you can comment this line out to see extra log messages of i.e. DEBUG level
    JMeterUtils.initLocale();

    // JMeter Test Plan, basic all u JOrphan HashTree
    HashTree testPlanTree = new HashTree();

    // HTTP Sampler
    HTTPSampler httpSampler = new HTTPSampler();
    httpSampler.setDomain("localhost");
    httpSampler.setPort(8405);
    httpSampler.setPath("/some_path");
    httpSampler.setMethod("GET");
    httpSampler.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName());
    httpSampler.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName());

    // Loop Controller
    LoopController loopController = new LoopController();
    loopController.setLoops(1);
    loopController.addTestElement(httpSampler);
    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.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());

    SaveService.saveTree(testPlanTree, new FileOutputStream("/Users/something/apache-jmeter-5.2.1/bin/test.jmx"));

    Summariser summer = null;
    String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary");
    if (summariserName.length() > 0) {
        summer = new Summariser(summariserName);
    }

    String logFile = "/Users/something/apache-jmeter-5.2.1/bin/result.jtl";
    ResultCollector logger = new ResultCollector(summer);
    logger.setFilename(logFile);
    testPlanTree.add(testPlanTree.getArray()[0], logger);

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

    // Run Test Plan
    jmeter.configure(testPlanTree);
    jmeter.run();
}
0 голосов
/ 14 апреля 2020

Я нашел проблему. При передаче параметров в интерфейс могут быть переданы только параметры типа String, а параметры типа Int не могут быть переданы. Как это сделать?

 public static HTTPSamplerProxy createHTTPSamplerProxy() {
        HeaderManager headerManager = new HeaderManager();
        headerManager.setProperty("Content-Type", "multipart/form-data");
        headerManager.add(new Header("token","****"));

        HTTPSamplerProxy httpSamplerProxy = new HTTPSamplerProxy();
        httpSamplerProxy.setHeaderManager(headerManager);
        httpSamplerProxy.setDomain("localhost");
        httpSamplerProxy.setPort(7081);
        httpSamplerProxy.setPath("/somepath");
        httpSamplerProxy.setMethod("GET");
        httpSamplerProxy.setConnectTimeout("5000");
        Arguments arguments = new Arguments();
        httpSamplerProxy.addNonEncodedArgument("page","1","1");
        httpSamplerProxy.addNonEncodedArgument("pageNum","1","1");
        httpSamplerProxy.setUseKeepAlive(true);
        httpSamplerProxy.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName());
        httpSamplerProxy.setHeaderManager(headerManager);
        return httpSamplerProxy;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...