पाइस्टेस्ट - क्विक गाइड

पाइस्टेस्ट एक पायथन बेस्ड टेस्टिंग फ्रेमवर्क है, जिसका उपयोग टेस्ट कोड लिखने और निष्पादित करने के लिए किया जाता है। REST सेवाओं के वर्तमान दिनों में, pytest का उपयोग मुख्य रूप से API परीक्षण के लिए किया जाता है, भले ही हम pytest का उपयोग जटिल परीक्षणों को सरल लिखने के लिए कर सकते हैं, अर्थात, हम API, डेटाबेस, UI, आदि का परीक्षण करने के लिए कोड लिख सकते हैं।

पाइस्टेस्ट के लाभ

Pytest के फायदे इस प्रकार हैं -

  • पाइस्टेस्ट समानांतर में कई परीक्षण चला सकता है, जो परीक्षण सूट के निष्पादन समय को कम करता है।

  • स्पष्ट रूप से उल्लेख नहीं किए जाने पर, टेस्ट फ़ाइल और परीक्षण कार्यों का स्वचालित रूप से पता लगाने के लिए पाइस्टेस्ट का अपना तरीका है।

  • Pytest हमें निष्पादन के दौरान परीक्षणों के एक सबसेट को छोड़ देता है।

  • पाइस्टेस्ट हमें पूरे टेस्ट सूट के सबसेट को चलाने की अनुमति देता है।

  • पाइस्टेस्ट स्वतंत्र और खुला स्रोत है।

  • इसकी सरल वाक्य रचना के कारण, pytest को शुरू करना बहुत आसान है।

इस ट्यूटोरियल में हम सैंपल प्रोग्राम्स के साथ पाइस्टेस्ट फंडामेंटल बताएंगे।

इस अध्याय में, हम सीखेंगे कि कैसे pytest स्थापित करें।

स्थापना शुरू करने के लिए, निम्नलिखित कमांड निष्पादित करें -

pip install pytest == 2.9.1

हम pytest के किसी भी संस्करण को स्थापित कर सकते हैं। यहां, 2.9.1 वह संस्करण है जिसे हम इंस्टॉल कर रहे हैं।

पाइटेस्ट के नवीनतम संस्करण को स्थापित करने के लिए, निम्नलिखित कमांड निष्पादित करें -

pip install pytest

पाइस्टेस्ट के सहायता अनुभाग को प्रदर्शित करने के लिए निम्न कमांड का उपयोग करके इंस्टॉलेशन की पुष्टि करें।

pytest -h

एक फ़ाइल नाम का उल्लेख किए बिना पाइस्टेस्ट चलाने से प्रारूप की सभी फाइलें चलेंगी test_*.py या *_test.pyवर्तमान निर्देशिका और उपनिर्देशिकाओं में। Pytest स्वचालित रूप से उन फ़ाइलों को परीक्षण फ़ाइलों के रूप में पहचानता है। हमcan स्पष्ट रूप से उनका उल्लेख करके अन्य फाइलनामों को चलाएं।

Pytest को शुरू करने के लिए परीक्षण फ़ंक्शन नामों की आवश्यकता होती है test। फ़ंक्शन नाम जो प्रारूप के नहीं हैंtest*पाइस्टेस्ट द्वारा परीक्षण कार्यों के रूप में नहीं माना जाता है। हमcannot स्पष्ट रूप से किसी भी फ़ंक्शन के साथ शुरू नहीं करने पर विचार करें test परीक्षण समारोह के रूप में।

हम अपने बाद के अध्यायों में परीक्षणों के निष्पादन को समझेंगे।

अब, हम अपने पहले पाइस्टेस्ट कार्यक्रम के साथ शुरुआत करेंगे। हम पहले एक निर्देशिका बनाएंगे और इस तरह, निर्देशिका में हमारी परीक्षण फ़ाइलें बनाएँ।

हमें नीचे दिखाए गए चरणों का पालन करें -

  • नाम से एक नई निर्देशिका बनाएँ automation और अपनी कमांड लाइन में निर्देशिका में नेविगेट करें।

  • नाम से एक फ़ाइल बनाएँ test_square.py और उस फ़ाइल में नीचे कोड जोड़ें।

