如何在groovy中创建动态数据生成器

如何在groovy中创建动态数据生成器,groovy,soapui,Groovy,Soapui,我有一个简单的日期生成器代码,它选择从现在到120天的日期 然而,我希望我的约会更聪明一点。我只希望它只从5月、6月、7月和8月中选择 因此,如果当前日期在5月之前,则在今年的这四个月内随机选择一个日期。 否则,如果当前日期超过6月,则从下一年的4个月中选择一个日期 这是如何用groovy编写的 下面是当前日期生成器 //Defines Start and End Dates for holiday departure date search Random random = new Random

我有一个简单的日期生成器代码,它选择从现在到120天的日期

然而,我希望我的约会更聪明一点。我只希望它只从5月、6月、7月和8月中选择

因此,如果当前日期在5月之前,则在今年的这四个月内随机选择一个日期。
否则,如果当前日期超过6月,则从下一年的4个月中选择一个日期

这是如何用groovy编写的

下面是当前日期生成器

//Defines Start and End Dates for holiday departure date search
Random random = new Random();
date = new Date()
def startDate = date + random.nextInt(100 + 120)
sDate = startDate.format("yyyy-MM-dd")

testRunner.testCase.testSuite.setPropertyValue('arrivaldate', sDate);
(op澄清后编辑)

基本上,我们从允许的日期列表中随机选择一个日期

不在每次通话时创建
allowedates
列表可以提高性能

有些日期方法已弃用。如果反对意见很重要,您可能希望改用日历

groovy range
运算符on dates返回一个日期范围,其中包含两个给定日期之间的所有日期(包括在内)

我现在将
放在方法外部,以使测试更容易,并且将
随机
放在方法外部,因为我相信在每次调用时重新创建随机的新实例对生成的随机分布的质量有害

注1:对于5月1日至6月30日之间的日期,问题定义不清楚。对于这些日期,代码返回当前年份的随机日期,不包括过去的日期。也就是说,在6月15日,算法将返回一个从今年6月16日到8月31日之间的随机日期。在7月1日,它将返回一个从明年5月1日到8月31日的随机日期

注意2:没有不推荐的日期调用和使用日历的备用版本:

import static java.util.Calendar.*
import java.util.GregorianCalendar as Cal

