代码之家  ›  专栏  ›  技术社区  ›  Robert Munteanu

石英晶体触发器的测试

  •  13
  • Robert Munteanu  · 技术社区  · 15 年前

    假设我有一个 CronTriggerBean 类似

    <bean id="midMonthCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="reminderJobDetail" />
        <property name="cronExpression" value="0 0 6 15W * ?" />
    </bean>
    

    测试此bean在指定日期实际触发的最佳方法是什么, 在最接近每月15日的工作日上午6点?


    使现代化 :这应该是一个单元测试,所以我不会启动VM或更改系统时间。

    6 回复  |  直到 15 年前
        1
  •  18
  •   skaffman    15 年前

    首先,测试没有意义 CronTriggerBean 它本身它是spring框架的一部分,已经过测试。

    更好的测试可能是测试cron表达式是否符合预期。这里的一个选择是使用石英的 CronExpression 班给予 CronExpression getNextValidTimeAfter(Date) ,它返回给定日期后表达式将触发的下一次时间。

        2
  •  7
  •   domix    13 年前

    我使用CronMaker只是为了确保我的cron表达式格式正确,请查看: http://www.cronmaker.com/

        3
  •  3
  •   Grzegorz Oledzki    15 年前
    1. 更严重的是。。。如果它真的是应用程序的一个关键部分,我认为你需要对它进行全面测试。我建议使用一些 虚拟化 设置并在某些来宾计算机中安装应用程序。然后,您可以玩系统时钟,测试不同的日期/时间,而无需花费整整一个月的时间。此外,没有什么可以阻止你 自动化 这样的测试。
        4
  •  2
  •   Varun Achar    12 年前

    对于那些不使用Quartz调度程序,而是使用 TaskSchedular 直接:

    CronSequenceGenerator generator = new CronSequenceGenerator("0 0 8 */1 * *");
    Date next = generator.next(prev);
    
        5
  •  1
  •   javanna Jayendra    13 年前

    您还可以从spring获取触发器bean并调用 getFireTimeAfter

        6
  •  0
  •   Jaider    9 年前

    我在这里找到了一个关于测试 CronExpression : http://www.nurkiewicz.com/2012/10/testing-quartz-cron-expressions.html

    C#实现将是这样的:

    void Run()
    {
        //var collection = findTriggerTimesRecursive(new CronExpression("0 0 17 L-3W 6-9 ? *"), DateTime.UtcNow);
        var collection = findTriggerTimesRecursive(new CronExpression("0 0/15 * 1/1 * ? *"), DateTime.UtcNow);
        Console.WriteLine(DateTime.UtcNow);
        foreach (var item in collection)
        {
            Console.WriteLine(item);
        }
    }
    
    public List<DateTimeOffset> findTriggerTimesRecursive(CronExpression expr, DateTimeOffset from, int max = 10)
    {
        var times = new List<DateTimeOffset>();
        var next = expr.GetNextValidTimeAfter(from);
    
        while (next != null && times.Count < max)
        {
            times.Add(next.Value);
            from = next.Value;
            next = expr.GetNextValidTimeAfter(from);
        }
    
        return times;
    }
    

    var trigger = TriggerBuilder.Create()
        .WithIdentity("trigger3", "group1")
        .WithSimpleSchedule(
            x =>
            {
                x.WithIntervalInMinutes(15);
                x.RepeatForever();
            }
        )
        .ForJob("myJob", "group1")
        .Build();
    

    因为这是立即执行的,然后每x次执行一次。