import math

def test_sqrt():
   num = 25
   assert math.sqrt(num) == 5

def testsquare():
   num = 7
   assert 7*7 == 40

def tesequality():
   assert 10 == 11

निम्नलिखित कमांड का उपयोग करके परीक्षण चलाएं -

pytest

उपरोक्त कमांड निम्नलिखित आउटपुट उत्पन्न करेगा -

test_square.py .F
============================================== FAILURES 
==============================================
______________________________________________ testsquare 
_____________________________________________
   def testsquare():
   num=7
>  assert 7*7 == 40
E  assert (7 * 7) == 40
test_square.py:9: AssertionError
================================= 1 failed, 1 passed in 0.06 seconds 
=================================

परिणाम की पहली पंक्ति देखें। यह फ़ाइल नाम और परिणाम प्रदर्शित करता है। F परीक्षण विफलता का प्रतिनिधित्व करता है और डॉट (।) एक परीक्षण सफलता का प्रतिनिधित्व करता है।

नीचे, हम असफल परीक्षणों का विवरण देख सकते हैं। यह दिखाएगा कि परीक्षण किस कथन पर विफल रहा है। हमारे उदाहरण में, 7 * 7 की तुलना 40 के मुकाबले समानता के लिए की जाती है, जो गलत है। अंत में, हम परीक्षण निष्पादन सारांश, 1 असफल और 1 उत्तीर्ण देख सकते हैं।

फ़ंक्शन tesequality को निष्पादित नहीं किया जाता है क्योंकि पाइस्टेस्ट इसे एक परीक्षण के रूप में नहीं मानेंगे क्योंकि इसका नाम प्रारूप का नहीं है test*

अब, नीचे दिए गए कमांड को निष्पादित करें और फिर से परिणाम देखें -

pytest -v

-शरीर की कार्यक्षमता बढ़ाता है।

test_square.py::test_sqrt PASSED
test_square.py::testsquare FAILED
============================================== FAILURES 
==============================================
_____________________________________________ testsquare 
_____________________________________________
   def testsquare():
   num = 7
>  assert 7*7 == 40
E  assert (7 * 7) == 40
test_square.py:9: AssertionError
================================= 1 failed, 1 passed in 0.04 seconds 
=================================

अब परिणाम परीक्षण के बारे में अधिक व्याख्यात्मक है जो विफल हो गया और जो परीक्षा उत्तीर्ण हुई।

Note - pytest कमांड प्रारूप की सभी फाइलों को निष्पादित करेगी test_* या *_test वर्तमान निर्देशिका और उपनिर्देशिकाओं में।

इस अध्याय में, हम सीखेंगे कि एकल परीक्षण फ़ाइल और एकाधिक परीक्षण फ़ाइलों को कैसे निष्पादित किया जाए। हमारे पास पहले से ही एक परीक्षण फ़ाइल हैtest_square.pyबनाया था। एक नई परीक्षा फ़ाइल बनाएँtest_compare.py निम्नलिखित कोड के साथ -

def test_greater():
   num = 100
   assert num > 100

def test_greater_equal():
   num = 100
   assert num >= 100

def test_less():
   num = 100
   assert num < 200

अब सभी फाइलों से सभी परीक्षण चलाने के लिए (2 फाइलें यहां) हमें निम्नलिखित कमांड चलाने की आवश्यकता है -

pytest -v

उपरोक्त आदेश दोनों से परीक्षण चलाएगा test_square.py तथा test_compare.py। आउटपुट निम्नानुसार उत्पन्न होगा -

test_compare.py::test_greater FAILED
test_compare.py::test_greater_equal PASSED
test_compare.py::test_less PASSED
test_square.py::test_sqrt PASSED
test_square.py::testsquare FAILED
================================================ FAILURES 
================================================
______________________________________________ test_greater 
______________________________________________
   def test_greater():
   num = 100
>  assert num > 100
E  assert 100 > 100

test_compare.py:3: AssertionError
_______________________________________________ testsquare 
_______________________________________________
   def testsquare():
   num = 7
