Python unittest पूर्ण मार्गदर्शिका | आधारदेखि उन्नतसम्म

1. Python unittest भने के हो?

unittest भने, Python को मानक पुस्तकालयमा समावेश गरिएको युनिट टेस्ट फ्रेमवर्क हो, जसले कोडको गुणस्तर सुनिश्चित गर्न महत्त्वपूर्ण उपकरण हो। विकासकर्ताहरूलाई कोडको प्रत्येक भागलाई अलग‑अलग परीक्षण गर्न सक्षम बनाउँछ, र प्रारम्भिक चरणमा बग पत्ता लगाउन मद्दत गर्दछ। साथै, निरन्तर विकासको क्रममा, कोडको परिवर्तनले मौजुदा कार्यक्षमता बिग्रिएको छैन भन्ने सुनिश्चित गर्न सहयोग पुर्‍याउँछ।

युनिट परीक्षणको महत्त्व

कोड जटिल हुँदै जाँदा, विभिन्न भागहरू सहीसँग सहकार्य गरी काम गरिरहेका छन् कि छैनन् जाँच्न गाह्रो हुन्छ। युनिट टेस्ट लागू गरेर, साना परिवर्तनहरूले उत्पन्न हुने अनपेक्षित बगहरूलाई रोक्न सजिलो हुन्छ, र सम्पूर्ण प्रोग्रामको स्थिरता कायम राख्न सकिन्छ।

2. unittest को मूलभूत प्रयोग

unittest को आधारभूत कुरा भनेको unittest.TestCase लाई उत्तराधिकार गर्ने वर्ग बनाउनु हो, र त्यसभित्र परीक्षण विधिहरू परिभाषित गर्नु हो। परीक्षण विधिभित्र, assertEqual() जस्ता असर्शन विधिहरू प्रयोग गरेर, अपेक्षित नतिजा र वास्तविक नतिजा तुलना गरिन्छ।

मूलभूत परीक्षणको उदाहरण

तलको कोड add(a, b) फलनलाई परीक्षण गर्ने सरल उदाहरण हो।
import unittest

# परीक्षणको लक्ष्य कोड
def add(a, b):
    return a + b

# परीक्षण वर्ग
class TestAddFunction(unittest.TestCase):

    def test_add_integers(self):
        result = add(2, 3)
        self.assertEqual(result, 5)

if __name__ == '__main__':
    unittest.main()
यो कोडमा, add() फलन सही रूपमा काम गर्छ कि छैन परीक्षण गरिन्छ। assertEqual() विधि अपेक्षित मान र वास्तविक नतिजा छैन जाँच गर्छ। यस तरिकाले, विभिन्न केसहरूमा फलन सही रूपमा काम गर्छ कि छैन पुष्टि गर्न सकिन्छ।

परीक्षणको विस्तार

धेरै परीक्षण विधिहरू प्रयोग गरेर, विभिन्न इनपुटहरूमा फलनको व्यवहार परीक्षण गर्न सकिन्छ। उदाहरणका लागि, फ्लोटिङ पोइन्ट संख्याहरू वा स्ट्रिङ संयोजनको परीक्षण पनि सम्भव छ।
def test_add_floats(self):
    result = add(2.5, 3.5)
    self.assertAlmostEqual(result, 6.0, places=2)

def test_add_strings(self):
    result = add("Hello, ", "World!")
    self.assertEqual(result, "Hello, World!")
यसरी, विभिन्न डेटा प्रकारहरूमा फलनको व्यवहार परीक्षण गरेर, फलन विभिन्न परिस्थितिहरूमा सही रूपमा काम गर्छ कि छैन पुष्टि गर्न सकिन्छ।

3. setUp() र tearDown() को प्रयोग गर्ने तरिका

परीक्षणको अघि र पछि निश्चित प्रक्रिया स्वचालित रूपमा चलाउन, setUp() तथा tearDown() मेथडहरू प्रयोग गर्नुहोस्। यसले परीक्षण चलाउनु अघि आवश्यक तयारी गर्न र परीक्षण समाप्त भएपछि सफा गर्ने कार्य गर्न सकिन्छ।

setUp() को उदाहरण

setUp() मेथड प्रत्येक परीक्षण मेथड चल्नु अघि अनिवार्य रूपमा कल गरिने मेथड हो, जसले साझा आरम्भिक प्रक्रिया सङ्कलन गर्न सक्छ।
def setUp(self):
    self.temp_value = 42

tearDown() को उदाहरण

