تقديم الاختبار في بيثون. الجزء 3

أيها الأصدقاء ، لدينا أخبار رائعة لك. أولاً ، تشرق الشمس أخيرًا في الشارع ، مما يعني أن الربيع بدأ يأخذ حقوقه بالكامل. الخبر الثاني أكثر تخصصًا - في 20 مارس ، يبدأ الدرس الأول في سلسلة رسائل جديدة في الدورة التدريبية "Python Developer" ، فيما يتعلق بذلك ننشر الجزء الأخير من مقالة "مقدمة إلى الاختبار في Python" ، التي يمكن قراءة الأجزاء السابقة منها هنا وهنا .

اختبار في بيئات متعددة

حتى الآن ، كنت تختبر إصدارًا واحدًا من Python باستخدام بيئة افتراضية مع مجموعة معينة من التبعيات. ولكن قد تكون هناك دائمًا حاجة لاختبار التطبيق على إصدارات عديدة من Python أو عدة إصدارات من الحزمة. Tox هو تطبيق يقوم بأتمتة الاختبار في بيئات متعددة.



تركيب تكس

Tox متاح على PyPl كحزمة للتثبيت عبر النقطة:

$ pip install tox 

بعد التثبيت ، يمكنك المتابعة لتكوين Tox.

تخصيص Tox للتبعيات الخاصة بك

يتم تكوين Tox من خلال ملف التكوين في دليل المشروع. أنه يحتوي على ما يلي:

  • الأمر لتشغيل لتشغيل الاختبارات ؛
  • أي حزم إضافية مطلوبة للتشغيل ؛
  • تم تحديد الإصدارات المستهدفة من Python للاختبار.

بدلاً من تعلم بناء الجملة لتكوين Tox ، يمكنك البدء بتشغيل تطبيق بدء التشغيل السريع.

 $ tox-quickstart 

ستقوم أداة تكوين Tox بطرح الأسئلة وإنشاء ملف مشابه لما يلي في tox.ini :

 [tox] envlist = py27, py36 [testenv] deps = commands = python -m unittest discover 

قبل بدء تشغيل Tox ، تأكد من أن setup.py مع خطوات التثبيت للحزمة في مجلد التطبيق. إذا لم يكن كذلك ، استخدم دليل إنشاء setup.py .

وإذا كان المشروع الخاص بك غير مخصص للتوزيع على PyPl ، فيمكنك تخطي هذا المطلب بإضافة السطر التالي إلى ملف tox.ini تحت عنوان التكسير:

 [tox] envlist = py27, py36 skipsdist=True 

إذا لم تقم بإنشاء setup.py ، وكان للتطبيق بعض التبعيات على PyPl ، فستحتاج إلى توضيحها في قسم testenv . على سبيل المثال ، سيتطلب Django ما يلي:

 [testenv] deps = django 

في نهاية هذه الخطوة ، يمكنك إجراء الاختبارات.

يمكنك الآن تشغيل Tox ، وسيخلق بيئتين ظاهرتين: واحدة لبيثون 2.7 وواحدة لبيثون 3.6. يسمى الدليل Tox .tox/ . في ذلك ، سيتم تشغيل Tox -m unittest discover لكل بيئة افتراضية.

يمكنك بدء هذه العملية عن طريق استدعاء Tox من سطر الأوامر:

 $ tox 

سوف ينتج Tox نتائج اختبار لكل بيئة. عند بدء تشغيل Tox للمرة الأولى ، يستغرق إنشاء بيئات افتراضية وقتًا ، ولكن عندما تقوم بتشغيل Tox للمرة الثانية ، سيعمل كل شيء بشكل أسرع.
نتائج Tox بسيطة جدا. يتم إنشاء بيئات لكل إصدار ، ويتم تثبيت التبعيات ، ثم يتم تشغيل أوامر الاختبار.

هناك بعض خيارات سطر الأوامر الإضافية التي تستحق التذكر.
تشغيل بيئة واحدة ، على سبيل المثال ، Python 3.6:

 $ tox -e py36 

إعادة إنشاء البيئة الافتراضية عندما تتغير التبعية أو تتلف الحزم الجانبية :

 $ tox -r 

تشغيل Tox مع نتائج أقل تفصيلاً:

 $ tox -q 

تشغيل Tox مع إخراج مطول أكثر:

 $ tox -v 

يمكنك قراءة المزيد حول Tox على موقع وثائق Tox .

أتمتة الاختبار

حتى الآن ، لقد أجريت الاختبارات يدويًا عن طريق تشغيل الأمر. ولكن هناك أدوات لتشغيل الاختبارات تلقائيًا عند إجراء التغييرات وإلزامها بمستودع به نظام للتحكم في الإصدار ، على سبيل المثال ، Git. غالبًا ما يشار إلى أدوات أتمتة الاختبار على أنها أدوات CI / CD ، مما يعني "التكامل المستمر / النشر المستمر". يمكنهم تشغيل الاختبارات وتجميع ونشر التطبيقات ، وحتى نشرها على الإنتاج.
Travis CI هي واحدة من العديد من خدمات CI المتاحة.