>  assert 7*7 == 40
E  assert (7 * 7) == 40

test_square.py:9: AssertionError
=================================== 2 failed, 3 passed in 0.07 seconds 
===================================

किसी विशिष्ट फ़ाइल से परीक्षण निष्पादित करने के लिए, निम्नलिखित सिंटैक्स का उपयोग करें -

pytest <filename> -v

अब, निम्नलिखित कमांड चलाएँ -

pytest test_compare.py -v

उपरोक्त आदेश केवल फ़ाइल से परीक्षण निष्पादित करेगा test_compare.py. हमारा परिणाम होगा -

test_compare.py::test_greater FAILED
test_compare.py::test_greater_equal PASSED
test_compare.py::test_less PASSED
============================================== FAILURES 
==============================================
____________________________________________ test_greater 
____________________________________________
   def test_greater():
   num = 100
>  assert num > 100
E  assert 100 > 100
test_compare.py:3: AssertionError
================================= 1 failed, 2 passed in 0.04 seconds 
=================================

वास्तविक परिदृश्य में, हमारे पास कई परीक्षण फ़ाइलें होंगी और प्रत्येक फ़ाइल में कई परीक्षण होंगे। टेस्ट में विभिन्न मॉड्यूल और फ़ंक्शंस शामिल होंगे। मान लीजिए, हम परीक्षण के केवल एक विशिष्ट सेट को चलाना चाहते हैं; हम इसके बारे में कैसे जाने?

Pytest टेस्ट सूट के सबसेट को चलाने के लिए दो तरीके प्रदान करता है।

  • परीक्षण नामों के मिलान के आधार पर चलाने के लिए परीक्षण का चयन करें।
  • लागू किए गए मार्करों के आधार पर चलाने के लिए परीक्षण समूहों का चयन करें।

हम इन दोनों को बाद के अध्यायों में उदाहरणों के साथ समझाएंगे।

इसके नाम में एक स्ट्रिंग युक्त परीक्षणों को निष्पादित करने के लिए हम निम्नलिखित सिंटैक्स का उपयोग कर सकते हैं -

pytest -k <substring> -v

-k <substring> परीक्षण नामों में खोज करने के लिए प्रतिस्थापन का प्रतिनिधित्व करता है।

अब, निम्नलिखित कमांड चलाएँ -

pytest -k great -v

यह शब्द वाले सभी परीक्षण नामों को निष्पादित करेगा ‘great’इसके नाम में। इस मामले में, वे हैंtest_greater() तथा test_greater_equal()। परिणाम नीचे देखें।

test_compare.py::test_greater FAILED
test_compare.py::test_greater_equal PASSED
============================================== FAILURES 
==============================================
____________________________________________ test_greater 
____________________________________________
def test_greater():
num = 100
>  assert num > 100
E  assert 100 > 100
test_compare.py:3: AssertionError
========================== 1 failed, 1 passed, 3 deselected in 0.07 seconds 
==========================

यहां परिणाम में, हम 3 परीक्षणों को अचयनित देख सकते हैं। ऐसा इसलिए है क्योंकि उन परीक्षण नामों में शब्द शामिल नहीं हैgreat उनमे।

Note - परीक्षण समारोह का नाम अभी भी 'परीक्षण' से शुरू होना चाहिए।

इस अध्याय में, हम सीखेंगे कि मार्करों का उपयोग करके परीक्षणों को कैसे व्यवस्थित किया जाए।

पाइस्टेस्ट हमें परीक्षण कार्यों पर मार्कर का उपयोग करने की अनुमति देता है। फ़ंक्शन का परीक्षण करने के लिए विभिन्न सुविधाओं / विशेषताओं को सेट करने के लिए मार्कर का उपयोग किया जाता है। पाइस्टेस्ट कई इनबिल्ट मार्कर प्रदान करता है जैसे कि xfail, स्किप और पैराट्रिज। इसके अलावा, उपयोगकर्ता अपने स्वयं के मार्कर नाम बना सकते हैं। नीचे दिए गए सिंटैक्स का उपयोग करके परीक्षण पर मार्कर लगाए जाते हैं -

