【问题标题】:JMeter - How to execute list of Http requests and collect results statisticsJMeter - 如何执行 Http 请求列表并收集结果统计信息
【发布时间】:2017-02-01 13:33:15
【问题描述】:

我需要按顺序执行 Http 请求列表并收集每个请求的结果/统计信息。映射将请求开始时间作为键,将请求对象作为值。

我可以分三步完成:

  1. 使用 Oracle 表中显示的请求基础详细信息构建结果集
  2. 迭代结果集。

    2a) 获取每条记录,创建包含详细信息的请求对象,并构建一个以请求开始时间为键、请求对象为值的映射。

    2b) 使用请求对象数据形成 SOAP 请求 XML 消息并将其作为值添加到 HttpArguement

    2c) 创建JMeter测试计划,配置JMeter,执行计划并收集结果

    2d) 根据请求之间的请求开始时间计算延迟时间,并将运行线程设置为休眠状态

  3. 最后,服务在执行完所有记录后终止。

现在,我可以成功执行测试了。但是,我不确定这是正确的方法。请检查一下,如果我错了,请告诉我。

另外,现在我正在获取编码后的单个请求的结果摘要。但是,我喜欢在执行所有请求后获取累积统计信息。怎么做?请指导我。

完整代码如下:

// Build the result set [baseReqRecords] of request details from the database

while (baseReqRecords.next()) {
    // Get the request details
    // Get the start time

    long delay = 0;

    if (previousRequestStartTime != null) {
        delay = ((requestStartTime.getTime() - previousRequestStartTime
                .getTime()));
    }

    HTTPSamplerProxy httpSampler = new HTTPSamplerProxy();
    httpSampler.setName("SOAP Request");
    httpSampler.setEnabled(true);
    httpSampler.setPostBodyRaw(true);

    HTTPArgument httpArgument = new HTTPArgument();
    httpArgument.setAlwaysEncoded(false);
    httpArgument.setMetaData("=");

    if (operationsMap.get(reqOperation).equals(
            <<DESIRED_OPERATION>>)) {
        // build the request context object from the request details
        httpArgument.setValue(<<SOAP MESSAGE>>);
    }

    Arguments arguments = new Arguments();
    arguments.addArgument(httpArgument);

    System.out.println("HTTP Argument value: "
            + httpArgument.getValue());

    HeaderManager headerManager = new HeaderManager();
    headerManager.add(new Header("<<SM_USER>>",
            "<<value>>"));
    headerManager.add(new Header("Content-Type",
            "text/xml; charset=utf-8"));
    headerManager
            .add(new Header(
                    "SOAPAction",
                    "<<ACTION_URL>>"));
    headerManager.setName(JMeterUtils
            .getResString("header_manager_title"));
    headerManager.setProperty(TestElement.GUI_CLASS,
            HeaderPanel.class.getName());
    headerManager.setProperty(TestElement.TEST_CLASS,
            HeaderManager.class.getName());

    System.out.println("Headers: " + headerManager.getHeaders());

    httpSampler.setArguments(arguments);
    httpSampler.setDomain("<<SERVER>>");
    httpSampler.setPort(<<PORT>>);
    httpSampler
            .setPath("<<PATH>>");
    httpSampler.setMethod("POST");
    httpSampler.setName("Sampler");
    httpSampler.setFollowRedirects(true);
    httpSampler.setAutoRedirects(false);
    httpSampler.setUseKeepAlive(true);
    httpSampler.setDoMultipartPost(false);
    httpSampler.setMonitor(false);
    httpSampler.setProperty(TestElement.GUI_CLASS,
            HttpTestSampleGui.class.getName());
    httpSampler.setProperty(TestElement.TEST_CLASS,
            HTTPSamplerProxy.class.getName());

    LoopController loopController = new LoopController();
    loopController.setEnabled(true);
    loopController.setFirst(true);
    loopController.setContinueForever(false);
    loopController.setLoops(1);
    loopController.setProperty(TestElement.GUI_CLASS,
            LoopControlPanel.class.getName());
    loopController.setProperty(TestElement.TEST_CLASS,
            LoopController.class.getName());
    loopController.initialize();

    ThreadGroup threadGroup = new ThreadGroup();
    threadGroup.setNumThreads(1);
    threadGroup.setRampUp(1);
    threadGroup.setScheduler(false);
    threadGroup.setSamplerController(loopController);
    threadGroup.setEnabled(true);
    threadGroup.setProperty(TestElement.GUI_CLASS,
            ThreadGroupGui.class.getName());
    threadGroup.setProperty(TestElement.TEST_CLASS,
            ThreadGroup.class.getName());

    TestPlan testPlan = new TestPlan(
            "Test Plan");
    testPlan.setComment("Service Operations Test Plan");
    testPlan.setFunctionalMode(false);
    testPlan.setSerialized(false);
    testPlan.setUserDefinedVariables((Arguments) new ArgumentsPanel()
            .createTestElement());
    testPlan.setProperty(TestElement.GUI_CLASS,
            TestPlanGui.class.getName());
    testPlan.setProperty(TestElement.TEST_CLASS,
            TestPlan.class.getName());

    HashTree testPlanTree = new HashTree();

    HashTree samplerTree = new HashTree();
    samplerTree.add(httpSampler, headerManager);

    testPlanTree.add(testPlan);
    HashTree threadGroupHashTree = testPlanTree.add(testPlan,
            threadGroup);
    threadGroupHashTree.add(samplerTree);

    SaveService.saveTree(testPlanTree, new FileOutputStream(
            "jmeter_api.jmx"));

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

    String reportFile = "report.jtl";
    ResultCollector logger = new ResultCollector(summary);
    logger.setFilename(reportFile);
    testPlanTree.add(testPlanTree.getArray()[0], logger);

    jmeter.configure(testPlanTree);

    previousRequestStartTime = requestStartTime;
    jmeter.run();

    System.out.println("delay = " + delay);

    Thread.sleep(delay);
}