يعمل Travis CI بشكل جيد مع Python ، والآن يمكنك أتمتة تنفيذ جميع الاختبارات التي تم إنشاؤها في السحابة! Travis CI مجاني لأي مشاريع مفتوحة المصدر على GitHub و GitLab ومتاح مقابل رسوم للمشاريع الخاصة.

للبدء ، قم بتسجيل الدخول والمصادقة باستخدام بيانات اعتماد GitHub أو GitLab. ثم قم بإنشاء ملف يسمى .travis.yml بالمحتويات التالية:

 language: python python: - "2.7" - "3.7" install: - pip install -r requirements.txt script: - python -m unittest discover 

يعطي هذا التكوين Travis CI التوجيهات التالية:

  • اختبار Python 2.7 و 3.7 (اختياريًا ، يمكنك استبدالهما بأي أشخاص آخرين.)
  • تثبيت جميع الحزم المدرجة في requirements.txt (يمكنك إزالة هذا القسم إذا لم يكن لديك تبعيات.)
  • تشغيل الثعبان - م unittest اكتشاف لتشغيل الاختبارات.

بعد الالتزام بهذا الملف ودفعه ، سيقوم Travis CI بتشغيل هذه الأوامر في كل مرة تقوم فيها بالضغط على مستودع Git البعيد. يمكن الاطلاع على النتائج على موقعه على الانترنت.

ما التالي

أنت الآن تعرف كيفية كتابة الاختبارات ، وإضافتها إلى مشروعك ، وتنفيذها ، وحتى القيام بذلك تلقائيًا ، حتى تتمكن من التعرف على الأساليب المتقدمة التي يمكن أن تكون مفيدة مع نمو مكتبة الاختبار.

مقدمة Linter إلى التطبيق

لدى Tox و Travis CI إعداد فريق اختبار. في هذا البرنامج التعليمي ، استخدمنا اكتشاف python -m unittest كفريق اختبار.

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

واحد مثل هذا التطبيق هو linter. وقال انه سوف ننظر في التعليمات البرمجية الخاصة بك وترك التعليقات. وبالتالي ، يمكنه تقديم المشورة بشأن الأخطاء وتصحيح المساحات الزائدة وتوقع الأخطاء المحتملة.

لمعرفة المزيد عن اللمعة ، راجع برنامج Python Code Quality التعليمي .

لينت السلبي مع flake8

flake8 هو linter الشهير الذي يترك تعليقات حول نمط الكود الخاص بك وفقًا لمواصفات PEP 8 .

يمكنك تثبيت flake8 باستخدام النقطة:

 $ pip install flake8 

بعد ذلك يمكنك تشغيل flake8 لملف أو مجلد أو قالب واحد:

 $ flake8 test.py test.py:6:1: E302 expected 2 blank lines, found 1 test.py:23:1: E305 expected 2 blank lines after class or function definition, found 1 test.py:24:20: W292 no newline at end of file 

سترى قائمة بالأخطاء والتحذيرات في التعليمات البرمجية التي عثر عليها بواسطة flake8 .
يمكن تكوين flake8 في سطر الأوامر أو في ملف تكوين المشروع. إذا كنت تريد تجاهل بعض القواعد ، على سبيل المثال E305 ، الموضح أعلاه ، يمكنك تعيين هذا في التكوين. سيقوم flake8 بالتحقق من ملف. flake8 في مجلد المشروع أو ملف setup.cfg . إذا كنت تريد استخدام Tox ، يمكنك إضافة flake8 تكوين tox.ini إلى tox.ini .

يتجاهل هذا المثال الدلائل. git و __pycache__ ، وكذلك القاعدة E305. بالإضافة إلى ذلك ، يزيد الحد الأقصى لطول السلسلة من 80 حرفًا إلى 90 حرفًا. ستدرك في مرحلة ما أن الحد القياسي البالغ 79 حرفًا في كل سطر غير مناسب للاختبارات التي قد تحتوي على أسماء طرق طويلة ، حرفية السلسلة مع قيم اختبار و قطع طويلة أخرى من البيانات. عادة ، للاختبارات ، قم بزيادة طول السلسلة إلى 120 حرفًا:

 [flake8] ignore = E305 exclude = .git,__pycache__ max-line-length = 90 

بدلاً من ذلك ، يمكنك توفير هذه الخيارات في سطر الأوامر:

 $ flake8 --ignore E305 --exclude .git,__pycache__ --max-line-length=90 

يمكن العثور على قائمة كاملة بالإعدادات على موقع الوثائق .
يمكنك الآن إضافة flake8 إلى إعداد CI. بالنسبة إلى Travis CI ، سيبدو كما يلي:

 matrix: include: - python: "2.7" script: "flake8" 

