OOZOU
تواصلوا معنا
العودة إلى المدونة

تشغيل الـ Specs بالتوازي قبل Rails 6

جاء إصدار Rails 6 بميزة تشغيل الاختبارات بالتوازي، لكن هل تعلمون أن بإمكانكم فعل ذلك من قبله؟ نستخدم parallel_tests منذ أشهر لتشغيل اختبارات RSpec بالتوازي في GitHub action لدينا.

29 ديسمبر 2020
3 دقائق للقراءة
تشغيل الـ Specs بالتوازي قبل Rails 6

بصفتكم مطوري Rails، ستشغّلون الكثير من الـ specs. نستخدم guard غالبًا لأتمتة العملية أثناء التطوير، أو نستخدم --only-failures لإصلاح بعض الـ specs الفاشلة بسرعة. لكن في مسارات CI لدينا نحتاج إلى تشغيل المجموعة كاملة للتأكد من أن كل شيء أخضر قبل الـ merge أو الـ deploy. في جميع مشاريع Rails لدينا نستخدم GitHub Actions لتشغيل كل فحوصات CI. عادة نشغّل Pronto للتحقق من التزام الكود بمعايير Rubocop، و RSpec للتأكد من أننا لم نكسر شيئًا. ونشغّل هذه الـ actions مع كل push إلى Pull Request، ومع كل merge إلى فرعَي develop وmaster. في المشاريع الجديدة تكون هذه العملية سريعة عادة، دقيقتين ربما، لكن بعض مشاريعنا الأقدم قد يستغرق تشغيل مجموعة اختباراتها الكاملة أكثر من 10 دقائق. في العام الماضي انضممت إلى أحد أطول مشاريعنا عمرًا، وأخذت على عاتقي فورًا تقليص مدة تشغيل مجموعة الاختبارات. حين انضممت كانت المجموعة تستغرق أكثر من 19 دقيقة. أول ما فعلته أنني شغّلت المجموعة مع خيار profile، فحصلت على أبطأ 10 أمثلة. وكل مثال كان يستغرق أكثر من ثانيتين نال نصيبه من الاهتمام لأرى إن كان بإمكاني تسريعه. معظم هذه الـ specs كانت تعتمد على منطق تجهيز وتنظيف (setup وteardown) كثيف، فانتقلت إلى استخدام stubbing، ما قلّص زمن تشغيل كثير منها بشكل كبير. وفي الوقت نفسه غيّر أحد الزملاء آلية مطابقة استجابات json لدينا، فانخفضت المدة أكثر. ونجحنا في خفض زمن المجموعة إلى نحو 8 دقائق، وكان ذلك إنجازًا لافتًا حقًا. وبقيت لدي حيلة أخيرة: Parallel Tests!

كيف تعمل الاختبارات المتوازية؟

المنطق بسيط جدًا. معظم الحواسيب تحتوي على أكثر من نواة معالج، لكننا حين نشغّل RSpec نستخدم واحدة منها فقط. تتحقق أداة Parallel Tests من عدد الأنوية المتاحة على الجهاز الحالي، ثم تقسم مجموعة الاختبارات إلى عدد مماثل من المجموعات. وتعمل كل مجموعة على نواتها الخاصة، بقاعدة بيانات وعمليات أخرى مستقلة، حتى تبقى الاختبارات معزولة كلٌّ في نواتها. تكشف parallel_tests عن متغير ENV يُعلم الكود بمجموعة الاختبارات التي تعمل حاليًا، فيمكنكم تعديل منطق تشغيل الخدمات بناءً على هذا المتغير. فإذا كنا نستخدم مثلًا PORT 9250 لـ elasticsearch في الـ specs، يمكننا تغييره إلى:

9250 + ENV['TEST_ENV_NUMBER'].to_i

ونحتاج أيضًا إلى فعل الشيء نفسه مع اسم قاعدة البيانات:

