Java JMeter:对HTTP POST进行负载测试,然后执行HTTP GET

Java JMeter:对HTTP POST进行负载测试,然后执行HTTP GET,java,junit,jmeter,load-testing,Java,Junit,Jmeter,Load Testing,我正在评估我的传输库的性能,如果我得到以下方面的建议,将会很有帮助: 我使用Junit采样器执行以下操作: HTTP POST测试:我发送HTTP POST请求:这将导致DB写入。我必须对POST+DB_写入操作的所有参数(吞吐量、平均响应时间)进行全面评估。作为对这个POST请求的响应,我得到了一个唯一的id。因此,如果我发送了1000个成功的POST请求,我将拥有1000个唯一的id 现在我的问题是如何在下一个测试用例中使用这些唯一ID,对每个创建的唯一ID执行HTTP GET 我可以解析H

我正在评估我的传输库的性能,如果我得到以下方面的建议,将会很有帮助:

我使用Junit采样器执行以下操作:

HTTP POST测试:我发送HTTP POST请求:这将导致DB写入。我必须对POST+DB_写入操作的所有参数(吞吐量、平均响应时间)进行全面评估。作为对这个POST请求的响应,我得到了一个唯一的id。因此,如果我发送了1000个成功的POST请求,我将拥有1000个唯一的id

现在我的问题是如何在下一个测试用例中使用这些唯一ID,对每个创建的唯一ID执行HTTP GET

我可以解析HTTPPOST响应并将唯一id写入文件,然后尝试将该文件用于HTTP GET测试。但问题是,如果我创建一个由10个不同线程组成的线程组,那么在文件写入时就会出现同步问题


是否有任何后处理器可用于在文件系统中记录结果?

同步不会有任何问题(它们由文件系统解决)。在每个线程(即POST)中,您都应该打开文件进行写入,并在其中添加一行新行。同样,不要担心同步,操作系统会处理它。

同步不会有任何问题(它们由文件系统解决)。在每个线程(即POST)中,您都应该打开文件进行写入,并在其中添加一行新行。同样,不要担心同步问题,操作系统会处理它。

对于我来说,您可以避免使用文件存储然后读取生成的id

逻辑如下:

  • 执行您的POST请求
  • 解析POST返回的响应-使用正则表达式提取器或任何其他附加到请求的方法-提取您的ID
  • 将提取的ID存储在用户唯一/线程唯一变量中-在同一个后处理器中;
    如何为正则表达式提取器执行此操作,请参见下文:
    ${uuuu javaScript('${username}'+'UnicID')}
    为每个用户/线程生成唯一变量,以避免多用户情况下的干扰;
    似乎还可以使用函数代替${username}变量
  • 如果POST请求成功完成,则提取ID并存储在变量-execute您的GET请求被提取ID用作参数;
    使用
    ${uu V(${username}UnicID)}
    构造返回以前保存的ID
  • 您还可以添加到请求后采样器,以监视生成的变量及其值

    看来就这些了

    
    线程组
    线程数=X
    循环计数=N
    . . .
    HTTP请求POST
    检查返回代码//响应断言
    extractUniqueID//正则表达式提取器(例如)
    引用名称=${uuu javaScript('${username}'+'UnicID')}
    正则表达式=。。。
    模板=$1$
    匹配号=1
    默认值=未找到
    如果控制器//仅在POST成功时执行GET
    Condition=${JMeterThread.last_sample_ok}//您可以更改此条件以验证提取ID的变量不是空的
    HTTP请求获取
    param=${uu V(${username}UnicID)}
    . . .
    


    希望这会有所帮助。

    对于我来说,您可以避免使用文件来存储然后读取生成的id

    逻辑如下:

  • 执行您的POST请求
  • 解析POST返回的响应-使用正则表达式提取器或任何其他附加到请求的方法-提取您的ID
  • 将提取的ID存储在用户唯一/线程唯一变量中-在同一个后处理器中;
    如何为正则表达式提取器执行此操作,请参见下文:
    ${uuuu javaScript('${username}'+'UnicID')}
    为每个用户/线程生成唯一变量,以避免多用户情况下的干扰;
    似乎还可以使用函数代替${username}变量
  • 如果POST请求成功完成,则提取ID并存储在变量-execute您的GET请求被提取ID用作参数;
    使用
    ${uu V(${username}UnicID)}
    构造返回以前保存的ID
  • 您还可以添加到请求后采样器,以监视生成的变量及其值

    看来就这些了

    
    线程组
    线程数=X
    循环计数=N
    . . .
    HTTP请求POST
    检查返回代码//响应断言
    extractUniqueID//正则表达式提取器(例如)
    引用名称=${uuu javaScript('${username}'+'UnicID')}
    正则表达式=。。。
    模板=$1$
    匹配号=1
    默认值=未找到
    如果控制器//仅在POST成功时执行GET
    Condition=${JMeterThread.last_sample_ok}//您可以更改此条件以验证提取ID的变量不是空的
    HTTP请求获取
    param=${uu V(${username}UnicID)}
    . . .
    


    希望这会有所帮助。

    感谢您的详细回复。但还有一个问题,如果我理解正确的话,一个测试将执行HTTP POST,然后立即执行HTTP GET,对吗?但我想分别衡量一堆帖子和一堆帖子,还是我理解了你说的不对?@Prasanna。所有的统计数据和特征都将被测量为执行POST和GET请求,而不管您是在同一个线程组中还是在不同的线程组中逐个运行它们,甚至是在不同的jmx文件中。因此,如果您将侦听器附加到脚本以获取请求特征,那么您将分别看到POST和get的测量结果,即使它们逐个在同一线程组中执行,也会看到 Thread Group Number of Threads = X Loop Count = N . . . HTTP Request POST checkingReturnCode // Response Assertion extractUniqueID // Regular Expression Extractor (e.g.) Reference Name = ${__javaScript('${username}'+'UnicID')} Regular Expression = ... Template = $1$ Match No. = 1 Default Value = NOTFOUND IF Controller // execute GET only if POST was successful Condition = ${JMeterThread.last_sample_ok} // you may change this to verify that variable with extracted ID is not empty HTTP Request GET param = ${__V(${username}UnicID)} . . .