@pytest.mark.<markername>

मार्करों का उपयोग करने के लिए, हमें करना होगा import pytestपरीक्षण फ़ाइल में मॉड्यूल। हम परीक्षणों के लिए अपने स्वयं के मार्कर नामों को परिभाषित कर सकते हैं और उन मार्कर नामों वाले परीक्षणों को चला सकते हैं।

चिह्नित परीक्षणों को चलाने के लिए, हम निम्नलिखित सिंटैक्स का उपयोग कर सकते हैं -

pytest -m <markername> -v

-m <markername> निष्पादित किए जाने वाले परीक्षणों के मार्कर नाम का प्रतिनिधित्व करता है।

हमारे परीक्षण फ़ाइलों को अद्यतन करें test_compare.py तथा test_square.pyनिम्नलिखित कोड के साथ। हम 3 मार्करों को परिभाषित कर रहे हैं– great, square, others

test_compare.py

import pytest
@pytest.mark.great
def test_greater():
   num = 100
   assert num > 100

@pytest.mark.great
def test_greater_equal():
   num = 100
   assert num >= 100

@pytest.mark.others
def test_less():
   num = 100
   assert num < 200

test_square.py

import pytest
import math

@pytest.mark.square
def test_sqrt():
   num = 25
   assert math.sqrt(num) == 5

@pytest.mark.square
def testsquare():
   num = 7
   assert 7*7 == 40

@pytest.mark.others
   def test_equality():
   assert 10 == 11

अब चिह्नित परीक्षणों को चलाने के लिए others, निम्न कमांड चलाएं -

pytest -m others -v

परिणाम नीचे देखें। इसने चिह्नित 2 परीक्षणों को चलायाothers

test_compare.py::test_less PASSED
test_square.py::test_equality FAILED
============================================== FAILURES
==============================================
___________________________________________ test_equality
____________________________________________
   @pytest.mark.others
   def test_equality():
>  assert 10 == 11
E  assert 10 == 11
test_square.py:16: AssertionError
========================== 1 failed, 1 passed, 4 deselected in 0.08 seconds
==========================

इसी तरह, हम अन्य मार्करों के साथ भी परीक्षण चला सकते हैं - महान, तुलना

फिक्स्चर फ़ंक्शंस हैं, जो प्रत्येक परीक्षण फ़ंक्शन से पहले चलेंगे, जिस पर इसे लागू किया जाता है। फिक्स्चर का उपयोग कुछ डेटा को परीक्षण के लिए करने के लिए किया जाता है जैसे डेटाबेस कनेक्शन, परीक्षण करने के लिए URL और कुछ प्रकार के इनपुट डेटा। इसलिए, प्रत्येक परीक्षण के लिए समान कोड चलाने के बजाय, हम परीक्षण के लिए फ़िक्शन फ़ंक्शन संलग्न कर सकते हैं और यह प्रत्येक परीक्षण को निष्पादित करने से पहले परीक्षण में डेटा को चलाएगा और वापस कर देगा।

एक फ़ंक्शन द्वारा एक स्थिरता के रूप में चिह्नित किया जाता है -

@pytest.fixture

एक परीक्षण फ़ंक्शन इनपुट पैरामीटर के रूप में स्थिरता नाम का उल्लेख करके एक स्थिरता का उपयोग कर सकता है।

एक फ़ाइल बनाएँ test_div_by_3_6.py और नीचे दिए गए कोड को इसमें जोड़ें

import pytest

@pytest.fixture
def input_value():
   input = 39
   return input

def test_divisible_by_3(input_value):
   assert input_value % 3 == 0

def test_divisible_by_6(input_value):
   assert input_value % 6 == 0

यहां, हमारे पास एक फिक्स्चर फ़ंक्शन है जिसका नाम है input_value, जो परीक्षण के लिए इनपुट की आपूर्ति करता है। स्थिरता फ़ंक्शन का उपयोग करने के लिए, परीक्षणों को इनपुट पैरामीटर के रूप में स्थिरता नाम का उल्लेख करना होगा।

