JMeter - 如何执行Http请求列表并收集结果统计信息

时间:2017-02-01 13:33:16

标签: jmeter

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

我可以分三步完成:

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

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

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

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

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

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

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

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

    完整的代码如下:

    // 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%)
    

1 个答案:

答案 0 :(得分:0)

统计信息已写入report.jtl文件,您可以使用自己选择的Listener打开它,即Aggregate Report并查看请求摘要。您还可以使用jmeter -g report.jtl -o /path/to/report/folder 文件构建HTML Reporting Dashboard,例如:

SOAP Request

我建议为您的请求使用不同的标签,因为它们都有 @echo off Setlocal EnableDelayedExpansion set /p anzahl=0952-8873 curl https://thekeepers.org/journals?query=%anzahl% >>thekeepers.xml pause 名称,因此无法在最终报告中区分它们。

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