假设结果集中有 5 条请求详情记录。请求开始时间差为 60 秒。现在,我执行后收到如下结果:

summary =      1 in 00:00:01 =    0.9/s Avg:  1002 Min:  1002 Max:  1002 Err:     0 (0.00%)
delay = 0
summary =      1 in 00:00:01 =    1.1/s Avg:   850 Min:   850 Max:   850 Err:     0 (0.00%)
delay = 60000
summary =      1 in 00:00:01 =    1.5/s Avg:   612 Min:   612 Max:   612 Err:     0 (0.00%)
delay = 60000
summary =      1 in 00:00:01 =    1.1/s Avg:   859 Min:   859 Max:   859 Err:     0 (0.00%)
delay = 60000
summary =      1 in 00:00:01 =    1.1/s Avg:   849 Min:   849 Max:   849 Err:     0 (0.00%)

【问题讨论】:

    标签: jmeter


    【解决方案1】:

    统计信息写入report.jtl文件,您可以使用您选择的Listener打开它,即Aggregate Report并查看请求摘要。您还可以使用 report.jtl 文件构建一个 HTML Reporting Dashboard,例如:

    jmeter -g report.jtl -o /path/to/report/folder
    

    我建议为您的请求使用不同的标签,因为它们都有SOAP Request 名称,因此无法在最终报告中区分它们。

    其实你甚至不需要Java API,你可以使用JDBC Request sampler从Oracle获取请求数据,使用ForEach Controller迭代结果集。

    【讨论】:

    • 再次感谢 Dmitri 的回答。
    • 我不会定期向数据库发送任何查询。例如,对每个样本进行数据库更新/插入。我真的需要在这里使用 JDBC 请求采样器吗?
    猜你喜欢
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    相关资源
    最近更新 更多