जब तक परीक्षण निष्पादित किया जा रहा है, तब तक पाइस्टेस्ट को इनपुट पैरामीटर के रूप में स्थिरता नाम दिखाई देगा। यह तब स्थिरता फ़ंक्शन को निष्पादित करता है और लौटाया गया मान इनपुट पैरामीटर में संग्रहीत होता है, जिसका उपयोग परीक्षण द्वारा किया जा सकता है।

निम्नलिखित आदेश का उपयोग करके परीक्षण निष्पादित करें -

pytest -k divisible -v

उपरोक्त आदेश निम्नलिखित परिणाम उत्पन्न करेगा -

test_div_by_3_6.py::test_divisible_by_3 PASSED
test_div_by_3_6.py::test_divisible_by_6 FAILED
============================================== FAILURES
==============================================
________________________________________ test_divisible_by_6
_________________________________________
input_value = 39
   def test_divisible_by_6(input_value):
>  assert input_value % 6 == 0
E  assert (39 % 6) == 0
test_div_by_3_6.py:12: AssertionError
========================== 1 failed, 1 passed, 6 deselected in 0.07 seconds
==========================

हालांकि, दृष्टिकोण अपनी सीमा के साथ आता है। एक परीक्षण फ़ाइल के अंदर परिभाषित एक स्थिरता समारोह केवल परीक्षण फ़ाइल के भीतर एक गुंजाइश है। हम उस स्थिरता का उपयोग किसी अन्य परीक्षण फ़ाइल में नहीं कर सकते हैं। कई परीक्षण फ़ाइलों के लिए एक स्थिरता उपलब्ध कराने के लिए, हमें conftest.py नामक एक फ़ाइल में स्थिरता समारोह को परिभाषित करना होगा।conftest.py अगले अध्याय में बताया गया है।

हम उन्हें कई परीक्षण फ़ाइलों के लिए सुलभ बनाने के लिए इस फ़ाइल में फ़िक्चर फ़ंक्शन को परिभाषित कर सकते हैं।

एक नई फ़ाइल बनाएँ conftest.py और इसमें नीचे कोड जोड़ें -

import pytest

@pytest.fixture
def input_value():
   input = 39
   return input

संपादित करें test_div_by_3_6.py स्थिरता समारोह को दूर करने के लिए -

import pytest

def test_divisible_by_3(input_value):
   assert input_value % 3 == 0

def test_divisible_by_6(input_value):
   assert input_value % 6 == 0

एक नई फ़ाइल बनाएँ test_div_by_13.py -

import pytest

def test_divisible_by_13(input_value):
   assert input_value % 13 == 0

अब, हमारे पास फाइलें हैं test_div_by_3_6.py तथा test_div_by_13.py में परिभाषित स्थिरता का उपयोग करना conftest.py

निम्नलिखित कमांड निष्पादित करके परीक्षण चलाएं -

pytest -k divisible -v

उपरोक्त आदेश निम्नलिखित परिणाम उत्पन्न करेगा -

test_div_by_13.py::test_divisible_by_13 PASSED
test_div_by_3_6.py::test_divisible_by_3 PASSED
test_div_by_3_6.py::test_divisible_by_6 FAILED
============================================== FAILURES
==============================================
________________________________________ test_divisible_by_6
_________________________________________
input_value = 39
   def test_divisible_by_6(input_value):
>  assert input_value % 6 == 0
E  assert (39 % 6) == 0
test_div_by_3_6.py:7: AssertionError
========================== 1 failed, 2 passed, 6 deselected in 0.09 seconds
==========================

परीक्षण एक ही फ़ाइल में स्थिरता के लिए दिखेगा। जैसा कि फ़ाइल में स्थिरता नहीं मिली है, यह conftest.py फ़ाइल में स्थिरता की जांच करेगा। इसे खोजने पर, स्थिरता विधि लागू होती है और परिणाम परीक्षण के इनपुट तर्क पर वापस आ जाता है।

परीक्षण के पैरामीटर को इनपुट के कई सेटों के खिलाफ परीक्षण चलाने के लिए किया जाता है। हम निम्न मार्कर का उपयोग करके ऐसा कर सकते हैं -