test:
  database: hello_world<%= ENV['TEST_ENV_NUMBER'] %>

الآن إذا شغّلنا RSpec يدويًا فستكون قاعدة البيانات hello_world، أما إذا شغّلناه عبر parallel_tests فستكون لدينا عدة قواعد بيانات، مثل hello_world وhello_world2 وhello_world3 وhello_world4 وقبل تشغيل الاختبارات نحتاج إلى إعداد قواعد البيانات هذه بالمهمة التي توفرها parallel_tests.

rake parallel:setup

ولتشغيل الـ specs بالتوازي، نغيّر ببساطة الأمر من rspec إلى parallel_tests

# bundle exec rspec spec
rake parallel:spec

هذا كل شيء! أصبحنا الآن نشغّل الـ specs بالتوازي قبل Rails 6. وبهذا التغيير البسيط انخفضت مدة مجموعة الاختبارات من 8 دقائق إلى 4 دقائق على GitHub، الذي يستخدم أجهزة بنواتين لتشغيل الـ actions. وعلى أجهزة بأربع أنوية يمكننا تشغيل الـ specs في دقيقتين إلى 3 دقائق. وهذا تحسن هائل مقارنة بأكثر من 19 دقيقة كانت تستغرقها في البداية.

Related Articles

كيف أصمّم برمجيات؟ دليل المبتدئين لأصحاب الأعمال

كيف أصمّم برمجيات؟ دليل المبتدئين لأصحاب الأعمال

تصميم البرمجيات عملية ممتعة لكنها معقدة، تتطلب الإبداع والتفكير المنطقي ومهارات حل المشكلات.

اقرأوا المزيد
مستقبل الحوسبة الطرفية: ما تحتاج الشركات إلى معرفته

مستقبل الحوسبة الطرفية: ما تحتاج الشركات إلى معرفته

يتطور المشهد الرقمي بسرعة، وعلى الشركات أن تتكيّف لتواكب الطلب المتزايد على السرعة والكفاءة والمعالجة في الوقت الفعلي.

اقرأوا المزيد
مستقبل قطاع التجزئة: الذكاء الاصطناعي والواقع المعزّز واتجاهات التحوّل الرقمي

مستقبل قطاع التجزئة: الذكاء الاصطناعي والواقع المعزّز واتجاهات التحوّل الرقمي

يتطور قطاع التجزئة بوتيرة غير مسبوقة بفضل الذكاء الاصطناعي (AI) والواقع المعزّز (AR) وتقنيات التحوّل الرقمي. فلم تعد المتاجر التقليدية مجرد أماكن لبيع المنتجات، بل أصبحت متاجر ذكية وتفاعلية.

اقرأوا المزيد

Have a Project in Mind?

Let's discuss how we can help bring your ideas to life with our expertise in web and mobile development.

ابدأوا المحادثةhello@oozou.com
OOZOU Logo

بانكوك · سنغافورة · هونغ كونغ

X
Facebook
Instagram
LinkedIn
OOZOU Co., Ltd.
548 One City Centre
Ploenchit Road
Bangkok 10330
Thailand
+66 2544 0000
hello@oozou.com

الخدمات

  • تطوير الويب
  • وكلاء الذكاء الاصطناعي والذكاء الاصطناعي التوليدي
  • تطوير تطبيقات الجوال
  • تحليلات البيانات وهندستها
  • تصميم تجربة المستخدم وواجهته (UX/UI) وتصميم المنتجات
  • التحوّل الرقمي

الشركة

  • من نحن
  • الوظائف
  • المدونة
  • دراسات الحالة
  • عروض حية
  • تعلّمت اليوم
  • تواصل معنا

المزيد

  • القطاعات
  • شبكة الشركاء
© 2026 OOZOU. جميع الحقوق محفوظة.
سياسة الخصوصيةمدونة قواعد السلوكسياسة مكافحة الرشوة والفساد