سرعة تنفيذ اختبار الوحدة (كم عدد الاختبارات في الثانية؟)

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

  •  08-06-2019
  •  | 
  •  

سؤال

ما نوع معدل التنفيذ الذي تستهدفه من خلال اختبارات الوحدة الخاصة بك (# اختبار في الثانية)؟ما هي المدة الطويلة جدًا لاختبار الوحدة الفردية؟

سأكون مهتمًا بمعرفة ما إذا كان لدى الأشخاص أي حدود محددة لتحديد ما إذا كانت اختباراتهم بطيئة جدًا، أم أنها فقط عندما تتغلب عليك مجموعة الاختبارات الطويلة الأمد؟

أخيرًا، عندما تقرر أن الاختبارات بحاجة إلى إجراء أسرع، ما هي التقنيات التي تستخدمها لتسريع اختباراتك؟

ملحوظة:من الواضح أن اختبارات التكامل مسألة مختلفة مرة أخرى.نحن نتحدث بشكل صارم عن اختبارات الوحدة التي يجب إجراؤها بشكل متكرر قدر الإمكان.


تقريب الاستجابة: شكرا على الردود العظيمة حتى الآن.يبدو أن معظم النصائح هي عدم القلق بشأن السرعة - التركيز على الجودة وتشغيلها بشكل انتقائي فقط إذا كانت بطيئة جدًا.تضمنت الإجابات ذات الأرقام المحددة استهداف أقل من 10 مللي ثانية حتى 0.5 وثانية واحدة لكل اختبار، أو مجرد إبقاء المجموعة الكاملة من الاختبارات التي يتم إجراؤها بشكل شائع أقل من 10 ثوانٍ.

لست متأكدًا مما إذا كان من الصحيح وضع علامة على إحدى الإجابات على أنها "إجابة مقبولة" عندما تكون جميعها مفيدة :)

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

المحلول

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

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

الآن هذا لا يعني أنك تتجاهل اختبار قاعدة البيانات الخاصة بك أو الثبات.لكن هذه المشكلات أصبحت الآن معزولة خلف المستودعات التي يمكن اختبارها بشكل منفصل باستخدام اختبارات التكامل الموجودة في مشروع منفصل.يمكنك إجراء اختبارات الوحدة الخاصة بك باستمرار عند كتابة رمز المجال ثم تشغيل اختبارات التكامل الخاصة بك مرة واحدة عند تسجيل الوصول.

نصائح أخرى

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

الهدف هو إجراء 100 اختبار في الثانية.الطريقة التي تصل بها إلى هناك هي باتباع طريقة مايكل فيذر قواعد اختبارات الوحدة.

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

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

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

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

نحن حاليًا نجري 270 اختبارًا في حوالي 3 ثوانٍ.من المحتمل أن يكون هناك حوالي 8 اختبارات تقوم بإجراء عملية الإدخال/الإخراج للملف.

يتم تشغيلها تلقائيًا عند إنشاء مكتباتنا بنجاح على كل جهاز مهندس.لدينا اختبارات دخان أكثر شمولاً (واستهلاكًا للوقت) يتم إجراؤها بواسطة آلة البناء كل ليلة، أو يمكن البدء بها يدويًا على إحدى أجهزة المهندسين.

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

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

من الواضح أن المسافة المقطوعة التي تقطعها ستكون متغيرة بشكل كبير اعتمادًا على مجال التطوير الخاص بك.

نقطة البيانات - اختبارات الانحدار بايثون

فيما يلي الأرقام الموجودة على جهاز الكمبيوتر المحمول الخاص بي لتشغيل "إجراء اختبار" لـ Python 2.5.2:

  • عدد الاختبارات:3851 (تقريبًا)
  • وقت التنفيذ:9 دقائق و6 ثواني
  • معدل التنفيذ:7 اختبارات / ثانية

أحكم على اختبارات الوحدة الخاصة بي على أساس كل اختبار، وليس بعدد الاختبارات في الثانية.المعدل الذي أهدف إليه هو 500 مللي ثانية أو أقل.إذا كان أعلى من ذلك، فسوف أبحث في الاختبار لمعرفة سبب استغراقه وقتًا طويلاً.

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

كان هناك مادة جيدة على هذا من Power Of Two games، مؤلفو UnitTest++.

ما هي مدة طويلة جدًا لاختبار الوحدة الفردية؟

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

لا أهتم باختبار سرعة التنفيذ حتى يصبح هذا أمرًا مزعجًا.

الخطر هو التوقف عن إجراء الاختبارات لأنها بطيئة جدًا.

أخيرًا ، عندما تقرر أن الاختبارات تحتاج إلى تشغيل بشكل أسرع ، ما هي التقنيات التي تستخدمها لتسريع اختباراتك؟

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

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

توفر بعض الأطر التنفيذ التلقائي لاختبارات وحدة معينة بناءً على الاستدلال مثل آخر وقت تم تعديله.بالنسبة إلى Ruby و Rails، يوفر AutoTest تنفيذًا أسرع وأكثر استجابة للاختبارات - عندما أقوم بحفظ نموذج Rails app/models/foo.rb, ، اختبارات الوحدة المقابلة في test/unit/foo_test.rb اهرب.

لا أعرف إذا كان هناك أي شيء مماثل موجود لمنصات أخرى، ولكن سيكون من المنطقي.

إحدى أهم القواعد المتعلقة باختبارات الوحدة هي ضرورة تشغيلها سريع.

ما هي المدة الطويلة جدًا لاختبار الوحدة الفردية؟

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

ما نوع معدل التنفيذ الذي تستهدفه من خلال اختبارات الوحدة الخاصة بك (# اختبار في الثانية)؟

يجب أن تهدف إلى تشغيل كل اختبار بترتيب ميلي ثانية، أي شيء يزيد عن ثانية واحدة ربما يكون اختبارًا أكثر من اللازم.

لدينا حاليًا حوالي 800 اختبار يتم إجراؤها في أقل من 30 ثانية، أي حوالي 27 اختبارًا في الثانية.يتضمن ذلك الوقت اللازم لتشغيل محاكي الهاتف المحمول اللازم لتشغيلها.يستغرق معظمهم 0-5 مللي ثانية (إذا كنت أتذكر بشكل صحيح).

لدينا واحدة أو اثنتين تستغرقان حوالي 3 ثوانٍ، وهي على الأرجح مرشحة للتحقق، ولكن الشيء المهم هو أن مجموعة الاختبار بأكملها لا تستغرق وقتًا طويلاً بحيث تمنع المطورين من تشغيلها، ولا تبطئ بشكل كبير عملنا المستمر بناء التكامل.

لدينا أيضًا حد مهلة قابل للتكوين تم ضبطه على 5 ثوانٍ - أي شيء يستغرق وقتًا أطول سوف يفشل.

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