【问题标题】:JMeter : How to increment +1 hour 24 times and then switch to the next dayJMeter:如何增加+1小时24次然后切换到第二天
【发布时间】:2019-12-12 16:32:21
【问题描述】:

我正在尝试每天创建 24 个约会,在创建第 24 个约会后,我希望我的脚本切换到第二天,然后继续每小时添加约会等等。

1 次预约 = 1 小时

我在请求中使用以下 BeanShell PreProcessor 代码进行小时和日迭代:

cal.add(Calendar.DAY_OF_YEAR,1);
cal.add(Calendar.HOUR_OF_DAY,1);

我使用用户定义的变量以以下格式设置初始小时和日期 (HH:mm) (MM/dd/yyyy)

脚本正在运行,但它每天只添加 1 个约会,然后切换到第二天。

我也可以使用循环控制器并将 +1 小时 BeanShell PreProcessor 请求放在循环控制器下,但是在达到循环控制器的 24 个循环后的第二天,我不知道如何切换。 有没有办法在每个线程执行时从用户定义的变量中将天数迭代 1?

这是我在添加预约请求中的 BeanShell 中使用的代码:

import java.text.SimpleDateFormat; 
import java.util.Calendar;
import java.util.Date;

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); 
Date date1 = sdf.parse(vars.get("HOUR")); 


Calendar cal = Calendar.getInstance(); 
cal.setTime(date1); 
cal.add(Calendar.HOUR_OF_DAY,1);
date1 = cal.getTime(); 
vars.put("HOUR",sdf.format(date1)); 


log.info("HOUR=" + vars.get("HOUR"));

主要是,我有一个包含 3 个请求的线程组,它们一起代表一个流: 登录 -> 创建患者 -> 为上述患者添加预约

添加约会是一个带有一堆参数的 POST 请求。 我对迭代感兴趣的是:Appointment.StartDateDay 和 Appointment.StartTime。

请帮忙^^

【问题讨论】:

  • 您实际上不需要切换日期,如果您继续添加小时数,日期会自动切换。所以删除cal.add(Calendar.DAY_OF_YEAR,1); 应该可以解决问题。
  • 感谢您的回复帕思!我已经尝试过您刚才提到的内容,但问题是我的添加预约请求同时包含 HOUR 和 DAY 参数。因此,如果我在同一个线程上循环我的请求 48 次,它仍然会在同一天添加 48 个约会
  • 请您将您的代码完整代码粘贴到您的问题中吗?它应该给我更好的背景。
  • 当然可以。希望对你有帮助

标签: groovy jmeter beanshell


【解决方案1】:
  1. Since JMeter 3.1 it's recommended to use JSR223 Test Elements and Groovy language 用于编写脚本,因此请考虑尽快从 Beanshell 迁移到 Groovy
  2. 一般而言,建议避免编写脚本并尽可能使用 JMeter 内置组件,因为您的时间增量 JMeter 的 __timeShift() 函数应该可以正常工作:

     ${__timeShift(HH:mm,now,PT1H,,)}
    

演示:

更多信息:Creating Dates in JMeter Using the TimeShift Function

【讨论】:

    【解决方案2】:

    我认为问题出在Date date1 = sdf.parse(vars.get("HOUR")); 处,您正试图解析这样的日期,日、月和年信息丢失,仅保留小时和分钟。因此,如果您按以下方式更改它,那么我认为一旦您将开始时间添加为用户定义的变量 TIME_IN_MS(例如 1576586156),它应该对您有用。

    import java.text.SimpleDateFormat; 
    import java.util.Calendar;
    import java.util.Date;
    
    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); 
    Date date1 = new Date(Long.parseLong(vars.get("TIME_IN_MS"))); 
    
    
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date1); 
    cal.add(Calendar.HOUR_OF_DAY,1);
    date1 = cal.getTime(); 
    vars.put("TIME_IN_MS",String.valueOf(date1.getTime())); 
    
    
    log.info("TIME_IN_MS=" + vars.get("TIME_IN_MS"));
    

    【讨论】:

    • 很遗憾,它不起作用。 “HOUR”是在用户定义变量中设置的开始小时格式,格式为 HH:mm。更具体地说,在我的上下文中 HOUR=00:00 这意味着我的第一个约会将在 00:00 添加,然后它将开始迭代 +1 直到它到达 24:00。我错过了什么吗?
    • 如果 DAY 值是我的添加约会 http 请求中的固定参数,我真的很想了解如何在迭代 HOUR 24 次后迭代 DAY。在那之前,我会继续努力把它做好。谢谢帕思!
    • Beanshell 代码没问题。问题可能出在其他地方。请分享log.info("TIME_IN_MS=" + vars.get("TIME_IN_MS"));的输出
    • 17 14:11:15,320 警告 o.a.j.m.BeanShellPreProcessor:BeanShell 脚本中的问题。 org.apache.jorphan.util.JMeterException:调用 bsh 方法时出错:eval 源文件:内联评估:``import java.text.SimpleDateFormat;导入 java.util.Calendar;导入 java.util。 . . . '' : 方法调用错误:方法 put(java.lang.String, long ) not found in class'org.apache.jmeter.threads.JMeterVariables' 换句话说,TIME_IN_MS 变量不再通过使用上述部分进行迭代代码。
    • 请在答案中查看修改后的代码,它现在应该适合你了。
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 2012-09-22
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    相关资源
    最近更新 更多