الاختبار من الصفر إلى الاحترافمجاني

باي تيست

من أول assert إلى fixtures و parametrize والمحاكاة (mocking) وقياس التغطية وكتابة إضافتك الخاصة — الطريق الكامل لاختبار كود بايثون. ست خطوات واختبار من عشرة أسئلة في كل فصل.

الخطوات الست في كل فصل

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