使用JMeterAPI从Java创建具有多个HTTPSampler的JMeter测试

使用JMeterAPI从Java创建具有多个HTTPSampler的JMeter测试,java,jmeter,Java,Jmeter,我试图用RESTAPI和提供的文档复制一个应用程序场景,其中用户登录(请求oauth认证)并请求基本信息。 我开始使用jmeter gui,并使该部分运行良好(记录并获取所需信息),如下所示: 但现在我需要用jmeter的api从java上实现这一点,这就是我迷路的地方,因为除了blazemeter.com发布Parragraph4.3之外,没有太多信息,特别是这是我的出发点,我的代码与它非常相似,所以我将使用它作为我迄今为止所做工作的示例 // HTTP Sampler 1 HTTPSamp

我试图用RESTAPI和提供的文档复制一个应用程序场景,其中用户登录(请求oauth认证)并请求基本信息。 我开始使用jmeter gui,并使该部分运行良好(记录并获取所需信息),如下所示:

但现在我需要用jmeter的api从java上实现这一点,这就是我迷路的地方,因为除了blazemeter.com发布Parragraph4.3之外,没有太多信息,特别是这是我的出发点,我的代码与它非常相似,所以我将使用它作为我迄今为止所做工作的示例

// HTTP Sampler 1
HTTPSampler httpSampler1 = new HTTPSampler();
httpSampler.setDomain("example1.com");
httpSampler.setPort(80);
httpSampler.setPath("/");
httpSampler.setMethod("GET");
RegexExtractor regex1=new RegexExtractor();
regex1.setRegex("regex1");
regex1.setRefName("REGEX1");
regex1.setTemplate("$1$");
regex1.setMatchNumber("0");
regex1.setDefaultValue("false");
regex1.useHeaders();

// HTTP Sampler 2
HTTPSampler httpSampler2 = new HTTPSampler();
httpSampler2.setDomain("example.com");
httpSampler2.setPort(80);
httpSampler2.setPath("/2");
httpSampler2.setMethod("GET");
RegexExtractor regex2=new RegexExtractor();
regex2.setRegex("regex2");
regex2.setRefName("REGEX2");
regex2.setTemplate("$1$");
regex2.setMatchNumber("0");
regex2.setDefaultValue("false");
regex2.useHeaders();

// HTTP Sampler 3
HTTPSampler httpSampler3 = new HTTPSampler();
httpSampler3.setDomain("example.com");
httpSampler3.setPort(80);
httpSampler3.setPath("/3");
httpSampler3.setMethod("GET");
RegexExtractor regex3=new RegexExtractor();
regex3.setRegex("regex3");
regex3.setRefName("REGEX3");
regex3.setTemplate("$1$");
regex3.setMatchNumber("0");
regex3.setDefaultValue("false");
regex3.useHeaders();

// Loop Controller
LoopController loopController = new LoopController();
loopController.setLoops(1);
loopController.addTestElement(httpSampler1);
loopController.addTestElement(httpSampler2);
loopController.addTestElement(httpSampler3);
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("httpSampler1", httpSampler1);
testPlanTree.add("httpSampler2", httpSampler2);
testPlanTree.add("httpSampler3", httpSampler3);

// Run Test Plan
jmeter.configure(testPlanTree);
jmeter.run();
几乎相同,我假设必须将元素添加到同一个LoopController中,以模拟从url到url的用户和相同的线程组(因为它们代表一个用户),还假设必须将它们添加到testPlanTree中

当我像上面一样运行它时,只执行了采样器3(我正在与wireshark进行检查),在尝试运行采样器1和采样器2并且只执行了采样器1之后,这种行为让我不知所措。我对部分进行了注释,并一次执行一个,它们确实执行了请求#2和#3。除了返回错误代码之外,它们不会做更多的事情,因为它们需要来自上一次rest调用的信息,并且它们不能一起工作

我花了一些时间阅读文档,但很难破译,谷歌也没能帮我找到与我想做的类似的例子


在过去的两天里,我一直与这些人在一起,感到很沮丧,欢迎任何帮助

执行以下更改:

  • 将采样器添加为LoopController的子元素,而不是将其添加到TestPlan元素
  • 将loopController添加为线程组的子级
  • 将线程组添加为测试计划的子级
或者,尝试使用此库:

使用Maven,添加到pom.xml:

<dependency>
   <groupId>us.abstracta.jmeter</groupId>
   <projectId>jmeter-java-dsl</projectId>
   <version>0.1</version>
 </dependency>

请注意链接上的所有注释,它们说4.3中的代码不起作用?用java编写jmeter非常高级,您需要首先正确理解测试计划层次结构。上面的代码(以及链接页面上的代码)似乎向测试计划根目录添加了无效的元素。它开始建立一个等级制度,然后似乎以某种奇怪的方式把它一扫而光。不确定这将在哪个版本的JMeter上成功运行。您的原始测试计划和java代码版本没有任何共同之处。至少尝试使用不同的方法创建类似的测试计划,并表明您已经了解其中之一。现在的问题意味着你在jmeter和java方面都是初学者,那么你为什么要学习如何将一个转换成另一个呢?@CharlieS是的,我在这两个方面都是初学者,并决定尝试一下,尽管评论、工作中的其他年轻人和我都需要学习这一点。正如我现在所了解的,我用所有的采样器创建了线程组,因为我们想依次模拟这些步骤,regexExtractor是后处理器,所以每个采样器都有预期响应的正则表达式,到目前为止,我认为我知道它是相似的,请告诉我你认为它不是什么。任何输入都被很好地接收,如果您知道另一组示例/文档新手友好与否,我都知道您的第一个测试计划没有循环控制器,但是java代码基于循环控制器。你认为他们有什么相似之处?尝试将jmeter测试计划转换为java,或者尝试将java编写为jmeter测试计划。你需要先从原则上理解其中一个,但你只是在猜测。
 import static org.assertj.core.api.Assertions.assertThat;
 import static us.abstracta.jmeter.javadsl.JmeterDsl.*;

 import java.time.Duration;
 import org.eclipse.jetty.http.MimeTypes.Type;
 import org.junit.jupiter.api.Test;
 import us.abstracta.jmeter.javadsl.TestPlanStats;

 public class PerformanceTest {

   @Test
   public void testPerformance() throws IOException {
     TestPlanStats stats = testPlan(
        threadGroup(2, 10,
        httpSampler("http://my.service")
           .post("{\"name\": \"test\"}", Type.APPLICATION_JSON)
     ),
      //this is just to log details of each request stats
     jtlWriter("test.jtl")
     ).run();
              assertThat(stats.overall().elapsedTimePercentile99()).isLessThan(Duration.ofSeconds(5));
  }

 }