البرنامج التعليمي لـ PyTest: ما هو، كيفية التثبيت، الإطار، التأكيدات
ما هو بايتيست؟
باي تيست هو إطار اختبار يسمح للمستخدمين بكتابة رموز الاختبار باستخدام Python لغة برمجة. تساعدك على كتابة حالات اختبار بسيطة وقابلة للتطوير لقواعد البيانات أو واجهات برمجة التطبيقات أو واجهة المستخدم. تُستخدم PyTest بشكل أساسي لكتابة اختبارات لواجهات برمجة التطبيقات. تساعد في كتابة اختبارات من اختبارات الوحدات البسيطة إلى الاختبارات الوظيفية المعقدة.
لماذا استخدام بايتيست؟
بعض مزايا pytest هي
- من السهل جدًا البدء به بسبب تركيبه البسيط والسهل.
- يمكن إجراء الاختبارات بالتوازي.
- يمكن تشغيل اختبار محدد أو مجموعة فرعية من الاختبارات
- كشف الاختبارات تلقائيا
- تخطي الاختبارات
- المصدر المفتوح
كيفية تثبيت بايتيست
فيما يلي عملية حول كيفية تثبيت PyTest:
الخطوة 1) يمكنك تثبيت pytest بواسطة
pip install pytest==2.9.1
بمجرد اكتمال التثبيت، يمكنك تأكيد ذلك من خلال
py.test -h
سيعرض هذا المساعدة
أول اختبار PyTest الأساسي
الآن، سوف نتعلم كيفية استخدام Pytest مع مثال PyTest الأساسي.
قم بإنشاء مجلد Study_pytest. سنقوم بإنشاء ملفات الاختبار الخاصة بنا داخل هذا المجلد.
يرجى الانتقال إلى هذا المجلد في سطر الأوامر الخاص بك.
قم بإنشاء ملف باسم test_sample1.py داخل المجلد
أضف الكود أدناه إليه واحفظه
import pytest def test_file1_method1(): x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed" def test_file1_method2(): x=5 y=6 assert x+1 == y,"test failed"
قم بإجراء الاختبار باستخدام الأمر
py.test
سوف تحصل على الإخراج كما
test_sample1.py F.
============================================== FAILURES ========================================
____________________________________________ test_sample1 ______________________________________
def test_file1_method1():
x=5
y=6
assert x+1 == y,"test failed"
> assert x == y,"test failed"
E AssertionError: test failed
E assert 5 == 6
test_sample1.py:6: AssertionError
هنا في test_sample1.py F.
يقول F الفشل
النقطة (.) تقول النجاح.
في قسم حالات الفشل، يمكنك رؤية الطريقة (الطرق) الفاشلة وخط الفشل. هنا x==y تعني 5==6 وهو خطأ.
بعد ذلك، في هذا البرنامج التعليمي PyTest، سنتعرف على التوكيد في PyTest.
التأكيدات في PyTest
تأكيدات Pytest هي عمليات التحقق التي تُرجع إما الحالة True أو False. في Python Pytest، إذا فشل التأكيد في طريقة اختبار، فسيتم إيقاف تنفيذ هذه الطريقة هناك. لم يتم تنفيذ التعليمات البرمجية المتبقية في طريقة الاختبار هذه، وستستمر تأكيدات Pytest مع طريقة الاختبار التالية.
أمثلة تأكيد Pytest:
assert "hello" == "Hai" is an assertion failure. assert 4==4 is a successful assertion assert True is a successful assertion assert False is an assertion failure.
assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
ضع هذا الرمز في test_file1_method1() بدلاً من التأكيد
assert x == y,"test failed"
تشغيل الاختبار سوف يعطي الفشل كما خطأ التأكيد: فشل الاختبار x=5 y=6
كيف يحدد PyTest ملفات الاختبار وطرق الاختبار
افتراضيًا، يحدد pytest فقط أسماء الملفات التي تبدأ بـ امتحان_ أو تنتهي بـ _اختبار كملفات الاختبار. يمكننا ذكر أسماء ملفات أخرى صراحةً (سيتم شرحها لاحقًا). يتطلب Pytest أن تبدأ أسماء طرق الاختبار بـ "امتحان". سيتم تجاهل جميع أسماء الطرق الأخرى حتى لو طلبنا صراحةً تشغيل تلك الطرق.
راجع بعض الأمثلة على أسماء ملفات pytest الصالحة وغير الصالحة
test_login.py - valid login_test.py - valid testlogin.py -invalid logintest.py -invalid
ملحوظة: نعم يمكننا أن نطلب صراحة من pytest اختيار testlogin.py وlogintest.py
راجع بعض الأمثلة على طرق اختبار pytest الصالحة وغير الصالحة
def test_file1_method1(): - valid def testfile1_method1(): - valid def file1_method1(): - invalid
ملحوظة: حتى لو ذكرنا صراحة file1_method1()، فلن يقوم pytest بتشغيل هذه الطريقة.
تشغيل اختبارات متعددة من ملف معين وملفات متعددة
حاليًا، داخل المجلد Study_pytest، لدينا ملف test_sample1.py. لنفترض أن لدينا ملفات متعددة، مثل test_sample2.py و test_sample3.py. لتشغيل جميع الاختبارات من جميع الملفات الموجودة في المجلد والمجلدات الفرعية، نحتاج فقط إلى تشغيل الأمر pytest.
py.test
سيؤدي هذا إلى تشغيل كافة أسماء الملفات التي تبدأ بـ test_ وأسماء الملفات التي تنتهي بـ _test في هذا المجلد والمجلدات الفرعية الموجودة ضمن هذا المجلد.
لإجراء الاختبارات فقط من ملف معين، يمكننا استخدام py.test
py.test test_sample1.py
قم بتشغيل مجموعة فرعية من الاختبار الكامل باستخدام PyTest
في بعض الأحيان لا نرغب في تشغيل مجموعة الاختبار بأكملها. يسمح لنا Pytest بإجراء اختبارات محددة. يمكننا أن نفعل ذلك بطريقتين
- تجميع أسماء الاختبار عن طريق مطابقة السلسلة الفرعية
- تجميع الاختبارات حسب العلامات
لدينا بالفعل test_sample1.py. قم بإنشاء ملف test_sample2.py وأضف الكود أدناه إليه
def test_file2_method1(): x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed because x=" + str(x) + " y=" + str(y) def test_file2_method2(): x=5 y=6 assert x+1 == y,"test failed"
لذلك لدينا حاليا
• test_sample1.py • test_file1_method1() • test_file1_method2() • test_sample2.py • test_file2_method1() • test_file2_method2()
الخيار 1) تشغيل الاختبارات عن طريق مطابقة السلسلة الفرعية
هنا لتشغيل جميع الاختبارات التي تحتوي على الطريقة 1 باسمها، يجب علينا تشغيلها
py.test -k method1 -v -k <expression> is used to represent the substring to match -v increases the verbosity
لذا فإن تشغيل py.test -k method1 -v سيعطيك النتيجة التالية
test_sample2.py::test_file2_method1 FAILED
test_sample1.py::test_file1_method1 FAILED
============================================== FAILURES ==============================================
_________________________________________ test_file2_method1 _________________________________________
def test_file2_method1():
x=5
y=6
assert x+1 == y,"test failed"
> assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
E AssertionError: test failed because x=5 y=6
E assert 5 == 6
test_sample2.py:5: AssertionError
_________________________________________ test_file1_method1 _________________________________________
@pytest.mark.only
def test_file1_method1():
x=5
y=6
assert x+1 == y,"test failed"
> assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
E AssertionError: test failed because x=5 y=6
E assert 5 == 6
test_sample1.py:8: AssertionError
================================= 2 tests deselected by '-kmethod1' ==================================
=============================== 2 failed, 2 deselected in 0.02 seconds ===============================
هنا يمكنك أن ترى في النهاية تم إلغاء تحديد اختبارين بواسطة "-kmethod2" وهما test_file1_method2 و test_file2_method2
حاول الركض بمجموعات مختلفة مثل: -
py.test -k method -v - will run all the four methods py.test -k methods -v – will not run any test as there is no test name matches the substring 'methods'
الخيار 2) إجراء الاختبارات بواسطة العلامات
يسمح لنا Pytest بتعيين سمات مختلفة لطرق الاختبار باستخدام علامات pytest، @pytest.mark . لاستخدام العلامات في ملف الاختبار، نحتاج إلى استيراد pytest على ملفات الاختبار.
سنقوم هنا بتطبيق أسماء علامات مختلفة على طرق الاختبار وإجراء اختبارات محددة بناءً على أسماء العلامات. يمكننا تحديد العلامات على كل أسماء الاختبارات باستخدام
@pytest.mark.<name>.
نقوم بتعريف العلامات set1 وset2 على طرق الاختبار، وسنجري الاختبار باستخدام أسماء العلامات. قم بتحديث ملفات الاختبار بالكود التالي
test_sample1.py
import pytest @pytest.mark.set1 def test_file1_method1(): x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed because x=" + str(x) + " y=" + str(y) @pytest.mark.set2 def test_file1_method2(): x=5 y=6 assert x+1 == y,"test failed"
test_sample2.py
import pytest @pytest.mark.set1 def test_file2_method1(): x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed because x=" + str(x) + " y=" + str(y) @pytest.mark.set1 def test_file2_method2(): x=5 y=6 assert x+1 == y,"test failed"
يمكننا إجراء الاختبار المميز بواسطة
py.test -m <name> -m <name> mentions the marker name
قم بتشغيل py.test -m set1. سيؤدي هذا إلى تشغيل الطرق test_file1_method1 وtest_file2_method1 وtest_file2_method2.
سيؤدي تشغيل py.test -m set2 إلى تشغيل test_file1_method2.
قم بإجراء الاختبارات بالتوازي مع Pytest
عادةً ما تحتوي مجموعة الاختبار على ملفات اختبار متعددة ومئات من طرق الاختبار التي ستستغرق وقتًا طويلاً للتنفيذ. يسمح لنا Pytest بإجراء الاختبارات بالتوازي.
لذلك نحتاج أولاً إلى تثبيت pytest-xdist عن طريق التشغيل
pip install pytest-xdist
يمكنك إجراء الاختبارات الآن عن طريق
py.test -n 4
-ن يقوم بإجراء الاختبارات باستخدام العديد من العمال. في الأمر أعلاه، سيكون هناك 4 عمال لإجراء الاختبار.
تركيبات بيتيست
تُستخدم التركيبات عندما نريد تشغيل بعض التعليمات البرمجية قبل كل طريقة اختبار. لذلك بدلاً من تكرار نفس الكود في كل اختبار، نقوم بتعريف التركيبات. عادة، يتم استخدام التركيبات لتهيئة اتصالات قاعدة البيانات، وتمرير القاعدة، وما إلى ذلك
يتم وضع علامة على الطريقة باعتبارها أداة Pytest عن طريق وضع علامة عليها
@pytest.fixture
يمكن لطريقة الاختبار استخدام أداة Pytest من خلال ذكر الأداة كمعلمة إدخال.
قم بإنشاء ملف جديد test_basic_fixture.py بالكود التالي
import pytest @pytest.fixture def supply_AA_BB_CC(): aa=25 bb =35 cc=45 return [aa,bb,cc] def test_comparewithAA(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed" def test_comparewithBB(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[1]==zz,"bb and zz comparison failed" def test_comparewithCC(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"
هنا
- لدينا عنصر أساسي اسمه Supply_AA_BB_CC. ستعيد هذه الطريقة قائمة من 3 قيم.
- لدينا 3 طرق اختبار للمقارنة مع كل قيمة.
تحتوي كل وظيفة اختبار على وسيطة إدخال يتطابق اسمها مع التركيبات المتاحة. يستدعي Pytest بعد ذلك طريقة التثبيت المقابلة وسيتم تخزين القيم التي تم إرجاعها في وسيطة الإدخال، هنا القائمة [25,35,45]. يتم الآن استخدام عناصر القائمة في طرق الاختبار للمقارنة.
الآن قم بإجراء الاختبار وشاهد النتيجة
py.test test_basic_fixture
test_basic_fixture.py::test_comparewithAA FAILED
test_basic_fixture.py::test_comparewithBB PASSED
test_basic_fixture.py::test_comparewithCC FAILED
============================================== FAILURES ==============================================
_________________________________________ test_comparewithAA _________________________________________
supply_AA_BB_CC = [25, 35, 45]
def test_comparewithAA(supply_AA_BB_CC):
zz=35
> assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed"
E AssertionError: aa and zz comparison failed
E assert 25 == 35
test_basic_fixture.py:10: AssertionError
_________________________________________ test_comparewithCC _________________________________________
supply_AA_BB_CC = [25, 35, 45]
def test_comparewithCC(supply_AA_BB_CC):
zz=35
> assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"
E AssertionError: cc and zz comparison failed
E assert 45 == 35
test_basic_fixture.py:16: AssertionError
================================= 2 failed, 1 passed in 0.05 seconds =================================
تم اجتياز الاختبار test_comparewithBB منذ zz=BB=35، وفشل الاختباران المتبقيان.
طريقة التثبيت لها نطاق فقط ضمن ملف الاختبار الذي تم تعريفه. إذا حاولنا الوصول إلى التثبيت في ملف اختبار آخر، فسوف نحصل على خطأ يقول Fixed لم يتم العثور على 'supply_AA_BB_CC' لطرق الاختبار في الملفات الأخرى.
لاستخدام نفس التركيبة ضد ملفات اختبار متعددة، سنقوم بإنشاء طرق التثبيت في ملف يسمى conftest.py.
لنرى ذلك من خلال مثال PyTest أدناه. أنشئ 3 ملفات conftest.py وtest_basic_fixture.py وtest_basic_fixture2.py بالكود التالي
conftest.py
import pytest @pytest.fixture def supply_AA_BB_CC(): aa=25 bb =35 cc=45 return [aa,bb,cc]
test_basic_fixture.py
import pytest def test_comparewithAA(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed" def test_comparewithBB(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[1]==zz,"bb and zz comparison failed" def test_comparewithCC(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"
test_basic_fixture2.py
import pytest def test_comparewithAA_file2(supply_AA_BB_CC): zz=25 assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed" def test_comparewithBB_file2(supply_AA_BB_CC): zz=25 assert supply_AA_BB_CC[1]==zz,"bb and zz comparison failed" def test_comparewithCC_file2(supply_AA_BB_CC): zz=25 assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"
سيبحث pytest عن الأداة في ملف الاختبار أولاً، وإذا لم يتم العثور عليها فسوف يبحث في conftest.py
قم بإجراء الاختبار عن طريق py.test -k test_comparewith -v للحصول على النتيجة على النحو التالي
test_basic_fixture.py::test_comparewithAA FAILED test_basic_fixture.py::test_comparewithBB PASSED test_basic_fixture.py::test_comparewithCC FAILED test_basic_fixture2.py::test_comparewithAA_file2 PASSED test_basic_fixture2.py::test_comparewithBB_file2 FAILED test_basic_fixture2.py::test_comparewithCC_file2 FAILED
اختبار Pytest المعلمات
الغرض من تحديد معلمات الاختبار هو إجراء اختبار مقابل مجموعات متعددة من الوسائط. يمكننا القيام بذلك عن طريق @pytest.mark.parametrize.
سنرى هذا من خلال مثال PyTest أدناه. سنقوم هنا بتمرير 3 وسيطات إلى طريقة الاختبار. ستضيف طريقة الاختبار هذه الوسيطتين الأوليين وتقارنهما بالوسيطة الثالثة.
قم بإنشاء ملف الاختبار test_addition.py باستخدام الكود أدناه
import pytest
@pytest.mark.parametrize("input1, input2, output",[(5,5,10),(3,5,12)])
def test_add(input1, input2, output):
assert input1+input2 == output,"failed"
هنا تقبل طريقة الاختبار 3 وسيطات - input1 وinput2 وoutput. وتضيف input1 وinput2 وتقارنهما بالإخراج.
لنجري الاختبار عن طريق py.test -k test_add -v ونرى النتيجة
test_addition.py::test_add[5-5-10] PASSED
test_addition.py::test_add[3-5-12] FAILED
============================================== FAILURES ==============================================
__________________________________________ test_add[3-5-12] __________________________________________
input1 = 3, input2 = 5, output = 12
@pytest.mark.parametrize("input1, input2, output",[(5,5,10),(3,5,12)])
def test_add(input1, input2, output):
> assert input1+input2 == output,"failed"
E AssertionError: failed
E assert (3 + 5) == 12
test_addition.py:5: AssertionError
يمكنك رؤية الاختبارات التي تم إجراؤها مرتين - أحدهما يتحقق من 2+5 ==5 والآخر يتحقق من 10+3 ==5
test_addition.py::test_add[5-5-10] تم اجتيازه
test_addition.py::test_add[3-5-12] فشل
Pytest Xfail / تخطي الاختبارات
ستكون هناك بعض المواقف التي لا نريد فيها تنفيذ اختبار أو حالة اختبار ليست ذات صلة لفترة معينة. في تلك المواقف، لدينا خيار الفشل في الاختبار أو تخطي الاختبارات
سيتم تنفيذ الاختبار الفاشل، ولكن لن يتم احتسابه كجزء من الاختبارات الفاشلة أو الناجحة. لن يتم عرض أي تتبع إذا فشل هذا الاختبار. يمكننا إجراء اختبارات فاشلة باستخدام
@pytest.mark.xfail.
تخطي الاختبار يعني أنه لن يتم تنفيذ الاختبار. يمكننا تخطي الاختبارات باستخدام
@pytest.mark.skip.
قم بتحرير test_addition.py باستخدام الكود أدناه
import pytest @pytest.mark.skip def test_add_1(): assert 100+200 == 400,"failed" @pytest.mark.skip def test_add_2(): assert 100+200 == 300,"failed" @pytest.mark.xfail def test_add_3(): assert 15+13 == 28,"failed" @pytest.mark.xfail def test_add_4(): assert 15+13 == 100,"failed" def test_add_5(): assert 3+2 == 5,"failed" def test_add_6(): assert 3+2 == 6,"failed"
هنا
- تم تخطي test_add_1 وtest_add_2 ولن يتم تنفيذهما.
- تم فشل test_add_3 وtest_add_4. سيتم تنفيذ هذه الاختبارات وستكون جزءًا من اختبارات xfailed (عند فشل الاختبار) أو xpassed (عند اجتياز الاختبار). لن يكون هناك أي تتبع للفشل.
- سيتم تنفيذ test_add_5 وtest_add_6 وسيبلغ test_add_6 عن الفشل مع التتبع أثناء مرور test_add_5
قم بتنفيذ الاختبار عن طريق py.test test_addition.py -v وشاهد النتيجة
test_addition.py::test_add_1 SKIPPED
test_addition.py::test_add_2 SKIPPED
test_addition.py::test_add_3 XPASS
test_addition.py::test_add_4 xfail
test_addition.py::test_add_5 PASSED
test_addition.py::test_add_6 FAILED
============================================== FAILURES ==============================================
_____________________________________________ test_add_6 _____________________________________________
def test_add_6():
> assert 3+2 == 6,"failed"
E AssertionError: failed
E assert (3 + 2) == 6
test_addition.py:24: AssertionError
================ 1 failed, 1 passed, 2 skipped, 1 xfailed, 1 xpassed in 0.07 seconds =================
نتائج XML
يمكننا إنشاء نتائج اختبار بتنسيق XML والتي يمكننا إرسالها إلى خوادم التكامل المستمر لمزيد من المعالجة وما إلى ذلك. يمكن القيام بذلك عن طريق
py.test test_sample1.py -v –junitxml=”result.xml”
سوف يسجل result.xml نتيجة تنفيذ الاختبار. ابحث عن نموذج result.xml أدناه
<?xml version="1.0" encoding="UTF-8"?>
<testsuite errors="0" failures="1" name="pytest" skips="0" tests="2" time="0.046">
<testcase classname="test_sample1" file="test_sample1.py" line="3" name="test_file1_method1" time="0.001384973526">
<failure message="AssertionError:test failed because x=5 y=6 assert 5 ==6">
@pytest.mark.set1
def test_file1_method1():
x=5
y=6
assert x+1 == y,"test failed"
> assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
E AssertionError: test failed because x=5 y=6
E assert 5 == 6
test_sample1.py:9: AssertionError
</failure>
</testcase>
<testcase classname="test_sample1" file="test_sample1.py" line="10" name="test_file1_method2" time="0.000830173492432" />
</testsuite>
من يمكننا أن نرى إجمالي اختبارين فشل أحدهما. أدناه يمكنك رؤية التفاصيل المتعلقة بكل اختبار تم تنفيذه العلامة.
إطار عمل Pytest يختبر واجهة برمجة التطبيقات
سنقوم الآن بإنشاء إطار عمل pytest صغير لاختبار واجهة برمجة التطبيقات. واجهة برمجة التطبيقات المستخدمة هنا هي واجهة مجانية من https://reqres.in/. هذا الموقع مخصص فقط لتوفير واجهة برمجة التطبيقات القابلة للاختبار. هذا الموقع لا يخزن بياناتنا.
هنا سوف نكتب بعض الاختبارات ل
- سرد بعض المستخدمين
- تسجيل الدخول مع المستخدمين
قم بإنشاء الملفات أدناه باستخدام الكود المعطى
conftest.py – يحتوي على أداة توفر عنوان URL الأساسي لجميع طرق الاختبار
import pytest @pytest.fixture def supply_url(): return "https://reqres.in/api"
test_list_user.py – يحتوي على طرق الاختبار لإدراج المستخدمين الصالحين وغير الصالحين
- اختبارات test_list_valid_user لجلب المستخدم الصالح والتحقق من الاستجابة
- اختبارات test_list_invaliduser لجلب المستخدم غير الصالح والتحقق من الاستجابة
import pytest
import requests
import json
@pytest.mark.parametrize("userid, firstname",[(1,"George"),(2,"Janet")])
def test_list_valid_user(supply_url,userid,firstname):
url = supply_url + "/users/" + str(userid)
resp = requests.get(url)
j = json.loads(resp.text)
assert resp.status_code == 200, resp.text
assert j['data']['id'] == userid, resp.text
assert j['data']['first_name'] == firstname, resp.text
def test_list_invaliduser(supply_url):
url = supply_url + "/users/50"
resp = requests.get(url)
assert resp.status_code == 404, resp.text
test_login_user.py – يحتوي على طرق اختبار لاختبار وظيفة تسجيل الدخول.
- يقوم test_login_valid باختبار محاولة تسجيل الدخول الصالحة باستخدام البريد الإلكتروني وكلمة المرور
- test_login_no_password يختبر محاولة تسجيل الدخول غير الصالحة دون تمرير كلمة المرور
- يقوم test_login_no_email باختبار محاولة تسجيل الدخول غير الصالحة دون إرسال البريد الإلكتروني.
import pytest
import requests
import json
def test_login_valid(supply_url):
url = supply_url + "/login/"
data = {'email':'[email protected]','password':'something'}
resp = requests.post(url, data=data)
j = json.loads(resp.text)
assert resp.status_code == 200, resp.text
assert j['token'] == "QpwL5tke4Pnpja7X", resp.text
def test_login_no_password(supply_url):
url = supply_url + "/login/"
data = {'email':'[email protected]'}
resp = requests.post(url, data=data)
j = json.loads(resp.text)
assert resp.status_code == 400, resp.text
assert j['error'] == "Missing password", resp.text
def test_login_no_email(supply_url):
url = supply_url + "/login/"
data = {}
resp = requests.post(url, data=data)
j = json.loads(resp.text)
assert resp.status_code == 400, resp.text
assert j['error'] == "Missing email or username", resp.text
قم بإجراء الاختبار باستخدام py.test -v
انظر النتيجة كما
test_list_user.py::test_list_valid_user[1-George] PASSED test_list_user.py::test_list_valid_user[2-Janet] PASSED test_list_user.py::test_list_invaliduser PASSED test_login_user.py::test_login_valid PASSED test_login_user.py::test_login_no_password PASSED test_login_user.py::test_login_no_email PASSED
قم بتحديث الاختبارات وجرب مخرجات مختلفة
ملخص
في هذا البرنامج التعليمي PyTest، قمنا بتغطية
- تثبيت pytest باستخدام تثبيت نقطة pytest=2.9.1
- برنامج pytest بسيط وتشغيله باستخدام الأمر py.test.
- عبارات التأكيد، التأكيد x==y، ستُرجع إما True أو False.
- كيف يحدد pytest ملفات الاختبار وطرقه
- اختبار الملفات بدءًا من امتحان_ أو تنتهي بـ _اختبار
- طرق الاختبار تبدأ بـ تجربه بالعربي
- سيقوم الأمر py.test بتشغيل كافة ملفات الاختبار الموجودة في هذا المجلد والمجلدات الفرعية. لتشغيل ملف معين، يمكننا استخدام الأمر py.test
- قم بتشغيل مجموعة فرعية من طرق الاختبار
- تجميع أسماء الاختبار حسب السلسلة الفرعية match.py.test -k -v سيتم تشغيل كافة الاختبارات بعد باسمها.
- قم بإجراء الاختبار بواسطة العلامات. قم بتمييز الاختبارات باستخدام @pytest.mark. وقم بإجراء الاختبارات باستخدام pytest -m لتشغيل الاختبارات التي تم وضع علامة عليها .
- تشغيل الاختبارات بالتوازي
- قم بتثبيت pytest-xdist باستخدام pip install pytest-xdist
- قم بإجراء الاختبارات باستخدام py.test -n NUM حيث NUM هو عدد العمال
- إنشاء أساليب التثبيت لتشغيل التعليمات البرمجية قبل كل اختبار عن طريق وضع علامة على الطريقة باستخدام @pytest.fixture
- يقع نطاق طريقة التثبيت ضمن الملف المحدد.
- يمكن الوصول إلى طريقة التثبيت عبر ملفات اختبار متعددة عن طريق تعريفها في ملف conftest.py.
- يمكن لطريقة الاختبار الوصول إلى أداة Pytest باستخدامها كوسيطة إدخال.
- اختبارات تحديد المعلمات لتشغيلها على مجموعة متعددة من المدخلات.
@pytest.mark.parametrize("input1, input2,output",[(5,5,10),(3,5,12)])
def test_add(input1, input2,output):
تأكيد الإدخال 1 + الإدخال 2 == الإخراج، "فشل"
سيتم إجراء الاختبار باستخدام المدخلات (5,5,10،3,5,12،XNUMX) و (XNUMX،XNUMX،XNUMX) - تخطي/xfail الاختبارات باستخدام @pytets.mark.skip و@pytest.mark.xfail
- إنشاء نتائج الاختبار بتنسيق XML والتي تغطي تفاصيل الاختبار المنفذ باستخدام py.test test_sample1.py -v –junitxml=”result.xml”
- نموذج إطار عمل pytest لاختبار واجهة برمجة التطبيقات