@pytest.mark.parametrize

नीचे दिए गए कोड को नामक फ़ाइल में कॉपी करें test_multiplication.py -

import pytest

@pytest.mark.parametrize("num, output",[(1,11),(2,22),(3,35),(4,44)])
def test_multiplication_11(num, output):
   assert 11*num == output

यहां परीक्षण 11 के साथ एक इनपुट को गुणा करता है और परिणाम की अपेक्षित आउटपुट के साथ तुलना करता है। परीक्षण में इनपुट के 4 सेट हैं, प्रत्येक में 2 मान हैं - एक 11 के साथ गुणा किया जाने वाला नंबर है और दूसरा अपेक्षित परिणाम है।

निम्नलिखित कमांड को चलाकर परीक्षा पास करें -

Pytest -k multiplication -v

उपरोक्त कमांड निम्नलिखित आउटपुट उत्पन्न करेगा -

test_multiplication.py::test_multiplication_11[1-11] PASSED
test_multiplication.py::test_multiplication_11[2-22] PASSED
test_multiplication.py::test_multiplication_11[3-35] FAILED
test_multiplication.py::test_multiplication_11[4-44] PASSED
============================================== FAILURES
==============================================
_________________ test_multiplication_11[3-35] __________________
num = 3, output = 35
   @pytest.mark.parametrize("num, output",[(1,11),(2,22),(3,35),(4,44)])
   def test_multiplication_11(num, output):
>  assert 11*num == output
E  assert (11 * 3) == 35
test_multiplication.py:5: AssertionError
============================== 1 failed, 3 passed, 8 deselected in 0.08 seconds
==============================

इस अध्याय में, हम पाइस्टेस्ट में स्किप और एक्सफ़ेल परीक्षणों के बारे में जानेंगे।

अब, निम्न स्थितियों पर विचार करें -

  • कुछ कारणों से कुछ समय के लिए एक परीक्षण प्रासंगिक नहीं है।
  • एक नई सुविधा लागू की जा रही है और हमने पहले ही उस सुविधा के लिए एक परीक्षण जोड़ दिया है।

इन स्थितियों में, हमारे पास परीक्षण को एक्सफ़िल करने या परीक्षणों को छोड़ने का विकल्प है।

पाइस्टेस्ट एक्सफ़ेल्ड परीक्षण को अंजाम देगा, लेकिन इसे भाग असफल या उत्तीर्ण परीक्षण नहीं माना जाएगा। यदि परीक्षण विफल हो जाता है, तो भी इन परीक्षणों का विवरण मुद्रित नहीं किया जाएगा (याद रखें कि आमतौर पर असफल परीक्षण विवरण प्रिंट करता है)। हम निम्नलिखित मार्कर का उपयोग करके परीक्षण को दिखा सकते हैं -

@pytest.mark.xfail

परीक्षण छोड़ने का मतलब है कि परीक्षण निष्पादित नहीं किया जाएगा। हम निम्नलिखित मार्कर का उपयोग करके परीक्षण छोड़ सकते हैं -

@pytest.mark.skip

बाद में, जब परीक्षण प्रासंगिक हो जाता है तो हम मार्करों को हटा सकते हैं।

संपादित करें test_compare.py हमें पहले से ही xfail और स्किप मार्कर शामिल करना होगा -

import pytest
@pytest.mark.xfail
@pytest.mark.great
def test_greater():
   num = 100
   assert num > 100

@pytest.mark.xfail
@pytest.mark.great
def test_greater_equal():
   num = 100
   assert num >= 100

@pytest.mark.skip
@pytest.mark.others
def test_less():
   num = 100
   assert num < 200

निम्नलिखित आदेश का उपयोग करके परीक्षण निष्पादित करें -

pytest test_compare.py -v

निष्पादन के बाद, उपरोक्त आदेश निम्नलिखित परिणाम उत्पन्न करेगा -

test_compare.py::test_greater xfail
test_compare.py::test_greater_equal XPASS
test_compare.py::test_less SKIPPED
============================ 1 skipped, 1 xfailed, 1 xpassed in 0.06 seconds
============================