tearDown() मेथड प्रत्येक परीक्षण मेथड पछि चलाइन्छ, र पछि प्रक्रिया तथा स्रोतहरू मुक्त गर्ने कार्य गर्दछ। उदाहरणका लागि, डेटाबेस जडान टुटाउने वा अस्थायी फाइल मेटाउने आदि प्रयोग गर्न सकिन्छ।
def tearDown(self):
    self.temp_value = None
यसरी, परीक्षण कोडको दोहोर्याइ घटाएर, अझ सफा कोड कायम गर्न सकिन्छ।

4. मोक प्रयोग गरेर निर्भरता परीक्षण

यदि परीक्षणको लक्ष्य कोड बाह्य स्रोतहरू(डेटाबेस、API आदि)मा निर्भर छ भने, त्यस निर्भर भागलाई मोकसँग बदल्दा परीक्षणको कार्यान्वयन गति सुधार्न र पूर्वानुमानित परीक्षण गर्न सकिन्छ। Python कोunittest.mock मोड्युल प्रयोग गरेर यो सजिलै हासिल गर्न सकिन्छ।

मोकको उदाहरण

तलको कोडमा, time_consuming_function() नामको लामो समय लाग्ने कार्यलाई मोकसँग बदलिएको छ।
from unittest.mock import patch

class TestAddFunction(unittest.TestCase):

    @patch('my_module.time_consuming_function')
    def test_add_with_mock(self, mock_func):
        mock_func.return_value = 0
        result = add(2, 3)
        self.assertEqual(result, 5)
यस उदाहरणमा, मोक प्रयोग गरेर time_consuming_function लाई नबोलिकै परीक्षण चलाइन्छ। यसले परीक्षण समय घटाउँछ र सटीक नतिजा प्राप्त गर्न मद्दत गर्दछ।
年収訴求

5. अपवाद ह्यान्डलिंग र कस्टम असर्शन

unittest मा, अपवाद ह्यान्डलिंग पनि परीक्षण गर्न सम्भव छ। उदाहरणका लागि, विशेष परिस्थितिमा अपवाद सही रूपमा उत्पन्न हुन्छ कि छैन भनि पुष्टि गर्न, assertRaises() प्रयोग गर्नुहोस्।

अपवाद ह्यान्डलिंगको परीक्षण

अगामी उदाहरणमा, ZeroDivisionError को उत्पन्न हुने कुरा पुष्टि गरिन्छ।
def test_divide_by_zero(self):
    with self.assertRaises(ZeroDivisionError):
        divide(1, 0)
यो कोडले, divide(1, 0) कल गर्दा ZeroDivisionError उत्पन्न हुन्छ कि छैन परीक्षण गर्दछ।

कस्टम असर्शनको निर्माण

मानक असर्शनले समाधान गर्न नसक्ने केसहरूमा, आफ्नै कस्टम असर्शन मेथड बनाउन सकिन्छ।
def assertIsPositive(self, value):
    self.assertTrue(value > 0, f'{value} is not positive')
कस्टम असर्शन प्रयोग गरेर, अझ विशिष्ट परीक्षण परिदृश्यहरूलाई सम्बोधन गर्न सकिन्छ।

6. unittest को टेस्ट डिस्कभरी सुविधा

unittest को टेस्ट डिस्कभरी सुविधा प्रयोग गर्दा, प्रोजेक्टभित्रका सबै टेस्ट फाइलहरूलाई स्वचालित रूपमा फेला पारेर चलाउन सकिन्छ। यो सुविधा विशेष गरी ठूला प्रोजेक्टहरूमा उपयोगी हुन्छ।

टेस्ट डिस्कभरीको प्रयोग

टेस्ट डिस्कभरी चलाउनको लागि, तलको कमाण्ड प्रयोग गर्नुहोस्।
python -m unittest discover
यसले निर्दिष्ट गरिएको डाइरेक्टरीभित्रका सबै test_*.py फाइलहरू चलाइन्छ। फाइल वा डाइरेक्टरी निर्दिष्ट गर्न चाहनुहुन्छ भने, तलको जस्तै विकल्प प्रयोग गर्नुहोस्।
python -m unittest discover -s tests -p "test_*.py"
यो सुविधा प्रयोग गरेर, टेस्ट फाइलहरूलाई व्यक्तिगत रूपमा निर्दिष्ट गर्ने झन्झट बचत गर्न सकिन्छ, र ठूला प्रोजेक्टहरूमा पनि प्रभावकारी रूपमा टेस्ट व्यवस्थापन गर्न सकिन्छ।

7. unittest प्रयोग गरेर प्रदर्शन सुधारका टिप्स

यदि परीक्षणको कार्यान्वयन गति सुस्त छ भने, विकास दक्षता घट्छ। यहाँ, unittest प्रयोग गरेर परीक्षणको प्रदर्शन सुधार गर्नका केही टिप्स प्रस्तुत गरिन्छ।

