شروحات الكمبيوتر والإنترنت والموبايل

حل مشكلة ModuleNotFoundError في GitHub Actions باستخدام pytest

تواجه العديد من المطورين عند استخدامهم أدوات اختبار بايثون مثل pytest في بيئات مثل GitHub Actions مشاكل شائعة، ومنها الخطأ المعروف بـ ModuleNotFoundError: No module named. ظهور هذا الخطأ قد يشكل عائقًا أثناء تنفيذ الاختبارات، خاصة عندما تعمل الاختبارات محليًا دون مشاكل. في هذا المقال، سنستعرض بعض الأسباب المحتملة وراء ظهور هذا النوع من الأخطاء والحلول الممكنة التي يمكن أن تساعد في تجاوز هذه المشكلة.

أسباب ظهور الخطأ

يتسبب الخطأ ModuleNotFoundError: No module named غالبًا بسبب عدم قدرة Python على العثور على وحدة أو حزمة معينة. في الحالة التي تم الإشارة إليها في السؤال، نجد أن هناك بنية متعددة المستويات للمجلدات، مما قد يؤثر على كيفية استيراد الوحدات. عندما يقوم pytest بالبحث عن الملفات في مجلدات الاختبار، يجب أن تكون المسارات صحيحة وقابلة للإعداد ضمن بيئة التنفيذ.

التأكد من هيكلة المشروع بشكل صحيح

تعتبر هيكلة المشروع مهمة جدًا. في حالة المثال المعطى، يجب التأكد من أن المسارات المستخدمة في استيراد الوحدات صحيحة. على سبيل المثال، إذا كنت تستخدم from tests.model import test_streamlit، يجب أن تتأكد من أن مجلد tests مُعترف به كمجلد بايثون من خلال وجود ملف __init__.py في كل من المجلدات الرئيسية.

ملف GitHub Actions

من الضروري التأكد من أن ملف GitHub Actions (.github/workflows/...) تم إعداده بشكل صحيح. يجب أن يتضمن جميع الخطوات المطلوبة لتحميل الحزم اللازمة قبل محاولة تشغيل الاختبارات. كما يجب أن يتم تحديد المسار الصحيح إلى متطلبات المشروع (requirements.txt). إذا كانت هناك ملفات متطلبات مختلفة لكل مشروع، فيجب تحديد الملف الصحيح الذي يحتوي على الاعتماديات اللازمة.

الحلول المقترحة

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

كما يجب التأكد من استخدام pytest بشكل صحيح. يمكن أن تتطلب بعض المشاريع إعداد بعض المتغيرات البيئية أو ضبط المتغير PYTHONPATH ليشمل المسارات الصحيحة.

استخدام Pytest بشكل فعال

يمكن للمستخدمين أيضا تشغيل pytest باستخدام خيارات مثل --rootdir لتحديد المجلد الجذري للمشروع. مثال على ذلك:

pytest --rootdir=homework_9/pr1

هذا يضمن أن pytest يبحث في المكان الصحيح ضمن هيكلية المشروع عن الوحدات اللازمة للتشغيل.

خلاصة

ليس من غير المعتاد أن تواجه خطأ ModuleNotFoundError: No module named أثناء اختبار البرامج، خاصة في بيئات CI/CD مثل GitHub Actions. من الضروري مراجعة بنية المشروع، والتأكد من إعداد المسارات بشكل صحيح، واستخدام أدوات مثل pytest بكفاءة. إذا تم تطبيق الحلول المقترحة، فمن المحتمل أن يتلاشى هذا الخطأ، مما يسمح لك بإجراء اختباراتك بنجاح.

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

فهد السلال

خبير تقني متخصص في شروحات الكمبيوتر والإنترنت والموبايل، يتمتع بخبرة واسعة في تقديم حلول تقنية مبتكرة ومبسطة. يهدف فهد إلى مساعدة المستخدمين على تحسين تجربتهم التقنية من خلال مقالات وأدلة عملية واضحة وسهلة الفهم.
زر الذهاب إلى الأعلى
Don`t copy text!

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

إعدادات ملفات تعريف الارتباط  

فيما يلي يمكنك اختيار نوع ملفات تعريف الارتباط التي تسمح بها على هذا الموقع. انقر على زر "حفظ إعدادات ملفات تعريف الارتباط" لتطبيق اختيارك.

ملفات ضرورية.يستخدم موقعنا ملفات تعريف الارتباط الوظيفية. هذه الملفات ضرورية لعمل موقعنا بشكل صحيح.

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

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

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

أخرى.يضع موقعنا ملفات تعريف الارتباط من جهات خارجية أخرى ليست تحليلية أو خاصة بوسائل التواصل الاجتماعي أو الإعلانات.