वास्तविक परिदृश्य में, एक बार कोड का एक नया संस्करण तैनात करने के लिए तैयार है, इसे पहले पूर्व-ठेस / मंचन वातावरण में तैनात किया गया है। फिर उस पर एक टेस्ट सूट चलता है।

कोड केवल उत्पादन के लिए तैनात करने के लिए योग्य है यदि परीक्षण सूट पास हो। यदि परीक्षण विफलता है, चाहे वह एक हो या कई, कोड तैयार नहीं है।

इसलिए, क्या होगा अगर हम परीक्षण संख्या के परीक्षण के निष्पादन को रोकना चाहते हैं, क्योंकि n संख्या परीक्षण विफल होने के तुरंत बाद। यह मैक्सफेल का उपयोग करके पाइस्टेस्ट में किया जा सकता है।

परीक्षण की संख्या के फेल होने के तुरंत बाद टेस्ट सूट के निष्पादन को रोकने का सिंटैक्स इस प्रकार है -

pytest --maxfail = <num>

निम्न कोड के साथ एक फ़ाइल test_failure.py बनाएं।

import pytest
import math

def test_sqrt_failure():
   num = 25
   assert math.sqrt(num) == 6

def test_square_failure():
   num = 7
   assert 7*7 == 40

def test_equality_failure():
   assert 10 == 11

सभी 3 परीक्षण इस परीक्षण फ़ाइल को निष्पादित करने में विफल होंगे। यहाँ, हम एक के बाद एक परीक्षण के निष्पादन को रोकने जा रहे हैं -

pytest test_failure.py -v --maxfail = 1
test_failure.py::test_sqrt_failure FAILED
=================================== FAILURES
=================================== _______________________________________
test_sqrt_failure __________________________________________
   def test_sqrt_failure():
   num = 25
>  assert math.sqrt(num) == 6
E  assert 5.0 == 6
E  + where 5.0 = <built-in function sqrt>(25)
E  + where <built-in function sqrt>= math.sqrt
test_failure.py:6: AssertionError
=============================== 1 failed in 0.04 seconds
===============================

उपरोक्त परिणाम में, हम देख सकते हैं कि निष्पादन एक विफलता पर रोक दिया गया है।

डिफ़ॉल्ट रूप से, pytest अनुक्रमिक क्रम में परीक्षण चलाता है। एक वास्तविक परिदृश्य में, एक परीक्षण सूट में कई परीक्षण फाइलें होंगी और प्रत्येक फ़ाइल में परीक्षणों का एक गुच्छा होगा। यह एक बड़े निष्पादन समय को बढ़ावा देगा। इसे दूर करने के लिए, पाइस्टेस्ट हमें समानांतर में परीक्षण चलाने का विकल्प प्रदान करता है।

इसके लिए हमें सबसे पहले pytest-xdist plugin को इनस्टॉल करना होगा।

निम्नलिखित कमांड चलाकर pytest-xdist स्थापित करें -

pip install pytest-xdist

अब, हम सिंटैक्स का उपयोग करके परीक्षण चला सकते हैं pytest -n <num>

pytest -n 3

-n <संख्या> कई श्रमिकों का उपयोग करके परीक्षण चलाता है, यहां यह 3 है।

जब हम केवल कुछ परीक्षण चलाने के लिए है, तो हमें अधिक समय का अंतर नहीं होगा। हालांकि, यह तब मायने रखता है जब टेस्ट सूट बड़ा हो।

हम एक xml फ़ाइल में परीक्षण निष्पादन के विवरण उत्पन्न कर सकते हैं। यह xml फ़ाइल मुख्य रूप से उन मामलों में उपयोगी है, जहां हमारे पास एक डैशबोर्ड है जो परीक्षण के परिणामों को प्रोजेक्ट करता है। ऐसे मामलों में, निष्पादन का विवरण प्राप्त करने के लिए xml को पार्स किया जा सकता है।

अब हम test_multiplcation.py से परीक्षण निष्पादित करेंगे और xml चलाकर उत्पन्न करेंगे