def getRandomDate(Date now, Random random) {
  def cal = new Cal(time: now)

  // use current year if current date is before july, otherwise next year
  def year         = cal.get(YEAR) + (cal.get(MONTH) > 5 ? 1 : 0)
  def allDates     = (new Cal(year, 4, 1).time..new Cal(year, 7, 31).time)
  def allowedDates = allDates.findAll { now < it }

  allowedDates[random.nextInt(allowedDates.size())]
}
导入静态java.util.Calendar*
将java.util.GregorianCalendar作为Cal导入
def getRandomDate(现在日期,随机){
def cal=新cal(时间:现在)
//如果当前日期在7月之前,则使用当前年份,否则使用下一年
定义年份=校准获取(年)+(校准获取(月)>5?1:0)
def allDates=(新校准(第4年,第1年)。时间..新校准(第7年,第31年)。时间)
def allowedates=allDates.findAll{now
下面是Groovy脚本,它完成了您想要做的事情

请注意,如果当前日期落在问题中缺少的日期范围内,下面的脚本将抛出一个错误

5月1日至6月30日期间未实施

请跟随在线评论

import groovy.time.TimeCategory

def dateFormat = 'yyyy-MM-dd'

def getNumberInRange = { min, max -> new Random().nextInt(max + 1 - min) + min }

def isTodayBeforeMay = { Calendar.MONTH < 5 }

def isTodayAfterJune = { Calendar.MONTH > 6 }

//Get the number of days between today and given date
def getDifferenceDays = { targetDate, closure ->
    def strDate = closure (targetDate)
    def futureDate = new Date().parse(dateFormat, strDate)
    TimeCategory.minus(futureDate, new Date()).days
}

//Get the offset between today and max date i.e.,31 august
def getOffSetDays = { date ->
    //Need to change the date range if needed.
    //As per OP, May to August is mentioned below
    def max = getDifferenceDays(date) { "${it[Calendar.YEAR]}-08-31" }
    def min = getDifferenceDays(date) { "${it[Calendar.YEAR]}-05-01" }
    getNumberInRange(min, max)
}


def now = new Date()
def nextYearNow = now.updated(year: now[Calendar.YEAR] + 1)

def selected
def finalDate

println "Today : $now"
println "Next year same date : $nextYearNow"

if (isTodayBeforeMay()) {
    selected = now    
} else if (isTodayAfterJune()) {
    selected = nextYearNow
} else {
    //It is not mentioned what should happened for the mentioned period by OP
    throw new Error("Not implemented for the days between 1st May to 30th June")
}

def offset = getOffSetDays(selected)

//Add the offset days to now
use(TimeCategory) {
    finalDate = now + offset.days
}
println "Final future date is : $finalDate"
println "Final future date is(formatted) : ${finalDate.format(dateFormat)}"

//set the date at test case level property
context.testCase.setPropertyValue('NEXT_DATE', finalDate.format(dateFormat))
导入groovy.time.TimeCategory
def dateFormat='yyyy-MM-dd'
def getNumberInRange={min,max->new Random().nextInt(max+1-min)+min}
def ISTODAYBEFORE MAY={Calendar.MONTH<5}
def isTodayAfterJune={Calendar.MONTH>6}
//获取今天和给定日期之间的天数
def getDifferenceDays={targetDate,closure->
def strDate=关闭(targetDate)
def futureDate=new Date().parse(dateFormat,strDate)
TimeCategory.减号(futureDate,new Date()).days
}
//获取今天和最大日期(即8月31日)之间的偏移量
def getOffSetDays={date->
//如果需要,需要更改日期范围。
//根据OP,5月至8月如下所述
def max=getDifferenceDays(date){${it[日历年]}-08-31}
def min=getDifferenceDays(date){${it[日历年]}-05-01}
getNumberInRange(最小值、最大值)
}
def now=新日期()
def nextyernow=now.updated(年份:now[Calendar.year]+1)
选定的def
def最终日期
println“今天:$now”
println“明年同一日期:$nextyernow”
如果(isTodayBeforeMay()){
选择=现在
}否则,如果(isTodayAfterJune()){
所选=下一个小时
}否则{
//OP没有提到在所述期间应该发生什么
抛出新错误(“5月1日至6月30日期间未实施”)
}
def offset=getOffSetDays(选定)
//将抵销天数添加到现在
使用(时间类别){
最终日期=现在+抵销天数
}
println“最终未来日期为:$finalDate”
println“最终未来日期为(格式化):${finalDate.format(dateFormat)}”
//在测试用例级别属性设置日期
context.testCase.setPropertyValue('NEXT_DATE',finalDate.format(dateFormat))
为了得到评估的日期

  • 在请求中使用
    ${#TestCase#NEXT#u DATE}
  • 在groovy脚本中使用
    context.expand(“${TestCase}NEXT_DATE}”)
    (返回字符串)
注意:
println
可以替换为上述脚本中的
log.info
,如果您想在soapui工具中查看输出。否则,打印语句将显示在日志文件中

您可以在线快速尝试上面的脚本

输出:


如果当前日期是5月1日至6月30日,那该怎么办?事实上,我赞同过去的评论。我的算法当前返回当前年份的日期,但对于5月1日至6月30日之间的日期,则返回当前日期之后的日期。6月30日,它开始使用明年的日期,但正如前面的评论所指出的,目前还没有为这些日期定义问题。
import static java.util.Calendar.*
import java.util.GregorianCalendar as Cal

def getRandomDate(Date now, Random random) {
  def cal = new Cal(time: now)

  // use current year if current date is before july, otherwise next year
  def year         = cal.get(YEAR) + (cal.get(MONTH) > 5 ? 1 : 0)
  def allDates     = (new Cal(year, 4, 1).time..new Cal(year, 7, 31).time)
  def allowedDates = allDates.findAll { now < it }

  allowedDates[random.nextInt(allowedDates.size())]
}
import groovy.time.TimeCategory

def dateFormat = 'yyyy-MM-dd'

def getNumberInRange = { min, max -> new Random().nextInt(max + 1 - min) + min }

def isTodayBeforeMay = { Calendar.MONTH < 5 }

def isTodayAfterJune = { Calendar.MONTH > 6 }

//Get the number of days between today and given date
def getDifferenceDays = { targetDate, closure ->
    def strDate = closure (targetDate)
    def futureDate = new Date().parse(dateFormat, strDate)
    TimeCategory.minus(futureDate, new Date()).days
}

//Get the offset between today and max date i.e.,31 august
def getOffSetDays = { date ->
    //Need to change the date range if needed.
    //As per OP, May to August is mentioned below
    def max = getDifferenceDays(date) { "${it[Calendar.YEAR]}-08-31" }
    def min = getDifferenceDays(date) { "${it[Calendar.YEAR]}-05-01" }
    getNumberInRange(min, max)
}


def now = new Date()
def nextYearNow = now.updated(year: now[Calendar.YEAR] + 1)

def selected
def finalDate

println "Today : $now"
println "Next year same date : $nextYearNow"

if (isTodayBeforeMay()) {
    selected = now    
} else if (isTodayAfterJune()) {
    selected = nextYearNow
} else {
    //It is not mentioned what should happened for the mentioned period by OP
    throw new Error("Not implemented for the days between 1st May to 30th June")
}

def offset = getOffSetDays(selected)

//Add the offset days to now
use(TimeCategory) {
    finalDate = now + offset.days
}
println "Final future date is : $finalDate"
println "Final future date is(formatted) : ${finalDate.format(dateFormat)}"

//set the date at test case level property
context.testCase.setPropertyValue('NEXT_DATE', finalDate.format(dateFormat))