الاختبار من الصفر إلى الاحترافمجاني
باي تيست
من أول assert إلى fixtures و parametrize والمحاكاة (mocking) وقياس التغطية وكتابة إضافتك الخاصة — الطريق الكامل لاختبار كود بايثون. ست خطوات واختبار من عشرة أسئلة في كل فصل.
الخطوات الست في كل فصل
- 1المشكلة
- 2الفهم
- 3أمثلة محلولة
- 4التوقع
- 5التطبيق
- 6التحدي
- 00قبل أن تكتب اختباراً — ما الذي تحتاجه فعلاًالتفكير الذي يسبق أي كود اختبار: تحويل متطلب غامض إلى عقد دقيق، وجعل الكود قابلاً للاختبار، واختيار الحالات مع الحدود، ومعرفة الإجابة المتوقعة دون تشغيل الكود، وتحديد ما لا يُختبر — كل ذلك ببايثون العادية و assert.50 دقيقة١٠ أسئلة
- 01تثبيت pytest واختبارك الأوللماذا يتوقف التحقق اليدوي عن النفع، ولماذا لا تخبرك assert المجردة بشيء تقريباً، وكيف تثبّت pytest وتكتب أول ملف اختبار وتشغّله. مع قراءة النقاط وسطر الملخص و -q و -v ورموز الخروج.40 دقيقة١٠ أسئلة
- 02assert وقراءة تقارير الفشلكيف يرى pytest ما بداخل assert عادية، وكيف تقرأ تقرير الفشل سطراً سطراً، وأي مقارنة تكتبها ليخبرك التقرير بأكبر قدر ممكن.45 دقيقة١٠ أسئلة
- 03اكتشاف الاختبارات وتشغيلها — ما الذي يشغّله pytest وكيف تختارأي الملفات والدوال والأصناف يعدّها pytest اختبارات، واستيراد كودك من بنية src/ و tests/، ومعرّفات العقد، وتشغيل ما تحتاجه بالضبط بـ -k و -x و --lf و --ff و --co.45 دقيقة١٠ أسئلة
- 04اختبار الاستثناءات — pytest.raisesالأخطاء سلوك أيضاً، ولذلك تحتاج إلى اختبارات. pytest.raises و DID NOT RAISE ومطابقة الأصناف الفرعية، ولماذا match= تعبير نمطي، وفحص الخطأ الملتقط عبر excinfo، ولماذا لا يوضع داخل كتلة with إلا السطر الأخير.45 دقيقة١٠ أسئلة
- 05الأعداد العشرية و pytest.approx — اختبار "القريب بما يكفي"لماذا تكون 0.1 + 0.2 == 0.3 خاطئة، وما الهامش الافتراضي في pytest.approx، ومتى تحتاج rel و abs، ولماذا يحتاج المال إلى Decimal لا إلى approx. مع NaN والنتائج غير المرتبة والطوابع الزمنية.35 دقيقة١٠ أسئلة
- 06parametrize — اختبار واحد وحالات كثيرةاستبدال الاختبارات المنسوخة والحلقات داخل الاختبار بـ @pytest.mark.parametrize. معرّفات الاختبارات و ids= و pytest.param، وتكديس المزخرفات، والقيم والأخطاء في جدول واحد، والأخطاء الشائعة.45 دقيقة١٠ أسئلة
- 07الـ Fixtures — تهيئة تُكتب مرة واحدةتوقّف عن تكرار التهيئة: اكتبها مرة واحدة بـ @pytest.fixture، واطلبها باسمها، واحصل على نسخة جديدة في كل اختبار، ونظّف بـ yield حتى حين يفشل الاختبار.45 دقيقة١٠ أسئلة
- 08نطاق الـ fixture وملف conftest.py — مشاركة التهيئة بأمانابنِ التهيئة البطيئة مرة واحدة وشاركها: النطاقات الخمسة، و--setup-show، وخطر الحالة المشتركة و ScopeMismatch، وconftest.py لـ fixtures بلا استيراد وتجاوزها لكل مجلد، وكلفة autouse، وترتيب إنشاء الـ fixtures.50 دقيقة١٠ أسئلة
- 09الـ fixtures المدمجة — tmp_path و capsys و caplogالـ fixtures التي يأتي بها pytest للمواضع المزعجة في الاختبار: الملفات والمخرجات المطبوعة والسجلات. اختبار كود يكتب CSV و JSON دون لمس مسارات حقيقية، والتحقق مما يطبعه ويسجّله.45 دقيقة١٠ أسئلة
- 10monkeypatch — التحكم في البيئة والوقت والشبكةاختبار الكود الذي يعتمد على متغيرات البيئة أو الساعة أو العشوائية أو الشبكة. setenv و delenv و setattr و setitem و chdir، والإلغاء التلقائي بعد كل اختبار، وقاعدة "رقّع حيث يُبحث عن الاسم"، وحقن الاعتمادية الذي لا يحتاج إلى ترقيع.50 دقيقة١٠ أسئلة
- 11المحاكاة (Mocking) — التحقق من طريقة استدعاء خدمة خارجيةضع Mock بديلاً عن عميل دفع أو بريد وتحقق من طريقة استدعائه. return_value و side_effect و autospec و patch و mocker — ومتى يتفوق الـ fake على الـ mock.50 دقيقة١٠ أسئلة
- 12العلامات و skip و xfail — أي اختبار يعمل وأينأخبر pytest بما يحتاجه كل اختبار وبما تتوقعه منه عبر skip و skipif و importorskip و xfail؛ ومعنى strict=True و raises= و XPASS؛ وسجّل علاماتك الخاصة واختر بـ -m؛ إضافة إلى fixtures ذات المعاملات و fixtures المصنع.50 دقيقة١٠ أسئلة
- 13الإعدادات والتحذيرات — القواعد في ملف واحدكفّ عن كتابة الخيارات نفسها في كل تشغيل: ضع قواعد المشروع في pyproject.toml أو pytest.ini — testpaths و addopts و pythonpath و markers و xfail_strict و log_cli — واختبر التحذيرات وتحكّم فيها بـ pytest.warns و deprecated_call و filterwarnings.55 دقيقة١٠ أسئلة
- 14التغطية و CI — أي الأسطر لم تشغّلها اختباراتك قط؟قياس التغطية باستخدام pytest-cov، وقراءة عمود Missing، وتغطية الفروع، وفرض حد أدنى، وتشغيل الاختبارات بالتوازي باستخدام pytest-xdist، وتشغيل المجموعة كاملة مع كل دفع عبر GitHub Actions. ولماذا لا تعني تغطية 100% أن الكود صحيح.50 دقيقة١٠ أسئلة
- 15الاختبارات غير المتزامنة و hooks وكتابة إضافةاختبار الكود غير المتزامن باستخدام pytest-asyncio، ثم توسيع pytest عبر hooks في conftest.py — خيار --runslow وعلامة وسطر في رأس التقرير — وأخيراً تحويل ذلك إلى إضافة خاصة بك واختبارها باستخدام pytester.60 دقيقة١٠ أسئلة
- 16تصميم الاختبارات و TDD — ما الذي يجعل الاختبار جيداًالتخطيط للاختبار قبل كتابته، ونمط Arrange-Act-Assert، واختبار السلوك لا طريقة التنفيذ، ودورة red-green-refactor، والاختبار القائم على الخصائص مع Hypothesis، وأسباب الاختبارات المتقلبة وعلاجها، واختبار انحدار لكل خلل.60 دقيقة١٠ أسئلة