أبعد 
غالبًا ما يتم تجاهل اختبار البرامج المنهجي ، خاصة في مجتمع Python ، أو يتم إجراؤه بطريقة خاصة. العديد من مبرمجي Python غير مدركين تمامًا لوجود pytest. يواجه برايان أوكن المتاعب لإثبات أن اختبار البرامج باستخدام pytest سهل وطبيعي بل ومثير للاهتمام.
ديمتري زينوفييف
مؤلف أساسيات علوم البيانات في Python

تمت كتابة الأمثلة في هذا الكتاب باستخدام Python 3.6 و pytest 3.2. يدعم pytest 3.2 Python 2.6 و 2.7 و Python 3.3+.
يتوفر رمز المصدر لمشروع المهام ، وكذلك لجميع الاختبارات الموضحة في هذا الكتاب ، على الرابط الموجود على صفحة الويب الخاصة بالكتاب على pragprog.com . لا تحتاج إلى تنزيل شفرة المصدر لفهم رمز الاختبار ؛ يتم تقديم رمز الاختبار في شكل مناسب في الأمثلة. ولكن من أجل متابعة مهام المشروع ، أو تكييف أمثلة الاختبار لاختبار مشروعك الخاص (يديك غير مقيدة!) ، يجب عليك الانتقال إلى صفحة الويب الخاصة بالكتاب وتنزيل العمل. هناك ، على صفحة الويب للكتاب ، هناك رابط لرسائل خطأ ومنتدى للنقاش .
تحت المفسد قائمة بالمقالات في هذه السلسلة.
شكر وتقدير
أولا يجب أن أشكر ميشيل - زوجتي وأفضل صديق لي. من المؤسف أنك لا ترى الغرفة التي أكتب فيها. بدلاً من الطاولة ، لدي طاولة طعام قديمة من خشب البلوط ، حيث توجد مساحة كافية لوضع الورق. خزانة زجاجية جميلة مع ألعاب الفضاء القديمة التي جمعناها على مر السنين ، بالإضافة إلى الكتب الفنية ولوحات الدوائر وكرات التلاعب. صناديق ألومنيوم قديمة لتخزين الورق في الأعلى مملوءة بالملاحظات والحبال وحتى الملصقات المتبقية للصواريخ. جدار واحد مغطى بالمخمل ، الذي اشتريناه قبل سنوات عديدة ، عندما قرر متجر الأقمشة إغلاقه إلى الأبد. يجب أن يهدئ القماش صدى الصوت عند تسجيل البودكاست.
أحب أن أكتب هنا ليس فقط لأنها مريحة ومتسقة مع عالمي الداخلي ، ولكن أيضًا لأنها المساحة التي أنشأها ميشال معي ولي. لقد كنت أنا وفريقًا دائمًا ، ودعمت أفكاري المجنونة بشكل لا يصدق لكتابة مدونة ، أو بدء بودكاست أو اثنتين ، والآن ، على مدار العام الماضي أو نحو ذلك ، اكتب هذا الكتاب. تأكدت من أن لدي الوقت والمساحة للكتابة. عندما أشعر بالتعب والتفكير فيما إذا كان لا يزال لدي القدرة على الكتابة ، فإنها تعرض علي الاستمرار لمدة عشرين دقيقة ومشاهدة كيف سأشعر حينها ، وفعلت الشيء نفسه عندما ساعدتني حتى وقت لاحق ليالي الكلية. أنا حقًا ، لم أستطع فعل ذلك بدونها.
لدي أيضًا ابنتان مذهلتان ورائعتان ورائعتان ، غابرييلا وصوفيا ، وهما من أكبر المعجبين بي. تقدم Ella لكل من يتحدث عن البرمجة للاستماع إلى البودكاست الخاص بي ، وقد تبنت Phia ملصقًا لرمز الاختبار على حقيبتها ، والذي حصلت عليه في الصف الثاني.
هناك الكثير من الناس لأشكرهم.
ساعدتني محرري ، كاثرين دفوراك ، على تجميع مجموعة من الأفكار والمواضيع العشوائية في تطور متماسك ، وهذا هو السبب في أن هذا كتاب ، وليس سلسلة من منشورات المدونات التي يتم تجميعها معًا. لقد دخلت في هذا المشروع كمدونة ، وتعلقت كثيرًا بالعناوين الرئيسية والعناوين الفرعية وعناصر القوائم ، وأرشدني كاتي بصبر حتى أتمكن من أن أصبح كاتبًا أفضل.
بفضل سوزان ديفيدسون بالاتينات ، أندي هانت وباقي رف الكتب العملي لإعطائي فرصة.
لقد أبقاني المراجعون الفنيون صريحين في pytest ، ولكن أيضًا بأسلوب Python ، وهم السبب في أن أمثلة التعليمات البرمجية تتبع PEP 8. بفضل Oliver Bestwalter و Florian Bruhin و Floris Bruinog و Mark Goody و Peter Hampton و Dave Hunt و Al Crinker و Lokesh كومارو ماكاني ، برونو أوليفيرا ، روني بفانشميت ، رافائيل بيرزين ، لوسيانو رامالو ، فرانك رويز و دميتري زينوفييف. العديد من هذه القائمة هم أيضًا مطورو نواة pytest و / أو يدعمون مكونات pytest المذهلة.
شكر خاص لوسيانو. بعد كتابة هذا الكتاب ، أرسلت الفصول الأربعة الأولى إلى العديد من المراجعين. كان لوسيانو واحدًا منهم ، وكانت قراءته الأكثر صعوبة في القراءة. لا أعتقد أنني اتبعت جميع نصائحه ، ولكن بسبب ملاحظاته ، قمت بمراجعة وإعادة كتابة معظم الفصول الثلاثة الأولى وغيرت شيئًا في بقية الكتاب.
بفضل فريق pytest-dev بأكمله لإنشاء أداة اختبار رائعة. بفضل Oliver Bestwalter و Florian Bruhin و Floris Bruinoohe و Dave Hunt و Holger Kreckel و Bruno Oliveira و Ronnie Pfannschmidt و Rafael Pierzine وغيرهم الكثير للإجابة على أسئلتي حول الحياة على مر السنين.
وأخيرًا وليس آخرًا ، أود أن أشكر الأشخاص الذين شكروني. انتهزوا الفرصة لإخباري عبر البريد الإلكتروني بأن عملي وفر وقتهم وجعل العمل أسهل. هذا رائع ويسعدني! شكرا لك!
براين أوكين
سبتمبر 2017
مقدمة
يتزايد استخدام Python ليس فقط في تطوير البرمجيات ، ولكن أيضًا في مجالات مثل تحليل البيانات والبحث والاختبار والقياس ، وكذلك في الصناعات الأخرى. ويصاحب تطوير Python في العديد من المجالات الحاسمة أيضًا الرغبة في إجراء اختبارات البرامج بشكل صحيح وفعال وفعال لضمان عمل البرامج بشكل صحيح وإعطاء النتائج الصحيحة. بالإضافة إلى ذلك ، فإن المزيد والمزيد من مشاريع البرامج تمتد عبر التكامل المستمر وتتضمن مرحلة اختبار مؤتمت حيث يتم تقصير دورات الإصدار ولا يمكن ببساطة إجراء اختبار يدوي دقيق للمشروعات المعقدة بشكل متزايد. يجب أن تكون الفرق قادرة على الوثوق في الاختبارات التي تجريها خوادم التكامل المستمر التي تخبرهم إذا كان بإمكانهم الوثوق ببرامجهم بما يكفي لإطلاقها.
أدخل pytest.
ما هو pytest؟
أداة اختبار Python موثوقة ، يمكن استخدام pytest لجميع أنواع ومستويات اختبار البرمجيات. يمكن استخدام pytest من قبل فرق التطوير وفرق ضمان الجودة ومجموعات الاختبار المستقلة والأفراد الذين يمارسون TDD ومشاريع مفتوحة المصدر. في الواقع ، تحولت المشاريع عبر الإنترنت من unittest أو الأنف إلى pytest ، بما في ذلك Mozilla و Dropbox. لماذا؟ لأن pytest يقدم ميزات قوية مثل إعادة كتابة "تأكيد" ، ونماذج الإضافات الخارجية ونموذج تركيبات قوي وبسيط لا مثيل له في أي إطار اختبار آخر.
pytest عبارة عن منصة اختبار برمجية ، مما يعني أن pytest هو برنامج سطر أوامر. أداة تعثر تلقائيًا على الاختبارات المكتوبة ، وتدير الاختبارات وتكتب التقارير بالنتيجة. يحتوي على مكتبة من المستحضرات التي يمكنك استخدامها في الاختبارات لمساعدتك على الاختبار بشكل أكثر كفاءة. يمكن توسيعه عن طريق كتابة المكونات الإضافية الخاصة بك أو تثبيت مكونات خارجية. يمكن استخدامه لاختبار توزيعات Python. وهو يندمج بسلاسة مع أدوات أخرى مثل التكامل المستمر وأتمتة الويب.
فيما يلي بعض الأسباب التي تجعل pytest تبرز من بين العديد من اختبارات النظام المتكاملة الأخرى:
- من السهل كتابة الاختبارات البسيطة في pytest.
- الاختبارات المعقدة أسهل في الكتابة.
- الاختبارات سهلة القراءة.
- الاختبارات سهلة القراءة. (من المهم جدًا الإشارة إلى ذلك مرتين).
- يمكنك البدء في ثوان.
assert
استخدام assert
لفشل الاختبار ، وليس self.assertEqual()
أو self.assertLessThan()
. أكد فقط!- يمكنك استخدام pytest لإجراء اختبارات مكتوبة للقلق أو الأنف.
تم تطوير pytest بنشاط ودعمه من قبل مجتمع متحمس ومتنامي. إنه قابل للتوسيع والمرونة بحيث يتناسب بسهولة مع سير عملك. وبما أنه مثبت بشكل منفصل عن إصدار Python الخاص بك ، يمكنك استخدام أحدث إصدار من pytest على Python 2 القديم (2.6 وما فوق) و Python 3 (3.3 وما فوق).
تعلم pytest عند اختبار تطبيق مثال
هل ترغب في تعلم pytest باختبار أمثلة سخيفة لن تراها في الحياة الحقيقية؟ أنا أيضًا. لن نقوم بذلك في هذا الكتاب. بدلاً من ذلك ، سنكتب اختبارات لمشروع آمل أن يكون له الكثير من القواسم المشتركة مع التطبيقات التي ستختبرها بعد قراءة هذا الكتاب.
مشروع المهام
التطبيق الذي سنلقي نظرة عليه يسمى المهام. تعد المهام تطبيقًا بسيطًا لتتبع المهام مع واجهة سطر أوامر. لديها ما يكفي من القواسم المشتركة مع العديد من أنواع التطبيقات الأخرى ، والتي آمل أن تتمكن بسهولة من رؤية كيف أن مفاهيم الاختبار التي تتعلمها عند تطوير اختبارات ضد المشكلات تنطبق على مشاريعك الآن وفي المستقبل.
على الرغم من أن المهام تحتوي على واجهة سطر الأوامر (CLI) ، إلا أن CLI تتفاعل مع باقي التعليمات البرمجية من خلال واجهة برمجة التطبيقات (API). واجهة برمجة التطبيقات (API) هي الواجهة التي سنوجه إليها معظم اختباراتنا. يتفاعل API مع طبقة إدارة قاعدة البيانات التي تتفاعل مع قاعدة بيانات المستندات - MongoDB أو TinyDB . يتم تكوين نوع قاعدة البيانات عند تهيئة قاعدة البيانات. قبل التركيز على واجهة برمجة التطبيقات ، دعنا نلقي نظرة على المهام نفسها ، وهي أداة سطر أوامر توفر واجهة مستخدم للمهام.
هنا مثال على جلسة:
$ tasks add 'do something' --owner Brian $ tasks add 'do something else' $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian False do something 2 False do something else $ tasks update 2 --owner Brian $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian False do something 2 Brian False do something else $ tasks update 1 --done True $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian True do something 2 Brian False do something else $ tasks delete 1 $ tasks list ID owner done summary -- ----- ---- ------- 2 Brian False do something else $
ملاحظة المترجم: في حالة استخدام نظام Windows الأساسي ، واجهت العديد من المشاكل عند اختبار هذه الجلسة.
- يجب إنشاء مجلد لقاعدة بيانات
tasks_db
باسم tasks_db
في مجلد المستخدم. على سبيل المثال c:\Users\User_1\tasks_db\
- استخدم علامات الاقتباس بدلاً من الفواصل العليا. خلاف ذلك ، نحصل على مثل هذا الخطأ.
مهام $ تضيف "افعل شيئًا آخر"
الاستخدام: إضافة المهام ملخص [خيارات]
خطأ: حصلت على وسيطات إضافية غير متوقعة (شيء آخر ')
هذا ليس أصعب تطبيق لإدارة المهام ، ولكنه معقد بما يكفي لاستخدامه لدراسة الاختبار.
استراتيجية الاختبار
على الرغم من أن pytest مناسبة لاختبار الوحدة أو اختبار التكامل أو اختبار النظام أو الاختبار الشامل والاختبار الوظيفي ، فإن استراتيجية اختبار مشروع المهام تركز بشكل أساسي على الاختبار الوظيفي تحت الجلد. فيما يلي بعض التعاريف المفيدة:
- اختبار الوحدة : اختبار يختبر جزءًا صغيرًا من التعليمات البرمجية ، مثل دالة أو فئة ، بمعزل عن باقي النظام. أقوم بمراجعة الاختبارات الواردة في الفصل الأول ، البدء باستخدام pytest ، في الصفحة 1 ، لإجراء اختبارات الوحدة. بنية بيانات المهام.
- اختبار التكامل : اختبار يختبر قطعة أكبر من الكود يمكن أن يتضمن عدة فئات أو أنظمة فرعية. في الغالب تكون التسمية المستخدمة في بعض الاختبارات أكبر من اختبار الوحدة ، ولكنها أصغر من اختبار النظام.
- اختبار النظام (من طرف إلى طرف) : اختبار يختبر النظام بأكمله قيد الاختبار في بيئة قريبة قدر الإمكان من بيئة المستخدم النهائي.
- الاختبار الوظيفي : اختبار يقوم باختبار جزء واحد من وظائف النظام. الاختبار الذي يختبر مدى جودة إضافة أو إزالة أو تحديث عنصر مهمة في المهام هو اختبار وظيفي.
- اختبار تحت الجلد : اختبار يتم إجراؤه ليس لواجهة المستخدم النهائي ، ولكن لواجهة تقع أسفل السطح مباشرة. نظرًا لأن معظم الاختبارات في هذا الكتاب يتم اختبارها على مستوى واجهة برمجة التطبيقات ، وليس CLI ، فهي مؤهلة كاختبارات تحت الجلد.
كيف يتم تنظيم هذا الكتاب؟
في الفصل 1 ، "البدء باستخدام pytest" في الصفحة 1 ، تقوم بتثبيت pytest والاستعداد لاستخدامه. ثم تأخذ جزءًا واحدًا من مشروع المهام - بنية بيانات تمثل مهمة واحدة (تسمى مجموعة المهام) ، وتستخدمها لاختبار الأمثلة. سوف تتعلم كيفية تشغيل pytest مع العديد من ملفات الاختبار. سترى العديد من خيارات سطر الأوامر الشائعة والمفيدة للغاية لـ pytest ، مثل القدرة على إعادة تشغيل إخفاقات الاختبار ، وإيقاف التنفيذ بعد الفشل الأول ، والتحكم في تتبع المكدس وإصدار متعدد الصفحات من التشغيل التجريبي ، وأكثر من ذلك بكثير.
في الفصل 2 ، "إنشاء وظائف الاختبار" ، في الصفحة 23 ، تقوم بتثبيت المهام محليًا باستخدام النقطة ومعرفة كيفية تنظيم الاختبارات في مشروع Python. يجب عليك القيام بذلك من أجل البدء في كتابة الاختبارات لتطبيق حقيقي. تعمل جميع الأمثلة في هذا الفصل على اختبارات التطبيق المثبت ، بما في ذلك الكتابة إلى قاعدة البيانات. وظائف الاختبار الفعلي هي محور هذا الفصل وسوف تتعلم كيفية استخدام assert
بشكل فعال في الاختبارات. سوف تتعلم أيضًا عن العلامات. وظيفة تسمح لك بتمييز العديد من الاختبارات التي سيتم تشغيلها في وقت واحد ، أو وضع علامة على الاختبارات التي سيتم تخطيها ، أو إخبار pytest بأننا نعرف بالفعل أن بعض الاختبارات ستفشل. سأتحدث عن كيفية تشغيل بعض الاختبارات فقط ، ليس فقط مع العلامات ، ولكن أيضًا من خلال هيكلة كود الاختبار في الدلائل والوحدات والفصول ، وكيفية تشغيل هذه المجموعات الفرعية من الاختبارات.
لا يتم تضمين جميع رموز الاختبار في وظائف الاختبار. في الفصل 3 ، "تركيبات pytest" ، في الصفحة 49 ، ستتعلم كيفية وضع بيانات الاختبار في تركيبات الاختبار ، وكذلك تكوين وكسر الشفرة. يعد تعيين حالة النظام (أو النظام الفرعي أو الوحدة الفردية) جزءًا مهمًا من اختبار البرنامج. سوف تتعلم هذا الجانب من تركيبات pytest للمساعدة في تهيئة قاعدة بيانات مشروع المهام وتعبئة بيانات الاختبار مسبقًا لبعض الاختبارات. تعتبر التركيبات جزءًا قويًا للغاية من pytest ، وسوف تتعلم كيفية استخدامها بفعالية لتقليل ازدواجية رمز الاختبار بشكل أكبر والمساعدة في جعل كود الاختبار الخاص بك قابلاً للقراءة بشكل لا يصدق وقابل للصيانة. إن تركيبات Pytest قابلة للمعلمات أيضًا ، وهي تشبه وظائف الاختبار ، وسوف تستخدم هذه الوظيفة لتكون قادرًا على تشغيل جميع اختباراتك مع كل من TinyDB و MongoDB ، أجزاء خادم قاعدة البيانات التي تدعمها المهام.
في الفصل 4 ، "تركيبات مدمجة" ، في الصفحة 71 ، سترى بعض التركيبات المدمجة التي توفرها pytest. سوف تتعلم كيف يمكن لتركيبات pytest المضمنة تتبع الدلائل والملفات المؤقتة لك ، وتساعدك على التحقق من الإخراج من رمز الاختبار ، واستخدام تصحيحات القرود ، والتحقق من التحذيرات ، وأكثر من ذلك بكثير.
في الفصل الخامس ، "الإضافات" ، في الصفحة 95 ، ستتعلم كيفية إضافة خيارات سطر الأوامر إلى pytest وتغيير إخراج pytest ومشاركة إعدادات pytest ، بما في ذلك التركيبات ، مع مستخدمين آخرين من خلال الكتابة والتعبئة والتوزيع ( توزيع) الإضافات الخاصة. يتم استخدام المكون الإضافي الذي نطوره في هذا الفصل لإنشاء أخطاء الاختبار التي نراها عند اختبار المهام ، وهي أجمل قليلاً. سوف تتعلم أيضًا كيفية اختبار الإضافات بشكل صحيح. ما نوع التعريف؟ وفقط في حالة ، إذا لم تكن مستوحى بشكل كافٍ من هذا الفصل لكتابة الإضافات الخاصة بك ، فقد التقطت مجموعة من الإضافات الرائعة لإظهار ما هو ممكن في الملحق 3 ، "Plugin Sampler Pack" ، في الصفحة 163.
بالحديث عن التخصيص ، في الفصل 6 ، "التكوين" ، في الصفحة 113 ، سوف تتعلم كيفية تكوين تشغيل pytest الافتراضي لمشروعك باستخدام ملفات التكوين. باستخدام ملف pytest.ini ، يمكنك القيام بأشياء مثل تخزين معلمات سطر الأوامر حتى لا تضطر إلى إدخالها طوال الوقت ، وإخبار pytest بعدم البحث في أدلة محددة لملفات الاختبار ، وتحديد الحد الأدنى من إصدار pytest الذي الاختبارات والمزيد. يمكن وضع عناصر التكوين هذه في tox.ini أو setup.cfg .
في الفصل الأخير ، الفصل 7 ، باستخدام pytest مع أدوات أخرى ، في الصفحة 125 ، سترى كيف يمكنك أن تأخذ pytest القوية بالفعل وتثقل الاختبار بأدوات إضافية. ستقوم بتشغيل مشروع المهام على عدة إصدارات من Python مع السم. ستختبر مهام CLI بدون تشغيل باقي النظام باستخدام نسخة وهمية. ستستخدم cover.py للتحقق مما إذا كان كود المصدر لمشروع المهمة قيد الاختبار. ستستخدم Jenkins لتشغيل أجنحة الاختبار وعرض النتائج بمرور الوقت. وأخيرًا ، سترى كيف يمكن استخدام pytest لإجراء اختبارات unittest ، وكذلك لتبادل تركيبات نمط pytest مع اختبارات غير محددة.
ما تحتاج إلى معرفته
بيثون
لست بحاجة إلى أن تكون معلمًا في Python. الأمثلة لا تفعل شيئًا خارقًا أو غريبًا.
نقطة
يجب عليك استخدام pip لتثبيت pytest plugins و pytest نفسها. إذا كنت ترغب في ترقية النقطة ، راجع الملحق 2 ، النقطة ، في الصفحة 159.
سطر الأوامر
لقد كتبت هذا الكتاب والتقطت أمثلة على الإخراج باستخدام bash على كمبيوتر محمول Mac. ومع ذلك ، فإن الأوامر الوحيدة التي أستخدمها في bash هي cd للانتقال إلى دليل معين وبالطبع pytest. نظرًا لأن القرص المضغوط موجود في Windows cmd.exe وفي كل قذائف unix التي أعرفها ، يجب أن تكون جميع الأمثلة متاحة للتشغيل في أي تطبيق طرفي تقرر استخدامه.
هذا كل شيء. لا تحتاج إلى أن تكون خبيرًا في البرمجة لبدء كتابة الاختبارات التلقائية باستخدام pytest.
عينات التعليمات البرمجية وموارد الإنترنت
تمت كتابة الأمثلة في هذا الكتاب باستخدام Python 3.6 و pytest 3.2. يدعم pytest 3.2 Python 2.6 و 2.7 و Python 3.3+.
يتوفر رمز المصدر لمشروع المهام ، وكذلك لجميع الاختبارات الموضحة في هذا الكتاب ، على الرابط الموجود على صفحة الويب الخاصة بالكتاب على pragprog.com . لا تحتاج إلى تنزيل شفرة المصدر لفهم رمز الاختبار ؛ يتم تقديم رمز الاختبار في شكل مناسب في الأمثلة. ولكن من أجل متابعة مهام المشروع ، أو تكييف أمثلة الاختبار لاختبار مشروعك الخاص (يديك غير مقيدة!) ، يجب عليك الانتقال إلى صفحة الويب الخاصة بالكتاب لتنزيل العمل. هناك ، على صفحة الويب الخاصة بالكتاب ، هناك رابط لمشاركة المناقشة ومنتدى المناقشة .
لقد قمت بالبرمجة لأكثر من خمسة وعشرين عامًا ، ولم أجعلني أرغب في كتابة كود الاختبار مثلما فعلت pytest. آمل أن تتعلم الكثير من هذا الكتاب ، وآمل أن تحب رمز الاختبار في النهاية مثلي.
أبعد 