سيقرأ Travis التكوين في. .flake8 ولن يتمكن من إكمال .flake8 إذا كانت هناك أخطاء في الوبر. تأكد من إضافة التبعية flake8 إلى ملف requirements.txt .

لينت العدوانية مع رمز المنسق

flake8 هو عبارة عن flake8 سلبية لا توصي إلا بإجراء تعديلات ؛ وسيكون عليك إدخالها في الكود بنفسك. كود المنسق هو نهج أكثر عدوانية. يغير الرمز تلقائيًا وفقًا للأنماط والتخطيطات.

black هو المنسق لا يرحم للغاية. ليس لديه إعدادات وهو دقيق للغاية. مما يجعله أداة رائعة لإدراجها في خط أنابيب الاختبار.

يرجى ملاحظة: أسود يتطلب بيثون الإصدار 3.6 وأعلى.

يمكنك تثبيت black باستخدام نقطة:

 $ pip install black 

بعد ذلك ، للبدء من سطر الأوامر ، حدد الملف أو الدليل الذي تريد تنسيقه:

 $ black test.py 

الحفاظ على اختبار رمز نظيفة

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

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

عند كتابة الاختبارات ، حاول اتباع مبدأ DRY: لا تكرر نفسك.

تعتبر تركيبات الاختبارات والوظائف طريقة رائعة لكتابة التعليمات البرمجية التي يسهل الحفاظ عليها. أيضا ، لا تنسى عن سهولة القراءة. فكر في نشر أدوات الفحص مثل flake8 في رمز الاختبار:

 $ flake8 --max-line-length=120 tests/ 

اختبار الكشف عن الإنتاجية يتناقص بين التعديلات

هناك طرق عديدة لقياس الرمز في Python. تحتوي المكتبة القياسية على وحدة زمنية تقوم بجدولة الوظائف عدة مرات وتظهر لك التوزيع. في هذا المثال ، سيتم تنفيذ test () 100 مرة ، ثم سيتم إعطاء الإخراج باستخدام print ():

 def test(): # ... your code if __name__ == '__main__': import timeit print(timeit.timeit("test()", setup="from __main__ import test", number=100)) 

إذا قررت استخدام pytest كعداء اختبار ، تحقق من البرنامج المساعد pytest-standardmark. أنه يوفر تركيبات pytest تسمى المعيار. يمكن تمرير أي كائن يسمى المعيار () ، فإنه يوزع وقت يسمى في نتائج pytest.

يمكنك تثبيت معيار pytest من PyPl باستخدام النقطة:

 $ pip install pytest-benchmark 

بعد ذلك يمكنك إضافة اختبار باستخدام أداة التثبيت وتمرير الكائن المدعو إلى التنفيذ:

 def test_my_function(benchmark): result = benchmark(test) 

سوف يمنحك تشغيل pytest نتائج قياسية:



يمكنك معرفة المزيد على موقع الوثائق .

اختبار لتحديد الأخطاء الأمنية

هناك اختبار آخر يجب تشغيله على التطبيق الخاص بك وهو البحث عن الأخطاء الشائعة ونقاط الضعف الأمنية.

تثبيت bandit من PyPl باستخدام النقطة:

 $ pip install bandit 

بعد ذلك ، يمكنك تمرير اسم الوحدة النمطية للتطبيق الخاص بك باستخدام العلامة -r والحصول على معلومات مختصرة:

 $ bandit -r my_sum [main] INFO profile include tests: None [main] INFO profile exclude tests: None [main] INFO cli include tests: None [main] INFO cli exclude tests: None [main] INFO running on Python 3.5.2 Run started:2018-10-08 00:35:02.669550 Test results: No issues identified. Code scanned: Total lines of code: 5 Total lines skipped (#nosec): 0 Run metrics: Total issues (by severity): Undefined: 0.0 Low: 0.0 Medium: 0.0 High: 0.0 Total issues (by confidence): Undefined: 0.0 Low: 0.0 Medium: 0.0 High: 0.0 Files skipped (0): 

كما هو الحال مع flake8 ، يمكن تكوين bandit flake8 bandit ، وإذا كنت تريد تجاهل بعضها ، فيمكنك إضافة الجزء التالي إلى ملف setup.cfg مع المعلمات:

 [bandit] exclude: /test tests: B101,B102,B301 

مزيد من المعلومات على موقع جيثب .

استنتاج

أتاحت Python الاختبار بفضل الأوامر والمكتبات المدمجة اللازمة للتحقق من التشغيل الصحيح للتطبيقات. من السهل بدء الاختبار في Python: يمكنك استخدام unittest وكتابة طرق صغيرة سهلة الصيانة لاختبار الشفرة.

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

شكرا للقراءة. لديك مستقبل لا لبس فيه مع بيثون!

ولأولئك الذين قرأوا المقال ، لدينا نبأ عظيم آخر. الآن ، يمكنك الحصول على دورة Python Developer بخصم 10000 روبل!

الجزء الاول
الجزء الثاني

Source: https://habr.com/ru/post/ar444204/


All Articles