تعرّف على كيفية اختبار تمارين Python الخاصة بك على Exercism.
نستخدم pytest كمشغّل اختبارات على موقعنا.
ستحتاج إلى تثبيت pytest على جهاز التطوير لديك إذا أردت تنزيل اختبارات التمارين لمسار Python وتشغيلها محليًا.
ينبغي أيضًا أن تثبّت إضافات pytest التالية:
نوصي أيضًا باستخدام برنامج فحص الكود pylint، فهو جزء من التغذية الراجعة الآلية على الموقع، ويمكن أن يكون أداة مفيدة جدًا لتحليل الكود الساكن.
وللسهولة في الاستخدام، تتيح لك إضافة pytest-pylint الخاصة بـ pytest تشغيل pylint عبر pytest من سطر الأوامر.
قد يكون ضبط Pylint مرهقًا بعض الشيء، لذا قد يفيدك هذا البرنامج التعليمي من pylint.readthedocs.io للبدء، وكذلك هذه النظرة العامة على جودة الكود: الأدوات وأفضل الممارسات من Real Python.
يمكن تثبيت Pytest وتحديثه باستخدام أداة Python المدمجة pip.
لمزيد من النصائح، لدى Brett Cannon دليل سريع وعملي حول كيفية تثبيت الحزم في python، مع شرح رائع لـ لماذا ينبغي أن تستخدم python -m pip.
لمزيد من المعلومات عن وسائط سطر الأوامر في Python، راجع سطر الأوامر والبيئة في وثائق Python.
ملاحظة: قد يكون Python3 وpy اسمين بديلين لـ Python على نظامك، وقد لا يكونان كذلك.
عدّل أوامر التثبيت أدناه وفقًا لذلك.
لتثبيت pytest في بيئة افتراضية، تأكد من أن البيئة مفعّلة قبل تنفيذ الأوامر.
وإلا فسيكون تثبيت pytest عامًّا.
PS C:\Users\foobar> py -m pip install pytest pytest-cache pytest-subtests pytest-pylint
Successfully installed pytest-8.3.3 ...
$ python3 -m pip install pytest pytest-cache pytest-subtests pytest-pylint
Successfully installed pytest-8.3.3 ...
للتحقق من نجاح التثبيت:
$ python3 -m pytest --version
pytest 8.3.3
لتشغيل الاختبارات، انتقل إلى المجلد الذي يوجد فيه التمرين باستخدام cd في الطرفية (استبدل <exercise-folder-location> أدناه بمسارك).
$ cd <exercise-folder-location>
تشير <exercise-folder-location> أو معظم الأشياء داخل الأقواس الزاوية إلى قيمة بديلة.
وينبغي كتابة المسار أو اسم الملف العادي بدون أي أقواس.
على سبيل المثال: /Users/janedoe/exercism/python/exercises/concept/chaitanas-colossal-coaster (على أنظمة *nix)، أو C:\Users\janedoe\exercism\python\exercises\practice\hello-world\ (على Windows)، أو myFolder أو my_file.py.
الملف الذي ستحتاج إلى تشغيله ينتهي عادةً بـ _test.py.
يحتوي هذا الملف على اختبارات حل التمرين، وهي نفس الاختبارات التي تُشغَّل على الموقع عند رفع الحل.
بعد ذلك، نفّذ الأمر التالي في الطرفية، مع استبدال <exercise_test.py> بموقع/اسم ملف الاختبار:
$ python3 -m pytest -o markers=task <exercise_test.py>
==================== 7 passed in 0.08s ====================
إذا لم تستخدم pytest -o markers=task في الأمر أعلاه، فمن المحتمل أن تظهر لك warnings بشأن "unknown markers" عند تشغيل اختبار يستعمل الصياغة الجديدة لدينا.
لتجنّب كتابة pytest -o markers=task في كل اختبار تشغّله، يمكنك استخدام ملف الإعدادات pytest.ini، الذي يمكن تنزيله من المستوى الأعلى لمجلد مسار Python: pytest.ini.
ويمكنك أيضًا إنشاء ملف pytest.ini خاص بك بالمحتوى التالي:
[pytest]
markers =
task: A concept exercise task.
وضع هذا الملف في المجلد الجذر أو المجلد العامل لتمارين Exercism يسجّل العلامات ويوقف التحذيرات.
يمكنك العثور على مزيد من المعلومات عن علامات pytest في وثائق pytest حول تعليم دوال الاختبار ووثائق pytest حول العمل مع علامات مخصّصة.
يمكنك العثور على مزيد من المعلومات حول تخصيص إعدادات pytest في وثائق pytest حول تنسيقات ملفات الإعدادات
عند فشل الاختبارات، يطبع pytest نص كل اختبار فاشل إلى الطرفية، مع قيمتَي return المتوقعة والفعلية لكل منها.
فيما يلي مثال عام على اختبار فاشل:
$(my_venv) python3 -m pytest -o markers=task <exercise_test.py>
=================== FAILURES ====================
______________ name_of_failed_test ______________
# Test code inside of <exercise_test.py> that failed.
...
E TypeOfError: ReturnedValue != ExpectedValue
exercise_test.py:<line_of_failed_test>: TypeOfError
============ short test summary info ============
FAILED exercise_test.py::ExerciseTest::name_of_failed_test
========== 1 failed, 2 passed in 0.13s ==========
إذا أردت حقًّا تحديد ما يعرضه pytest على شاشتك بدقة، فإليك بعض وسائط سطر الأوامر المفيدة التي تتيح لك ضبط سلوكه.
-v]إضافة العلامة -v (verbose) تعرض معلومات البيئة وملخص الاختبارات بالإضافة إلى حالات فشل الاختبارات:
$(my_venv) python3 -m pytest -o markers=task -v exercises/<exercise_name>/<test_file_test.py>
======================================== test session starts ===========================================
platform darwin -- Python 3.9.0, pytest-6.2.5, -- /usr/local/envs/my_env/bin/python3
cachedir: .pytest_cache
metadata: {'Python': '3.9.0', 'Platform': 'macOS-10.14.6-x86_64-i386-64bit', 'Packages': {'pytest': '6.2.1'}, 'Plugins': {'subtests': '0.5.0', 'pylint': '0.18.0'}
rootdir: /Users/<user>/exercism/python, configfile: pytest.ini
plugins: subtests-0.5.0, pylint-0.18.0
collected 5 items
exercises/exercise-name/exercise_file_test.py::ExerciseNameTest::test_one FAILED [ 20%]
exercises/exercise-name/exercise_file_test.py::ExerciseNameTest::test_two FAILED
exercises/exercise-name/exercise_file_test.py::ExerciseNameTest::test_three PASSED [ 40%]
exercises/concept/exercise-name/exercise_file_test.py::ExerciseNameTest::test_four FAILED
exercises/concept/exercise-name/exercise_file_test.py::ExerciseNameTest::test_five PASSED [ 60%]
exercises/concept/exercise-name/exercise_file_test.py::ExerciseNameTest::test_six FAILED
exercises/concept/exercise-name/exercise_file_test.py::ExerciseNameTest::test_seven PASSED [ 80%]
exercises/concept/exercise-name/exercise_file_test.py::ExerciseNameTest::test_eight FAILED
exercises/concept/exercise-name/exercise_file_test.py::ExerciseNameTest::test_nine PASSED [100%]
================================================ FAILURES ======================================================
# Failed tests are then individually printed out below
.......
-x]استخدام العلامة -x يشغّل الاختبارات كالمعتاد، لكنه يوقف تشغيل الاختبارات عند أول فشل في أحدها.
ويفيد ذلك عندما تريد تصحيح مهمة واحدة أو فشل اختبار واحد في كل مرة:
$(my_venv) python3 -m pytest -o markers=task -x exercises/<exercise_name>/<test_file_test.py>
=================== FAILURES ====================
_______________ example_test_foo ________________
...
...
============ short test summary info ============
FAILED example_test.py::ExampleTest::example_test_foo
!!!!!!!!!!! stopping after 1 failures !!!!!!!!!!!
========== 1 failed, 5 passed in 0.28s ==========
--ff]تتذكّر إضافة pytest-cache الاختبارات التي فشلت في آخر مرة شغّلت فيها pytest، لذا فإن استخدام العلامة --ff يخبر pytest بتشغيل الاختبارات التي فشلت سابقًا أولًا، ثم المتابعة ببقية الاختبارات.
قد يسرّع هذا اختباراتك إذا كنت تجري الكثير من الإصلاحات الصغيرة حول مهمة معينة أو مجموعة مدخلات معينة.
$(my_venv) python3 -m pytest -o markers=task --ff <example_file_test.py>
==================== 7 passed in 503s ====================
نوصي باستخدام الأوامر التالية لجعل تصحيحك أسهل و(ربما) أسرع:
غيّر أولًا مجلد العمل الحالي إلى مجلد التمرين الذي تريد اختباره:
$(my_venv) cd path/to/exercise
ثم شغّل الاختبارات مع الوسيطين -x و--ff اللذين شرحناهما سابقًا:
$(my_venv) python3 -m pytest -o markers=task -x --ff <example_file_test.py>
سيؤدي هذا إلى اختبار حلّك.
عندما يصادف pytest اختبارًا فاشلًا، يتوقف البرنامج ويخبرك بالاختبار الذي فشل.
وعندما تجري إصلاحات وتشغّل الاختبار مرة أخرى، يشغّل pytest أولًا الاختبار الذي فشل سابقًا، ثم يتابع ببقية الاختبارات.
إذا أردت أن "تصحّح الأخطاء باحتراف"، يمكنك استخدام الوسيط --pdb بعد أمر pytest، والدخول إلى مصحّح أخطاء Python المدمج، PDB.
$(my_venv) python3 -m pytest -o markers=task -x --ff --pdb <example_file_test.py>
=============== 4 passed in 0.15s ===============
عند فشل اختبار، فإن الدخول إلى PDB يتيح لك التنقل خطوة بخطوة في كودك مع رؤية النطاق الحالي، وكذلك التحقق من قيم المتغيرات وتوقيع الدوال المختلفة.
يمكنك العثور على مزيد من التفاصيل عن وحدة PDB في وثائق Python حول PDB.
بالإضافة إلى ذلك، فإن وثائق pytest حول PDB وهذا الدليل من Real Python مفيدة للغاية.
إذا أردت توسيع بيئة التطوير المتكاملة لديك ببعض الأدوات التي تساعدك على اختبار كودك وتحسينه، فراجع صفحة الأدوات. نستعرض هناك عدة بيئات تطوير متكاملة ومحرّرات وبعض الإضافات المفيدة لفحص الكود وتصحيح الأخطاء.
ملاحظة: إذا ثبّت Python على Windows عبر مثبّت PSF، فسيكون الأمر py بدلًا من python3.
قد تصبح كتابة python3 -m في كل مرة تريد تشغيل وحدة أمرًا مزعجًا بعض الشيء.
لتجنب ذلك، يمكنك إضافة مجلد Scripts الخاص بتثبيت Python إلى مسارك (path).
وإذا لم تكن تعرف أين ثبّت Python، فنفّذ الأمر التالي في الطرفية:
$ python3 -c "import os, sys; print(os.path.dirname(sys.executable))"
<python_directory>
المجلد المُرجَع هو المكان الذي ثُبّت فيه نسخة Python النشطة حاليًا، ويُشار إليه في هذا القسم بـ <python_directory>.
انقر زر Windows Start وابحث عن Edit the system environment variables ثم اضغط Enter.
بعد ذلك اضغط Environment Variables...:

ثم ابحث عن المتغير Path في User variables لديك، وحدده، وانقر Edit...:

ثم أضف سطرًا جديدًا، كما في الصورة، مع استبدال <python_directory> بمجلد تثبيت Python لديك:

ينبغي أن يعمل ما يلي مع معظم توزيعات Linux وإصدارات MacOS التي تستخدم صدفة bash.
وقد تختلف الأوامر بحسب توزيعة Linux، وما إذا كانت الصدفة fish أو zsh.
استبدل <python_directory> بناتج python3 -c "import os, sys; print(os.path.dirname(sys.executable))"
export PATH="$PATH:<python_directory>"