HowtoUsetheParallelControllerinJMeter在这篇文章中我们将分析ApacheJMeter?的扩展之一-并行控制器(ParallelController)。该控制器由BlazeMeter开发,作为AndreyPokhilko和ArtemFedorov对开源社区的贡献。并行控制器可用于创建并行请求。并行请求是不是一个接一个地执行而是同时执行的请求。例如,处理AJAX请求或在加载脚本中执行其他同步操作。您可以使用JMeter插件管理器安装并行控制器。它被称为并行控制器和采样器。我们还需要一个DummySampler和一个WebSocket插件用于此演示,您也可以在JMeter插件管理器中找到它们。我们将使用PeterDoornbosch的WebsocketSamplers。我们现在将通过几个例子来了解并行控制器的特性。让我们从一个简单的例子开始。使用并行控制器-一个简单示例首先,让我们将控制器添加到测试计划中。添加线程组后:右键线程组->添加->逻辑控制器->bzm-parallelcontroller也在控制器内部添加两个DummySampler,并应用相同的特性。右键点击ParallelController->Add->Samplers->jp@gcDummySamplerrequiressamplertosimulatesendingHTTPrequest。您可以根据需要添加任意数量的采样器。现在脚本看起来像这样:运行这个测试。从上面的截图可以看出,两个请求的开始时间是一样的。这意味着请求是同时发送的。第一个重要提示:如果你打开控制台,你会看到运行的线程数已经变成了2。也就是说,这个控制器创建了两个线程并发运行。使用并行控制器-具有多个元素如果您有多个采样器需要在一个线程中工作,您需要将它们逻辑地组合起来。否则,并行控制器会为其每个子线程创建新线程。例如,您可以使用简单控制器。添加:右击ThreadGroup->Add->LogicalControllers->SimpleController现在,将要组合的元素放在这个控制器下。现在并行控制器将创建2个线程:第一个线程用于Dummy1和Dummy2(在第一个简单控制器下),第二个线程用于Dummy3和Dummy4(在第二个简单控制器下)。另外我们在ParallelController后面添加了Dummy5,它会在这两组执行完之后执行。Dummy1和2的开始时间不同,Dummy5仅在Dummy4执行后执行。第二个重要注意事项:测试的下一部分将在所有并行线程完成工作后才会开始。同时运行线程——问题首先要注意的是,控制器创建单独的线程并并行执行它们。因此,在线程内相互交互的采样器可能会出现问题。为了演示,我们将使用WebSocket插件。这个插件有一组采样器,可以通过线程内的WebSocket会话连接。如果session是在Parallelcontroller之前创建的,而samplergroup的工作是在controller内部进行的,我们就会报错。此错误表明与WSSampler(控制器内部)的连接不存在。您可以在下面的屏幕截图中看到这一点。同时运行线程——解决方案如果测试计划中有相关元素,它们应该都放在并行控制器中。在继续测试之前运行所有并行控制器元素-问题第二个注意事项是,在所有并行线程完成其工作之前,测试的下一部分不会开始。我遇到过一个场景,用户通过HTTP请求获取大量数据,并在一段时间内通过网络套接字接收信息。当时间用完时,脚本说他应该转到下一页。这部分测试如下。在测试中,时间用完后转到的页面称为“LastRequest”。问题是接收消息的线程确实在时间用完时退出,但是接收数据的线程直到接收到所有数据才结束运行。所以在数据加载完成之前,线程不会继续下一步。但这种行为是错误的。也就是说,第二个线程的执行需要在并行线程完成后以某种方式被中断。在继续测试之前运行所有并行控制器元素-解决方案一些采样器有一个超时字段。在我的例子中,我使用了HTTP请求采样器,它有一个连接超时字段。这意味着在指定时间之后,采样器将完成其工作。但是这个解决方案太狭窄了。另一种解决方案如下。假设您有不同的情况,并且在两个线程中,您有一组在循环中执行的请求。一个线程在收到某个消息后结束,第二个线程不知道该消息。第二个应该在最后一次迭代之后完成,您可以使用Groovy或BeanShell采样器通过设置必要的变量值来完成此操作。例如,使用vars.put("isEnd","true")命令变量和'isEnd'以获得'true'值。情况将是这样的:这里我们有两个并行线程:第一个线程有一个While控制器,第二个线程有一个Loop控制器(这个控制器取代了消息接收)。在第二个线程中,在Loop控制器之后,您使用Groovy或BeanShell采样器设置值。在第一个线程中,您在While控制器的条件下检查此变量的值,例如,使用以下条件:${__jexl3("${isEnd}"=="true")}。Don’tRunaParallelControllerinaParallelController还有一个无法解决的问题:你不能在一个并行控制器里面添加一个并行控制器。执行时会出现错误。不要那样做。ParallelSamplerParallelSampler是控制器的轻量级版本,用于创建Ajax请求或其他并行HTTP请求。Sampler有一个简单的界面,如下面的屏幕截图所示。您只需输入所有并行URL。在处理完所有引用之前,采样器不会完成执行。但是如果您想将它用于并行站点页面,请记住采样器还将执行站点页面上的所有链接。总结综上所述,ParallelController是一个很好的请求并行控制器,对于测试具有并行操作的站点非常有用。例如,在处理WebSocket请求或测试移动应用时,可能会出现大量并行请求(如心跳请求)。除了controller,我们还有ParallelSampler,可以用来创建并行的HTTP请求,大大方便了脚本结构,非常适合并行的Ajax请求。更多Jerry原创文章在这里:《王子熙》:
