【问题标题】:Parallel execution of Samplers in JMeter with different URL parameters使用不同的 URL 参数在 JMeter 中并行执行采样器
【发布时间】:2019-11-27 17:01:12
【问题描述】:

在 JMeter 中有一个“ForEach”控制器,它接受一个项目数组并对每个项目执行一个采样器。当您需要根据先前请求中收到的数据执行具有不同参数的采样器时,这非常有用。但是,“ForEach”控制器一个接一个地运行采样器。

我正在寻找的是并行执行样本。 JMeter 中有一个名为“bzm - Parallel Controller”的插件。但是,这不接受像“ForEach”控制器那样的任何输入变量。

例如,我在数据库中有以下数据。作者和他们的书。

[
    	{
    		"firstName": "William",
    		"lastName":"Shakespeare",
    		"Title": "Mr",
    		"id": "1",
    		"books": [
    			{
    				"id": "WS1",
    				"title": "King John",
    				"year":"1596"
    			},
    			{
    				"id": "WS2",
    				"title": "Julius Caesar",
    				"year": "1599"
    			},
    			{
    				"id": "WS3",
    				"title": "Romeo and Juliet",
    				"year": "1595"
    			}
    		],
    		"Nationality": "English"
    	},
    	{
    		"firstName": "Sidney",
    		"lastName":"Sheldon",
    		"Title": "Mr",
    		"id": "2",
    		"books": [
    			{
    				"id": "SS1",
    				"title": "The Naked Face",
    				"year":"1969"
    			},
    			{
    				"id": "SS2",
    				"title": "A Stranger in the Mirror",
    				"year": "1976"
    			},
    			{
    				"id": "SS3",
    				"title": "Bloodline",
    				"year": "1977"
    			}
    		],
    		"Nationality": "American"
    	},
    	{
    		
    		"firstName": "Eiichiro",
    		"lastName":"Oda",
    		"Title": "Mr",
    		"id": "3",
    		"books": [
    			{
    				"id": "EO1",
    				"title": "Wanted",
    				"year":"1992"
    			},
    			{
    				"id": "EO2",
    				"title": "Ikki Yako",
    				"year": "1993"
    			},
    			{
    				"id": "EO3",
    				"title": "Monsters",
    				"year": "1994"
    			}
    
    		],
    		"Nationality": "Japanese"
    	}
    ]

在我的 JMeter 测试计划中,我定义了一个 CSV 数据集配置文件来存储我系统中所有作者的 ID。 然后,有一个线程组。在线程组中,我有一个 HTTP 采样器,GET /authors/{id}/books。例如 GET /authors/1/books。这将获得作者“William Shakespeare”所写的所有书籍。

使用 JSON Extractor,我可以捕获由 GET /authors/{id}/books 返回的图书 ID 数组。

有 3 本书的 ID 为 WS1、WS2 和 WS3。现在对于每本书,我都需要运行另一个 HTTP 采样器

PUT /books/WS1 放置/书籍/WS2 放置/书籍/WS3。

当我使用 ForEach 控制器时,我可以指定从之前的 JSON 提取器捕获的输入变量。它循环遍历每个 PUT 请求,针对每个书本 id。我想做同样的事情,但在 PARALLEL 中,而不是顺序。

有谁知道如何做到这一点?或者我们必须为此编写自定义 groovy/BeanShell 脚本?如果自定义 Groovy/BeanShell 脚本是唯一的方法,你能告诉我怎么写吗

非常感谢

【问题讨论】:

    标签: jmeter jmeter-plugins


    【解决方案1】:

    您可以通过将每个测试放在单独的线程组中来做到这一点。

    您在主测试计划中有一个标志,用于控制线程是并行执行还是连续执行。

    【讨论】:

    • 我的要求不同。我已经编辑了我的问题,添加了更多细节。
    【解决方案2】:

    您使用的测试元素不是很正确,请考虑改用Parallel Sampler

    假设你有以下JMeter Variables

    book_1=WS1
    book_2=WS2
    book_3=WS3
    book_matchNr=3
    

    您可以添加 Parallel Sampler 并将其配置为点击包含 ${book_1}${book_2}${book_3} 的 URL

    所有URLs to Retrieve都会并行执行:

    更多信息:How to Use the Parallel Controller in JMeter

    【讨论】:

    • 您提供的解决方案适用于书籍数量不变的情况,在本例中为 3。在我的数据中,这个数字各不相同,从 0 开始。那么如何将 URL 动态添加到 Parallel Sampler
    【解决方案3】:

    您可以将 URL 动态添加到 并行 HTTP 请求采样器

    1. 像孩子一样将 JSR223 PreProcessor 添加到 Parallel HTTP Requests sampler
    2. 在脚本区域添加类似的内容:
    String url = "https://examle.url.com/?book=";
    
    1.upto(vars.get('book_matchNr') as int, { 
        index -> {
            sampler.addURL(url + vars.get('book_' + index))
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多