फाइल I/O अनुकूलन गर्नुहोस्

फाइलमा पढ्ने/लेख्ने आवश्यक पर्ने परीक्षणहरूलाई मेमोरीभित्र प्रक्रिया गरेर गति बढाउन सकिन्छ। StringIO प्रयोग गरेर, मेमोरीमा फाइलजस्तै व्यवहार गर्ने वस्तु सिर्जना गरेर, डिस्क I/O टाल्न सकिन्छ।
from io import StringIO

class TestFileOperations(unittest.TestCase):

    def test_write_to_memory(self):
        output = StringIO()
        output.write('Hello, World!')
        self.assertEqual(output.getvalue(), 'Hello, World!')
यस विधिले, फाइल पहुँच आवश्यक पर्ने परीक्षणहरूमा पनि, परीक्षणको गति उल्लेखनीय रूपमा सुधार्न सकिन्छ।

मक प्रयोग गर्नुहोस्

बाह्य स्रोतहरूमा पहुँचलाई न्यूनतम राख्नका लागि, मक प्रयोग गरेर परीक्षणलाई तेज बनाउन सकिन्छ। यसले नेटवर्क वा डाटाबेस जस्ता विलम्बलाई टाल्न मद्दत गर्छ, र परीक्षण कार्यान्वयन समयलाई छोट्याउन सक्छ। तलको उदाहरणमा, API कललाई मकसँग बदलिएको छ।
from unittest.mock import MagicMock

class TestApiCall(unittest.TestCase):

    def test_api_response(self):
        mock_api = MagicMock(return_value={'status': 'success'})
        response = mock_api()
        self.assertEqual(response['status'], 'success')
यसरी, बाह्य स्रोतहरूमा निर्भर नगरी कार्यक्षमता परीक्षण गरेर, अझ तेज र स्थिर परीक्षण वातावरण निर्माण गर्न सकिन्छ।

8. सारांश र आगामी चरणहरू

यस लेखमा, Python को unittest प्रयोग गरेर युनिट टेस्टको आधारभूत कुरा, सेटअप र टियरडाउनको प्रयोग, मोक प्रयोग गरेर निर्भरता परीक्षण, र परीक्षणको प्रदर्शन सुधार्ने प्रविधिहरू सम्म विस्तृत रूपमा व्याख्या गरिएको छ।

मुख्य बुँदाहरूको सारांश

  • मूलभूत प्रयोग: unittest.TestCase लाई उत्तराधिकार गरेर, एसेर्शन मेथडहरू प्रयोग गरी परीक्षणहरू बनाइन्छ।
  • setUp() / tearDown(): परीक्षणको अघि र पछि साझा प्रक्रिया सङ्कलन र व्यवस्थापन गरेर, कोडको पुन: प्रयोगयोग्यता र पठनीयता सुधारिन्छ।
  • मोकको प्रयोग: बाह्य स्रोतमा निर्भर नगरी कार्यक्षमता परीक्षण गर्न सकिने कारण, परीक्षणको दक्षता उल्लेखनीय रूपमा सुधारिन्छ।
  • टेस्ट डिस्कभरी: ठूला प्रोजेक्टहरूमा परीक्षण व्यवस्थापनलाई सजिलो बनाउने उपयोगी सुविधा हो।
  • प्रदर्शन सुधार प्रविधि: मेमोरीमा प्रक्रिया र मोकको प्रयोगले परीक्षणको कार्यसमय घटाउन सकिन्छ।

अगामी चरणहरू

unittest को आधारभूत ज्ञान हासिल गरेपछि, अझ उन्नत परीक्षण विधिहरूमा पनि चुनौती दिनुहोस्। उदाहरणका लागि, धेरै इनपुट डेटा एकै पटक परीक्षण गर्न सक्ने “प्यारामिटराइज्ड टेस्ट” वा कवरेज टूल प्रयोग गरेर कोडको परीक्षण दायरा जाँच्ने जस्ता उपायहरूले प्रोजेक्टको सम्पूर्ण परीक्षण रणनीति बलियो बनाउँछ। साथै, pytest जस्ता अन्य परीक्षण फ्रेमवर्कहरूमा पनि ध्यान दिनुहोस्, जसले प्रयोग अनुसार विकल्पहरू विस्तार गर्न मद्दत गर्छ। परीक्षण विकासको महत्वपूर्ण तत्व हो। बगहरूलाई प्रारम्भिक चरणमै पत्ता लगाएर, कोडको गुणस्तर कायम राख्नका लागि, परीक्षणलाई सक्रिय रूपमा अपनाऔं।
年収訴求