Django च्या चाचणी फ्रेमवर्कचा सखोल अभ्यास, TestCase आणि TransactionTestCase ची तुलना करून तुम्हाला अधिक प्रभावी आणि विश्वसनीय चाचण्या लिहिण्यास मदत करते.
पायथन Django चाचणी: TestCase विरुद्ध TransactionTestCase
चाचणी हा सॉफ्टवेअर डेव्हलपमेंटचा एक महत्त्वाचा भाग आहे, जो तुमचं ॲप्लिकेशन अपेक्षेप्रमाणे कार्य करतं आणि कालांतरानं मजबूत राहतं याची खात्री देतो. Django, एक लोकप्रिय पायथन वेब फ्रेमवर्क, प्रभावी चाचण्या लिहिण्यासाठी एक शक्तिशाली चाचणी फ्रेमवर्क प्रदान करते. हा ब्लॉग पोस्ट Django च्या चाचणी फ्रेमवर्कमधील दोन मूलभूत वर्ग: TestCase
आणि TransactionTestCase
मध्ये सखोल माहिती देईल. आम्ही त्यांचे फरक, उपयोग आणि तुमच्या चाचणी गरजेनुसार योग्य वर्ग निवडण्यात मदत करण्यासाठी व्यावहारिक उदाहरणं देऊ.
Django मध्ये चाचणी का महत्त्वाची आहे
TestCase
आणि TransactionTestCase
च्या तपशीलांमध्ये जाण्यापूर्वी, Django डेव्हलपमेंटमध्ये चाचणी इतकी महत्त्वाची का आहे याबद्दल थोडक्यात चर्चा करूया:
- कोड गुणवत्ता सुनिश्चित करते: चाचण्या तुम्हाला डेव्हलपमेंट प्रक्रियेत लवकर बग पकडण्यास मदत करतात, ज्यामुळे ते प्रोडक्शनमध्ये जाण्यापासून रोखले जातात.
- रिफॅक्टरिंग सुलभ करते: सर्वसमावेशक चाचणी सूटसह, तुम्ही आत्मविश्वासाने तुमचा कोड रिफॅक्टर करू शकता, हे जाणून की जर तुम्ही कोणतेही रिग्रेशन सादर केले तर चाचण्या तुम्हाला सतर्क करतील.
- सहकार सुधारते: चांगल्या प्रकारे लिहिलेल्या चाचण्या तुमच्या कोडसाठी डॉक्युमेंटेशन म्हणून काम करतात, ज्यामुळे इतर डेव्हलपर्सना समजून घेणे आणि योगदान देणे सोपे होते.
- चाचणी-आधारित डेव्हलपमेंट (TDD) ला सपोर्ट करते: TDD हा एक डेव्हलपमेंट दृष्टिकोन आहे जिथे तुम्ही प्रत्यक्ष कोड लिहिण्यापूर्वी चाचण्या लिहिता. हे तुम्हाला तुमच्या ॲप्लिकेशनच्या अपेक्षित वर्तनाबद्दल विचार करण्यास भाग पाडते, ज्यामुळे स्वच्छ आणि अधिक देखरेख करण्यायोग्य कोड मिळतो.
Django चे चाचणी फ्रेमवर्क: एक संक्षिप्त माहिती
Django चे चाचणी फ्रेमवर्क पायथनच्या अंगभूत unittest
मॉड्यूलवर आधारित आहे. हे Django ॲप्लिकेशन्सची चाचणी करणे सोपे करते, यासाठी अनेक वैशिष्ट्ये पुरवते, ज्यात हे समाविष्ट आहेत:
- चाचणी शोध: Django तुमच्या प्रोजेक्टमधील चाचण्या आपोआप शोधतो आणि चालवतो.
- चाचणी रनर: Django एक चाचणी रनर पुरवतो जो तुमच्या चाचण्या कार्यान्वित करतो आणि निकाल देतो.
- ॲसर्शन पद्धती: Django ॲसर्शन पद्धतींचा एक संच पुरवतो ज्याचा उपयोग तुम्ही तुमच्या कोडच्या अपेक्षित वर्तनाची पडताळणी करण्यासाठी करू शकता.
- क्लायंट: Django चा चाचणी क्लायंट तुम्हाला तुमच्या ॲप्लिकेशनसोबत युजर इंटरॅक्शनचे अनुकरण करण्यास अनुमती देतो, जसे की फॉर्म सबमिट करणे किंवा API रिक्वेस्ट करणे.
- TestCase आणि TransactionTestCase: Django मध्ये चाचण्या लिहिण्यासाठी हे दोन मूलभूत वर्ग आहेत, ज्यांचा आपण तपशीलवार अभ्यास करू.
TestCase: जलद आणि कार्यक्षम युनिट चाचणी
TestCase
हा Django मध्ये युनिट चाचण्या लिहिण्यासाठी प्राथमिक वर्ग आहे. हे प्रत्येक चाचणी केससाठी स्वच्छ डेटाबेस वातावरण पुरवते, चाचण्या स्वतंत्र आहेत आणि एकमेकांमध्ये हस्तक्षेप करत नाहीत याची खात्री करते.
TestCase कसे कार्य करते
जेव्हा तुम्ही TestCase
वापरता, तेव्हा Django प्रत्येक चाचणी पद्धतीसाठी खालील पायऱ्या करतो:
- एक चाचणी डेटाबेस तयार करते: Django प्रत्येक चाचणी रनसाठी एक वेगळा चाचणी डेटाबेस तयार करते.
- डेटाबेस फ्लश करते: प्रत्येक चाचणी पद्धतीपूर्वी, Django चाचणी डेटाबेस फ्लश करते, सर्व विद्यमान डेटा काढून टाकते.
- चाचणी पद्धत चालवते: Django तुम्ही परिभाषित केलेली चाचणी पद्धत कार्यान्वित करते.
- व्यवहार परत फिरवते: प्रत्येक चाचणी पद्धतीनंतर, Django व्यवहार परत फिरवते, चाचणी दरम्यान डेटाबेसमध्ये केलेले कोणतेही बदल प्रभावीपणे पूर्ववत करते.
हा दृष्टिकोन सुनिश्चित करतो की प्रत्येक चाचणी पद्धत स्वच्छ slate ने सुरू होते आणि डेटाबेसमध्ये केलेले कोणतेही बदल आपोआप revert होतात. हे TestCase
ला युनिट चाचणीसाठी आदर्श बनवते, जिथे तुम्हाला तुमच्या ॲप्लिकेशनचे वैयक्तिक घटक स्वतंत्रपणे तपासायचे आहेत.
उदाहरण: एक साधे मॉडेल तपासणे
TestCase
वापरून Django मॉडेल तपासण्याचे एक साधे उदाहरण पाहू:
from django.test import TestCase
from .models import Product
class ProductModelTest(TestCase):
def test_product_creation(self):
product = Product.objects.create(name="Test Product", price=10.00)
self.assertEqual(product.name, "Test Product")
self.assertEqual(product.price, 10.00)
self.assertTrue(isinstance(product, Product))
या उदाहरणात, आम्ही Product
मॉडेल instance तयार करण्याची चाचणी करत आहोत. test_product_creation
पद्धत एक नवीन प्रोडक्ट तयार करते आणि नंतर प्रोडक्टची ॲट्रिब्यूट योग्यरित्या सेट केली आहेत की नाही हे तपासण्यासाठी ॲसर्शन पद्धती वापरते.
TestCase कधी वापरावे
TestCase
सामान्यतः बहुतेक Django चाचणी परिदृश्यांसाठीPreferred निवड आहे. हे जलद, कार्यक्षम आहे आणि प्रत्येक चाचणीसाठी स्वच्छ डेटाबेस वातावरण पुरवते. TestCase
चा वापर तेव्हा करा:
- तुम्ही तुमच्या ॲप्लिकेशनचे वैयक्तिक मॉडेल, व्ह्यूज किंवा इतर घटक तपासत आहात.
- तुम्ही खात्री करू इच्छिता की तुमच्या चाचण्या स्वतंत्र आहेत आणि एकमेकांमध्ये हस्तक्षेप करत नाहीत.
- तुम्हाला अनेक व्यवहारांमध्ये पसरलेल्या जटिल डेटाबेस इंटरॅक्शनची चाचणी करण्याची आवश्यकता नाही.
TransactionTestCase: जटिल डेटाबेस इंटरॅक्शनची चाचणी
TransactionTestCase
हा Django मध्ये चाचण्या लिहिण्यासाठी आणखी एक वर्ग आहे, परंतु डेटाबेस व्यवहारांना तो कसा हाताळतो यात TestCase
पेक्षा वेगळा आहे. प्रत्येक चाचणी पद्धतीनंतर व्यवहार revert करण्याऐवजी, TransactionTestCase
व्यवहार commit करतो. हे अनेक व्यवहारांमध्ये पसरलेल्या जटिल डेटाबेस इंटरॅक्शनची चाचणी करण्यासाठी योग्य आहे, जसे की सिग्नल किंवा ॲटोमिक व्यवहार.
TransactionTestCase कसे कार्य करते
जेव्हा तुम्ही TransactionTestCase
वापरता, तेव्हा Django प्रत्येक चाचणी केससाठी खालील पायऱ्या करतो:
- एक चाचणी डेटाबेस तयार करते: Django प्रत्येक चाचणी रनसाठी एक वेगळा चाचणी डेटाबेस तयार करते.
- डेटाबेस फ्लश करत नाही: TransactionTestCase प्रत्येक चाचणीपूर्वी डेटाबेस आपोआप फ्लश करत नाही. प्रत्येक चाचणी चालवण्यापूर्वी डेटाबेस सुसंगत स्थितीत असणे अपेक्षित आहे.
- चाचणी पद्धत चालवते: Django तुम्ही परिभाषित केलेली चाचणी पद्धत कार्यान्वित करते.
- व्यवहार commit करते: प्रत्येक चाचणी पद्धतीनंतर, Django व्यवहार commit करते, चाचणी डेटाबेसमध्ये बदल कायमस्वरूपी करते.
- टेबल्स truncate करते: TransactionTestCase मधील सर्व चाचण्यांच्या शेवटी, डेटा clear करण्यासाठी टेबल्स truncate केल्या जातात.
TransactionTestCase
प्रत्येक चाचणी पद्धतीनंतर व्यवहार commit करत असल्याने, तुमच्या चाचण्या डेटाबेसमध्ये विसंगत स्थिती ठेवणार नाहीत याची खात्री करणे आवश्यक आहे. त्यानंतरच्या चाचण्यांमध्ये हस्तक्षेप टाळण्यासाठी चाचणी दरम्यान तयार केलेला कोणताही डेटा तुम्हाला व्यक्तिचलितपणे clean up करण्याची आवश्यकता भासू शकते.
उदाहरण: सिग्नलची चाचणी
TransactionTestCase
वापरून Django सिग्नलची चाचणी करण्याचे एक उदाहरण पाहू:
from django.test import TransactionTestCase
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Product, ProductLog
@receiver(post_save, sender=Product)
def create_product_log(sender, instance, created, **kwargs):
if created:
ProductLog.objects.create(product=instance, action="Created")
class ProductSignalTest(TransactionTestCase):
def test_product_creation_signal(self):
product = Product.objects.create(name="Test Product", price=10.00)
self.assertEqual(ProductLog.objects.count(), 1)
self.assertEqual(ProductLog.objects.first().product, product)
self.assertEqual(ProductLog.objects.first().action, "Created")
या उदाहरणात, आम्ही एका सिग्नलची चाचणी करत आहोत जो जेव्हा नवीन Product
instance तयार होतो तेव्हा ProductLog
instance तयार करतो. test_product_creation_signal
पद्धत एक नवीन प्रोडक्ट तयार करते आणि नंतर corresponding प्रोडक्ट लॉग एंट्री तयार केली आहे की नाही हे verify करते.
TransactionTestCase कधी वापरावे
TransactionTestCase
चा उपयोग सामान्यतः विशिष्ट परिस्थितीत केला जातो जिथे तुम्हाला अनेक व्यवहारांमध्ये पसरलेल्या जटिल डेटाबेस इंटरॅक्शनची चाचणी करण्याची आवश्यकता असते. TransactionTestCase
चा वापर करण्याचा विचार करा जेव्हा:
- तुम्ही डेटाबेस ऑपरेशन्सद्वारे ट्रिगर केलेल्या सिग्नलची चाचणी करत आहात.
- तुम्ही ॲटोमिक व्यवहारांची चाचणी करत आहात ज्यात अनेक डेटाबेस ऑपरेशन्स समाविष्ट आहेत.
- तुम्हाला संबंधित ऑपरेशन्सच्या मालिकेनंतर डेटाबेसची स्थिती verify करण्याची आवश्यकता आहे.
- तुम्ही असा कोड वापरत आहात जो चाचण्यांमध्ये टिकून राहण्यासाठी ऑटो-इन्क्रिमेंटिंग ID वर अवलंबून असतो (जरी हे सामान्यतः वाईट मानले जाते).
TransactionTestCase वापरताना महत्त्वाची विचार करण्यासारखी गोष्टी
TransactionTestCase
व्यवहार commit करत असल्याने, खालील गोष्टींची जाणीव असणे महत्त्वाचे आहे:
- डेटाबेस cleanup: त्यानंतरच्या चाचण्यांमध्ये हस्तक्षेप टाळण्यासाठी चाचणी दरम्यान तयार केलेला कोणताही डेटा तुम्हाला व्यक्तिचलितपणे clean up करण्याची आवश्यकता भासू शकते. चाचणी डेटा व्यवस्थापित करण्यासाठी
setUp
आणिtearDown
पद्धती वापरण्याचा विचार करा. - चाचणी आयसोलेशन:
TransactionTestCase
TestCase
प्रमाणे चाचणी आयसोलेशनची समान पातळी पुरवत नाही. चाचण्यांमधील संभाव्य इंटरॅक्शनबद्दल जागरूक रहा आणि खात्री करा की तुमच्या चाचण्या मागील चाचण्यांमधील डेटाबेसच्या स्थितीवर अवलंबून नाहीत. - परफॉर्मन्स:
TransactionTestCase
TestCase
पेक्षा हळू असू शकते कारण त्यात व्यवहार commit करणे समाविष्ट आहे. ते जपून आणि आवश्यक असेल तेव्हाच वापरा.
Django चाचणीसाठी सर्वोत्तम पद्धती
Django मध्ये चाचण्या लिहिताना लक्षात ठेवण्यासाठी येथे काही सर्वोत्तम पद्धती आहेत:
- स्पष्ट आणि संक्षिप्त चाचण्या लिहा: चाचण्या समजून घेणे आणि त्यांची देखभाल करणे सोपे असावे. चाचणी पद्धती आणि ॲसर्शनसाठी वर्णनात्मक नावे वापरा.
- एका वेळी एका गोष्टीची चाचणी करा: प्रत्येक चाचणी पद्धती तुमच्या कोडच्या एकाच पैलूची चाचणी करण्यावर केंद्रित असावी. जेव्हा चाचणी अयशस्वी होते, तेव्हा अयशस्वीतेचा स्रोत ओळखणे सोपे होते.
- अर्थपूर्ण ॲसर्शन वापरा: ॲसर्शन पद्धती वापरा ज्या तुमच्या कोडचे अपेक्षित वर्तन स्पष्टपणे व्यक्त करतात. Django विविध परिदृश्यांसाठी ॲसर्शन पद्धतींचा एक समृद्ध संच पुरवतो.
- Arrange-Act-Assert पॅटर्नचे अनुसरण करा: Arrange-Act-Assert पॅटर्ननुसार तुमच्या चाचण्यांची रचना करा: चाचणी डेटा Arrange करा, चाचणी अंतर्गत असलेल्या कोडवर Act करा आणि अपेक्षित परिणाम Assert करा.
- तुमच्या चाचण्या जलद ठेवा: हळू चाचण्या डेव्हलपर्सना त्या वारंवार चालवण्यापासून परावृत्त करू शकतात. अंमलबजावणीचा वेळ कमी करण्यासाठी तुमच्या चाचण्या ऑप्टिमाइझ करा.
- चाचणी डेटासाठी फिक्स्चर वापरा: फिक्स्चर हा तुमच्या चाचणी डेटाबेसमध्ये प्रारंभिक डेटा लोड करण्याचा एक सोयीस्कर मार्ग आहे. सुसंगत आणि पुन्हा वापरण्यायोग्य चाचणी डेटा तयार करण्यासाठी फिक्स्चर वापरा. IDs हार्डकोडिंग टाळण्यासाठी फिक्स्चरमध्ये नैसर्गिक की वापरण्याचा विचार करा.
- pytest सारखे चाचणी लायब्ररी वापरण्याचा विचार करा: Django चे अंगभूत चाचणी फ्रेमवर्क शक्तिशाली असले तरी, pytest सारख्या लायब्ररी अतिरिक्त वैशिष्ट्ये आणि लवचिकता देऊ शकतात.
- उच्च चाचणी कव्हरेजसाठी प्रयत्न करा: तुमच्या कोडची कसून चाचणी केली गेली आहे याची खात्री करण्यासाठी उच्च चाचणी कव्हरेजचे ध्येय ठेवा. तुमच्या चाचणी कव्हरेजचे मोजमाप करण्यासाठी आणि ज्या भागात अधिक चाचणीची आवश्यकता आहे ते ओळखण्यासाठी कव्हरेज टूल्स वापरा.
- तुमच्या CI/CD पाइपलाइनमध्ये चाचण्या समाकलित करा: तुमच्या सतत इंटिग्रेशन आणि सतत डिप्लॉयमेंट (CI/CD) पाइपलाइनचा भाग म्हणून तुमच्या चाचण्या आपोआप चालवा. हे सुनिश्चित करते की डेव्हलपमेंट प्रक्रियेत कोणतीही रिग्रेशन लवकर पकडली जाईल.
- वास्तविक जगातील परिस्थिती दर्शविणाऱ्या चाचण्या लिहा: तुमचे ॲप्लिकेशन अशा प्रकारे तपासा जे वापरकर्ते प्रत्यक्षात ॲप्लिकेशनसोबत कसे संवाद साधतील त्याचे अनुकरण करतात. हे तुम्हाला असे बग उघडकीस आणण्यास मदत करेल जे साध्या युनिट चाचण्यांमध्ये स्पष्ट नसू शकतात. उदाहरणार्थ, फॉर्मची चाचणी करताना आंतरराष्ट्रीय पत्ते आणि फोन नंबरमधील बदलांचा विचार करा.
आंतरराष्ट्रीयकरण (i18n) आणि चाचणी
जागतिक प्रेक्षकांसाठी Django ॲप्लिकेशन्स विकसित करताना, आंतरराष्ट्रीयकरण (i18n) आणि स्थानिकीकरण (l10n) चा विचार करणे महत्त्वाचे आहे. तुमच्या चाचण्यांमध्ये विविध भाषा, तारीख स्वरूप आणि चलन चिन्हे समाविष्ट असल्याची खात्री करा. येथे काही टिप्स आहेत:
- विविध भाषा सेटिंग्जसह चाचणी करा: विविध भाषा सेटिंग्जसह तुमच्या ॲप्लिकेशनची चाचणी करण्यासाठी Django चे
override_settings
डेकोरेटर वापरा. - तुमच्या चाचण्यांमध्ये स्थानिक डेटा वापरा: तुमच्या चाचणी फिक्स्चर आणि चाचणी पद्धतींमध्ये स्थानिक डेटा वापरा जेणेकरून तुमचे ॲप्लिकेशन विविध तारीख स्वरूप, चलन चिन्हे आणि इतर लोकेल-विशिष्ट डेटा योग्यरित्या हाताळेल.
- तुमच्या भाषांतर स्ट्रिंगची चाचणी करा: तुमची भाषांतर स्ट्रिंग योग्यरित्या भाषांतरित झाली आहे आणि ती वेगवेगळ्या भाषांमध्ये योग्यरित्या render होते की नाही ते verify करा.
localize
टेम्पलेट टॅग वापरा: तुमच्या टेम्पलेटमध्ये, वापरकर्त्याच्या current लोकेलनुसार तारखा, संख्या आणि इतर लोकेल-विशिष्ट डेटा फॉरमॅट करण्यासाठीlocalize
टेम्पलेट टॅग वापरा.
उदाहरण: विविध भाषा सेटिंग्जसह चाचणी
from django.test import TestCase
from django.utils import translation
from django.conf import settings
class InternationalizationTest(TestCase):
def test_localized_date_format(self):
original_language = translation.get_language()
try:
translation.activate('de') # जर्मन भाषा ॲक्टिव्हेट करा
with self.settings(LANGUAGE_CODE='de'): # सेटिंग्जमध्ये भाषा सेट करा
from django.utils import formats
from datetime import date
d = date(2024, 1, 20)
formatted_date = formats.date_format(d, 'SHORT_DATE_FORMAT')
self.assertEqual(formatted_date, '20.01.2024')
finally:
translation.activate(original_language) # मूळ भाषा रिस्टोअर करा
हे उदाहरण Django च्या translation
आणि formats
मॉड्यूल वापरून वेगवेगळ्या भाषा सेटिंग्जसह तारीख फॉरमॅटिंगची चाचणी कशी करावी हे दर्शवते.
निष्कर्ष
Django मध्ये प्रभावी आणि विश्वसनीय चाचण्या लिहिण्यासाठी TestCase
आणि TransactionTestCase
मधील फरक समजून घेणे आवश्यक आहे. TestCase
सामान्यतः बहुतेक चाचणी परिदृश्यांसाठीPreferred निवड आहे, जे तुमच्या ॲप्लिकेशनचे वैयक्तिक घटक स्वतंत्रपणे तपासण्यासाठी जलद आणि कार्यक्षम मार्ग प्रदान करते. TransactionTestCase
अनेक व्यवहारांमध्ये पसरलेल्या जटिल डेटाबेस इंटरॅक्शनची चाचणी घेण्यासाठी उपयुक्त आहे, जसे की सिग्नल किंवा ॲटोमिक व्यवहार. सर्वोत्तम पद्धतींचे अनुसरण करून आणि आंतरराष्ट्रीयीकरणाच्या पैलूंचा विचार करून, तुम्ही एक मजबूत चाचणी सूट तयार करू शकता जी तुमच्या Django ॲप्लिकेशन्सची गुणवत्ता आणि देखभालक्षमता सुनिश्चित करते.