pytest test_multiplication.py -v --junitxml="result.xml"

अब हम परिणाम देख सकते हैं। xml निम्नलिखित डेटा के साथ उत्पन्न होता है -

<?xml version = "1.0" encoding = "utf-8"?>
<testsuite errors = "0" failures = "1"
name = "pytest" skips = "0" tests = "4" time = "0.061">
   <testcase classname = "test_multiplication"          
      file = "test_multiplication.py"
      line = "2" name = "test_multiplication_11[1-11]"
      time = "0.00117516517639>
   </testcase>
   
   <testcase classname = "test_multiplication"    
      file = "test_multiplication.py"
      line = "2" name = "test_multiplication_11[2-22]"
      time = "0.00155973434448">
   </testcase>

   <testcase classname = "test_multiplication" 
      file = "test_multiplication.py"
      line = "2" name = "test_multiplication_11[3-35]" time = "0.00144290924072">
      failure message = "assert (11 * 3) == 35">num = 3, output = 35

         @pytest.mark.parametrize("num,
         output",[(1,11),(2,22),(3,35),(4,44)])
            
         def test_multiplication_11(num, output):> 
         assert 11*num == output
         E assert (11 * 3) == 35

         test_multiplication.py:5: AssertionErro
      </failure>
   </testcase>
   <testcase classname = "test_multiplication" 
      file = "test_multiplication.py"
      line = "2" name = "test_multiplication_11[4-44]"
      time = "0.000945091247559">
   </testcase>
</testsuite>

यहाँ, टैग <testsuit> संक्षेप में 4 परीक्षण थे और विफलताओं की संख्या 1 है।

  • टैग <testcase> प्रत्येक निष्पादित परीक्षण का विवरण देता है।

  • <विफलता> टैग विफल परीक्षण कोड का विवरण देता है।

इस पाइस्टेस्ट ट्यूटोरियल में, हमने निम्नलिखित क्षेत्रों को कवर किया है -

  • पाइस्ट स्थापित करना ।।
  • परीक्षण फ़ाइलों और परीक्षण कार्यों की पहचान करना।
  • Pytest –v का उपयोग करके सभी परीक्षण फ़ाइलों को निष्पादित करना।
  • विशिष्ट फ़ाइल को निष्पादित करके pytest <filename> -v।
  • पाइस्टेस्ट -k <सब्स्ट्रिंग> -v के मिलान द्वारा परीक्षणों का परीक्षण करें।
  • मार्कर pytest -m <मार्कर_name> -v पर आधारित परीक्षण करें।
  • @ Pytest.fixture का उपयोग करके जुड़नार बनाना।
  • conftest.py कई फ़ाइलों से जुड़नार तक पहुँचने की अनुमति देता है।
  • @ Pytest.mark.parametrize का उपयोग करके परिक्षण परीक्षण।
  • @ Pytest.mark.xfail का उपयोग करके परीक्षण करना।
  • @ Pytest.mark.skip का उपयोग करके लंघन परीक्षण।
  • Pytest --maxfail = <num> का उपयोग करके n विफलताओं पर परीक्षण निष्पादन रोकें।
  • Pytest -n <num> का उपयोग करके समानांतर में परीक्षण चलाना।
  • Pytest -v --junitxml = "result.xml" का उपयोग करके xml परिणाम उत्पन्न करना।

इस ट्यूटोरियल ने आपको पाइस्टेस्ट फ्रेमवर्क से परिचित कराया। अब आपको pytest का उपयोग करके परीक्षण लिखना शुरू करने में सक्षम होना चाहिए।

एक अच्छे अभ्यास के रूप में -

  • कार्यक्षमता / मॉड्यूल के आधार पर अलग-अलग परीक्षण फ़ाइलें बनाएं।
  • फ़ाइलों और विधियों का परीक्षण करने के लिए सार्थक नाम दें।
  • विभिन्न मानदंडों के आधार पर परीक्षणों को समूहीकृत करने के लिए पर्याप्त मार्कर हैं।
  • जब भी जरूरत हो फिक्स्चर का उपयोग करें।