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

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

تأثير الأداء

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

قم بتقديم # الاختبارات قبل بعد دلتا
lms / djangoapps / ccx / الاختبارات / test_ccx_modulestore.py  5 38s 4s -89٪
lms / djangoapps / Discuss_api / الاختبارات / test_api.py  409 2m 45s 51s -69٪
lms / djangoapps / فرق / اختبارات / test_views.py 152 1m 17s 33s -57٪

 

إذن كيف تقوم بتحويل الاختبارات الخاصة بك؟

جعل التحول

معظم الطبقات التي ترث من ModuleStoreTestCase ابدأ شيئًا كهذا:

كود بايثون مع تمييز بناء الجملة. لعرض كود المصدر ، اقرأ منشور المدونة الأصلي على http://swampcastle.org/2015/07/28/writing-faster-modulestore-tests.html

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

كود بايثون مع تمييز بناء الجملة. لعرض كود المصدر ، اقرأ منشور المدونة الأصلي على http://swampcastle.org/2015/07/28/writing-faster-modulestore-tests.html

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

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

ما الاختبارات التي يجب علي تحويلها؟

أسهل مكان للبحث عن أهداف اختبار التحسين هو تقرير بناء اختبار Jenkins. انقر فوق "المدة" للترتيب حسب هذا العمود.

لقطة شاشة لخادم Jenkins ، تُظهر الاختبارات التي استغرقت أطول فترة زمنية للتشغيل.

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

الوجبات الجاهزة الشاملة

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

ديف أورمسبي مهندس معماري أول في edX. تم نشر هذا المنشور في الأصل على مدونته ، قلعة المستنقع.

 إجمالي المشاهدات 745