如何通过JMeter的__RandomDate()生成仅工作日日期?
解决JMeter生成仅工作日随机日期的问题
方法一:先生成随机日期再调整为工作日
用
__RandomDate()生成初始随机日期并存入变量:${__RandomDate(yyyy-MM-dd,2024-01-01,2024-12-31,randomDate,)}可根据需求修改日期范围和格式,生成的日期会存在
randomDate变量中。在API请求前添加JSR223 PreProcessor,用Groovy代码调整日期:
import java.time.LocalDate import java.time.format.DateTimeFormatter // 读取已生成的随机日期 def rawDate = vars.get("randomDate") def formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") def date = LocalDate.parse(rawDate, formatter) // 判断是否为周末并调整 def dayOfWeek = date.getDayOfWeek().getValue() if (dayOfWeek == 6) { // 周六调整为前一天(周五) date = date.minusDays(1) } else if (dayOfWeek == 7) { // 周日调整为后一天(周一) date = date.plusDays(1) } // 将调整后的工作日存入新变量 vars.put("workdayDate", date.format(formatter))在API请求参数中直接使用
${workdayDate}即可。
方法二:直接生成工作日(无需后续调整)
如果不想先生成随机日期再调整,可直接在JSR223元件中生成仅包含工作日的随机日期:
import java.time.LocalDate import java.time.format.DateTimeFormatter import java.util.Random // 定义日期范围 def startDate = LocalDate.of(2024, 1, 1) def endDate = LocalDate.of(2024, 12, 31) def random = new Random() def workdayDate = null // 循环生成直到得到工作日 while (workdayDate == null) { long daysRange = java.time.temporal.ChronoUnit.DAYS.between(startDate, endDate) long randomDays = random.nextLong(daysRange + 1) def candidate = startDate.plusDays(randomDays) def dayOfWeek = candidate.getDayOfWeek().getValue() // 周一到周五(对应数值1-5)才保留 if (dayOfWeek >= 1 && dayOfWeek <= 5) { workdayDate = candidate } } // 存入变量供API请求使用 vars.put("workdayDate", workdayDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
关于__time(EEE,)的局限
__time(EEE,)函数只能基于当前系统时间获取星期,没有参数支持解析自定义日期字符串,所以无法直接处理__RandomDate()生成的变量日期,必须通过JSR223中的日期解析API来实现需求。
内容的提问来源于stack exchange,提问作者user23667974
相关产品推荐
相关产品推荐

