البرنامج التعليمي لـ PyTest: ما هو، كيفية التثبيت، الإطار، التأكيدات

ما هو بايتيست؟

باي تيست هو إطار اختبار يسمح للمستخدمين بكتابة رموز الاختبار باستخدام Python لغة برمجة. تساعدك على كتابة حالات اختبار بسيطة وقابلة للتطوير لقواعد البيانات أو واجهات برمجة التطبيقات أو واجهة المستخدم. تُستخدم PyTest بشكل أساسي لكتابة اختبارات لواجهات برمجة التطبيقات. تساعد في كتابة اختبارات من اختبارات الوحدات البسيطة إلى الاختبارات الوظيفية المعقدة.

لماذا استخدام بايتيست؟

بعض مزايا pytest هي

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

كيفية تثبيت بايتيست

فيما يلي عملية حول كيفية تثبيت PyTest:

الخطوة 1) يمكنك تثبيت pytest بواسطة

pip install pytest==2.9.1

بمجرد اكتمال التثبيت، يمكنك تأكيد ذلك من خلال

py.test -h

سيعرض هذا المساعدة

قم بتثبيت بايتيست

أول اختبار PyTest الأساسي

الآن، سوف نتعلم كيفية استخدام Pytest مع مثال PyTest الأساسي.

قم بإنشاء مجلد Study_pytest. سنقوم بإنشاء ملفات الاختبار الخاصة بنا داخل هذا المجلد.

يرجى الانتقال إلى هذا المجلد في سطر الأوامر الخاص بك.

قم بإنشاء ملف باسم test_sample1.py داخل المجلد

أول اختبار PyTest الأساسي

أضف الكود أدناه إليه واحفظه

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

أول اختبار PyTest الأساسي

هنا في 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

قم بإجراء الاختبارات بالتوازي مع Pytest

يمكنك إجراء الاختبارات الآن عن طريق

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 لاختبار واجهة برمجة التطبيقات

تلخيص هذه التدوينة بـ: