سؤال

على افتراض أن لدي CronTriggerBean على غرار

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

ما هي أفضل طريقة لاختبار هذا الفول في الواقع تؤدي في الموعد المحدد ، أي على أيام الأسبوع الأقرب إلى 15 من كل شهر من الساعة 6 صباحا ؟


التحديث:هذا هو المفترض أن يكون اختبار الوحدة ، لذلك أنا لا أذهب إلى النار حتى VM أو تغيير وقت النظام.

هل كانت مفيدة؟

المحلول

وحسنا أولا، وليس هناك نقطة في اختبار CronTriggerBean نفسها. انها جزء من إطار الربيع، ولقد تم بالفعل تم اختبارها.

ووأفضل اختبار قد يكون لاختبار هذا التعبير كرون هو ما كنت تتوقع. خيار واحد هنا هو استخدام الطبقة CronExpression الكوارتز و. وبالنظر إلى وجوه CronExpression، يمكنك الاتصال getNextValidTimeAfter(Date)، والتي ترجع في المرة القادمة بعد تاريخ معين عند التعبير واطلاق النار.

نصائح أخرى

واعتدت CronMaker فقط للتأكد إذا تم تشكيل التعبير كرون بلدي بشكل جيد، والتحقق من ذلك: http://www.cronmaker.com/

  1. يمكنك دائما انتظر حتى 15h من تموز / يوليو.
  2. كونها أكثر خطورة...إذا كان حقا جزءا رئيسيا من التطبيق و لا تحتاج إلى اختبارها بشكل كامل.أود أن أوصي باستخدام بعض المحاكاة الافتراضية الاجهزة و يكون التطبيق مثبتا في بعض النزلاء آلة.ثم يمكنك أن تلعب مع ساعة النظام و اختبار تاريخ مختلف/مرات دون إنفاق شهر كامل على ذلك.وعلاوة على ذلك هناك لا شيء يمكن أن يمنعك من أتمتة مثل هذه الاختبارات.

وبالنسبة لأولئك الذين لا تستخدم جدولة الكوارتز، ولكن بدلا من استخدام TaskSchedular مباشرة:

CronSequenceGenerator generator = new CronSequenceGenerator("0 0 8 */1 * *");
Date next = generator.next(prev);

ويمكنك أيضا الحصول على الفول الزناد من الربيع واستدعاء الأسلوب getFireTimeAfter حتى النهاية.

ولقد وجدت وثائق بارد هنا عن اختبار CronExpression: http://www.nurkiewicz.com/2012/10/testing كوارتز-كرون-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();

ولأن هذا يتم تنفيذه على الفور ومن ثم في كل مرة س.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top