ما هي بعض الاستراتيجيات التي لاختبار وحدة جدولة؟

StackOverflow https://stackoverflow.com/questions/931650

سؤال

بدأ هذا المنشور "ما هي بعض الأنماط الشائعة في اختبار الكود متعدد الخيوط؟"، لكنني وجدت بعض آخر مناقشات على ذلك، وافق عموما على أنه "من الصعب (TM)" و "ذلك يعتمد (TM)". لذلك اعتقدت أن تقليل نطاق السؤال سيكون أكثر فائدة.

خلفية : نقوم بتنفيذ جدولة بسيطة تمنحك وسيلة لتسجيل عمليات الاسترجاعات عند بدء تشغيل ووقف الوظائف وبالطبع تكوين تواتر الجدولة. حاليا، نحن نجعل غلاف خفيف الوزن حول java.util.timer.

النواحي:

  • لم أجد طريقة لاختبار هذا المجدول بالاعتماد على الواجهات العامة فقط (شيء مثل addJob(jobSchedule, jobArgs,jobListener) , removeJob(jobId)).

  • كيف يمكنني الوقت لحقيقة أن الوظيفة قد تم استدعاؤها وفقا للجدول المحدد؟

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

المحلول

يمكنك استخدام كائن مسجل يسجل الطلب، توقيت وغيرها من الأشياء المفيدة في كل وحدة اختبار المجدول الخاص بك. الاختبار بسيط:

  1. إنشاء كائن مسجل
  2. تكوين الجدول الزمني
  3. تنفيذ اختبار الوحدة
  4. تحقق من وجود كائن المسجل هو "متوافق" مع الجدول الزمني

نصائح أخرى

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

الشيء الآخر الهام الذي يجب تذكره هو أنه عند اختبار المجدول، استخدم الوظائف المخصصة التي تتبع كيفية عمل المجدول؛ عند اختبار الوظائف المجدولة، اتصل بالهبط المباشرة وليس من خلال المجدول. قد يكون لديك اختبار تكامل أعلى مستوى يتحقق معا، اعتمادا على النظام.

هناك العديد من أوضاع الفشل التي يمكن أن تعرضها مثل هذا المجدول، ولن يتطلب كل منهما على الأرجح حالة الاختبار الخاصة به. من المحتمل أن تكون حالات الاختبار هذه مختلفة تماما، لذلك "ذلك يعتمد".

للاختبار البرمجيات المتزامنة في جافا بشكل عام، أوصي بهذا العرض من Javaone 2007: اختبار البرمجيات المتزامنة.

للاختبار أن جدول جدولة يجب أن تنفذ وظائف في دقيقة وفقا لجدولها، سأخلق تجريد الوقت نفسه. لقد فعلت شيئا مشابها في أحد مشاريعي، حيث لدي واجهة وقت أو ساعة. سيتم التنفيذ الافتراضي MilliSecondTime، ولكن أثناء الاختبار، سأقوم بإيقاف تشغيله مع وقت القرد. سيسمح هذا التنفيذ باختبار وحدتي للتحكم في الوقت الذي يتقدم فيه الوقت ومقدار ذلك.

بهذه الطريقة، يمكنك كتابة اختبار حيث من المقرر أن يتم تشغيل وظيفة مرة واحدة كل 10 علامة. ثم اختبارك فقط تقدم عداد القراد والتحقق للتأكد من تشغيل الوظائف في القراد الصحيحة.

بضعة طرق لاختبار التعليمات البرمجية المتزامنة.

  • قم بتشغيل نفس الكود عدة مرات قيد التحميل، تظهر بعض الأخطاء في بعض الأحيان فقط، ولكن يمكن أن تظهر باستمرار إذا تم تنفيذها بشكل متكرر.
  • تخزين نتائج المواضيع / الوظائف المختلفة في مجموعة مثل Blockingqueue. سيسمح لك ذلك بالتحقق من النتائج في الخيط الحالي والانتهاء في الوقت المناسب (بدون بيانات نوم تعسفية قبيحة)

إذا كنت تجد اختبار التزامن صعبة النظر في إعادة صياغة الكائنات / المكونات الخاصة بك لجعلها أسهل في الاختبار.

إذا كان مندوبون جدولة إلى Executor أو ExecutorService لتشغيل المهام، يمكنك استخدام حقن التبعية لإزالة الاعتماد المباشر على نوع Executor, ، و استخدام سلطة واحدة بسيطة Executor لاختبار الكثير من وظائف جدولة الخاص بك بدون مضاعفات رمز متعدد الخيوط حقا. بمجرد أن تحصل على تصحيح هذه الاختبارات، يمكنك التحرك على أصعب، ولكن الآن تقلصت إلى حد كبير في حجم، مهمة اختبار سلامة الموضوع.

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