Django 2.1 - Advanced testing topics

उन्नत परीक्षण विषय




django

उन्नत परीक्षण विषय

अनुरोध कारखाना

class RequestFactory [source]

RequestFactory परीक्षण क्लाइंट के समान API साझा करता है। हालाँकि, ब्राउज़र की तरह व्यवहार करने के बजाय, RequestFactory अनुरोध अनुरोध उत्पन्न करने का एक तरीका प्रदान करता है जिसे किसी भी दृश्य के लिए पहले तर्क के रूप में उपयोग किया जा सकता है। इसका मतलब है कि आप एक दृश्य फ़ंक्शन का उसी तरह परीक्षण कर सकते हैं जैसे आप किसी अन्य फ़ंक्शन का परीक्षण करेंगे - एक ब्लैक बॉक्स के रूप में, बिल्कुल ज्ञात इनपुट के साथ, विशिष्ट आउटपुट के साथ परीक्षण।

RequestFactory लिए API परीक्षण क्लाइंट API का थोड़ा प्रतिबंधित उपसमूह है:

  • इसमें केवल HTTP विधियों get() , post() , put() , delete() , head() , options() , और trace()
  • इन विधियों को follow अलावा सभी समान तर्क स्वीकार करते follow । चूंकि यह केवल अनुरोधों के निर्माण के लिए एक कारखाना है, यह प्रतिक्रिया को संभालने के लिए आपके ऊपर है।
  • यह मिडिलवेयर का समर्थन नहीं करता है। यदि दृश्य ठीक से कार्य करने के लिए आवश्यक हो, तो सत्र और प्रमाणीकरण विशेषताओं को परीक्षण द्वारा ही आपूर्ति की जानी चाहिए।

उदाहरण

अनुरोध कारखाने का उपयोग करते हुए एक सरल इकाई परीक्षण है:

from django.contrib.auth.models import AnonymousUser, User
from django.test import RequestFactory, TestCase

from .views import MyView, my_view

class SimpleTest(TestCase):
    def setUp(self):
        # Every test needs access to the request factory.
        self.factory = RequestFactory()
        self.user = User.objects.create_user(
            username='jacob', email='[email protected]…', password='top_secret')

    def test_details(self):
        # Create an instance of a GET request.
        request = self.factory.get('/customer/details')

        # Recall that middleware are not supported. You can simulate a
        # logged-in user by setting request.user manually.
        request.user = self.user

        # Or you can simulate an anonymous user by setting request.user to
        # an AnonymousUser instance.
        request.user = AnonymousUser()

        # Test my_view() as if it were deployed at /customer/details
        response = my_view(request)
        # Use this syntax for class-based views.
        response = MyView.as_view()(request)
        self.assertEqual(response.status_code, 200)

टेस्ट और कई मेजबान नाम

परीक्षण चलाते समय ALLOWED_HOSTS सेटिंग मान्य है। यह परीक्षण क्लाइंट को आंतरिक और बाहरी URL के बीच अंतर करने की अनुमति देता है।

ऐसी परियोजनाएं जो मल्टीटैनेन्सी का समर्थन करती हैं या अन्यथा अनुरोध के मेजबान के आधार पर व्यावसायिक तर्क को बदल देती हैं और परीक्षणों में कस्टम होस्ट नामों का उपयोग करती हैं, उन सभी को ALLOWED_HOSTS में होस्ट शामिल करना चाहिए।

ऐसा करने का पहला और सरल विकल्प मेजबानों को अपनी सेटिंग फ़ाइल में जोड़ना है। उदाहरण के लिए, docs.djangoproject.com के परीक्षण सूट में निम्नलिखित शामिल हैं:

from django.test import TestCase

class SearchFormTestCase(TestCase):
    def test_empty_get(self):
        response = self.client.get('/en/dev/search/', HTTP_HOST='docs.djangoproject.dev:8000')
        self.assertEqual(response.status_code, 200)

और सेटिंग्स फ़ाइल में परियोजना द्वारा समर्थित डोमेन की एक सूची शामिल है:

ALLOWED_HOSTS = [
    'www.djangoproject.dev',
    'docs.djangoproject.dev',
    ...
]

एक अन्य विकल्प modify_settings() या modify_settings() का उपयोग करके ALLOWED_HOSTS लिए आवश्यक होस्ट जोड़ना है। यह विकल्प स्टैंडअलोन ऐप्स में बेहतर हो सकता है जो अपनी सेटिंग्स फ़ाइल या उन प्रोजेक्ट्स के लिए पैकेज नहीं कर सकते हैं जहां डोमेन की सूची स्थिर नहीं है (उदाहरण के लिए, मल्टीटैनेंसी के लिए उप डोमेन)। उदाहरण के लिए, आप डोमेन http://otherserver/ लिए एक परीक्षण लिख सकते हैं:

from django.test import TestCase, override_settings

class MultiDomainTestCase(TestCase):
    @override_settings(ALLOWED_HOSTS=['otherserver'])
    def test_other_domain(self):
        response = self.client.get('http://otherserver/foo/bar/')

ALLOWED_HOSTS चेकिंग ( ALLOWED_HOSTS = ['*'] अक्षम करने पर परीक्षण चलाते समय परीक्षण क्लाइंट को किसी बाहरी URL पर रीडायरेक्ट का पालन करने पर एक सहायक त्रुटि संदेश देने से रोकता है।

टेस्ट और कई डेटाबेस

परीक्षण प्राथमिक / प्रतिकृति विन्यास

यदि आप प्राथमिक / प्रतिकृति के साथ कई डेटाबेस कॉन्फ़िगरेशन का परीक्षण कर रहे हैं (कुछ डेटाबेस द्वारा मास्टर / दास के रूप में संदर्भित) प्रतिकृति, तो परीक्षण डेटाबेस बनाने की यह रणनीति एक समस्या बनती है। जब परीक्षण डेटाबेस बनाए जाते हैं, तो कोई प्रतिकृति नहीं होगी, और परिणामस्वरूप, प्राथमिक पर बनाए गए डेटा को प्रतिकृति पर नहीं देखा जाएगा।

इसकी क्षतिपूर्ति करने के लिए, Django आपको यह परिभाषित करने की अनुमति देता है कि डेटाबेस एक परीक्षण दर्पण है । निम्नलिखित (सरलीकृत) उदाहरण डेटाबेस कॉन्फ़िगरेशन पर विचार करें:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myproject',
        'HOST': 'dbprimary',
         # ... plus some other settings
    },
    'replica': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myproject',
        'HOST': 'dbreplica',
        'TEST': {
            'MIRROR': 'default',
        },
        # ... plus some other settings
    }
}

इस सेटअप में, हमारे पास दो डेटाबेस सर्वर हैं: dbprimary , डेटाबेस उर्फ default द्वारा वर्णित है, और dbreplica replica द्वारा वर्णित dbreplica । जैसा कि आप उम्मीद कर सकते हैं, dbreplica को डेटाबेस व्यवस्थापक द्वारा dbreplica की एक प्रतिकृति के रूप में कॉन्फ़िगर किया गया है, इसलिए सामान्य गतिविधि में, default से कोई भी लेखन replica पर दिखाई देगा।

यदि Django ने दो स्वतंत्र परीक्षण डेटाबेस बनाए, तो यह किसी भी परीक्षण को तोड़ देगा जो प्रतिकृति होने की उम्मीद करता है। हालाँकि, replica डेटाबेस को परीक्षण दर्पण ( MIRROR परीक्षण सेटिंग का उपयोग करके) के रूप में कॉन्फ़िगर किया गया है, यह दर्शाता है कि परीक्षण के तहत, replica को default दर्पण के default माना जाना चाहिए।

जब परीक्षण वातावरण कॉन्फ़िगर किया जाता है, तो replica का एक परीक्षण संस्करण नहीं बनाया जाएगा। इसके बजाय replica के कनेक्शन को default पर इंगित करने के लिए पुनर्निर्देशित किया जाएगा। नतीजतन, default से लिखते हैं replica पर दिखाई देगा - लेकिन क्योंकि वे वास्तव में एक ही डेटाबेस हैं, इसलिए नहीं कि दो डेटाबेस के बीच डेटा प्रतिकृति है।

परीक्षण डेटाबेस के लिए निर्माण क्रम को नियंत्रित करना

डिफ़ॉल्ट रूप से, Django मान जाएगा कि सभी डेटाबेस default डेटाबेस पर निर्भर करते हैं और इसलिए हमेशा पहले default डेटाबेस बनाएं। हालाँकि, आपके परीक्षण सेटअप में किसी अन्य डेटाबेस के निर्माण क्रम पर कोई गारंटी नहीं दी जाती है।

यदि आपके डेटाबेस कॉन्फ़िगरेशन को एक विशिष्ट निर्माण क्रम की आवश्यकता होती है, तो आप उन निर्भरताओं को निर्दिष्ट कर सकते हैं जो DEPENDENCIES परीक्षण सेटिंग का उपयोग करते हुए मौजूद हैं। निम्नलिखित (सरलीकृत) उदाहरण डेटाबेस कॉन्फ़िगरेशन पर विचार करें:

DATABASES = {
    'default': {
        # ... db settings
        'TEST': {
            'DEPENDENCIES': ['diamonds'],
        },
    },
    'diamonds': {
        # ... db settings
        'TEST': {
            'DEPENDENCIES': [],
        },
    },
    'clubs': {
        # ... db settings
        'TEST': {
            'DEPENDENCIES': ['diamonds'],
        },
    },
    'spades': {
        # ... db settings
        'TEST': {
            'DEPENDENCIES': ['diamonds', 'hearts'],
        },
    },
    'hearts': {
        # ... db settings
        'TEST': {
            'DEPENDENCIES': ['diamonds', 'clubs'],
        },
    }
}

इस कॉन्फ़िगरेशन के तहत, diamonds डेटाबेस पहले बनाया जाएगा, क्योंकि यह केवल डेटाबेस है, जो बिना किसी निर्भरता के डेटाबेस का उपनाम है। default और clubs उपनाम अगले बनाया जाएगा (हालांकि इस जोड़ी के निर्माण के आदेश की गारंटी नहीं है), फिर hearts और अंत में spades

यदि DEPENDENCIES परिभाषा में कोई परिपत्र निर्भरताएं हैं, तो एक ImproperlyConfigured अपवाद को उठाया जाएगा।

TransactionTestCase की उन्नत सुविधाएँ

TransactionTestCase.available_apps

चेतावनी

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

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

डिफ़ॉल्ट रूप से, available_apps None सेट None । प्रत्येक परीक्षण के बाद, Django डेटाबेस स्थिति को रीसेट करने के लिए flush कहता है। यह सभी तालिकाओं को खाली करता है और post_migrate सिग्नल का उत्सर्जन करता है, जो प्रत्येक मॉडल के लिए एक सामग्री प्रकार और तीन अनुमतियों को फिर से बनाता है। यह ऑपरेशन मॉडल की संख्या के अनुपात में महंगा हो जाता है।

available_apps एप्लिकेशन की सूची में उपलब्ध_एप्स सेट करना Django को यह व्यवहार करने का निर्देश देता है जैसे कि इन अनुप्रयोगों के केवल मॉडल उपलब्ध थे। TransactionTestCase का व्यवहार निम्नानुसार बदलता है:

  • यदि वे गायब हैं, तो उपलब्ध ऐप्स में प्रत्येक मॉडल के लिए सामग्री प्रकार और अनुमतियाँ बनाने के लिए प्रत्येक परीक्षण से पहले post_migrate को निकाल दिया जाता है।
  • प्रत्येक परीक्षण के बाद, Django उपलब्ध एप्लिकेशन में मॉडल के अनुरूप केवल तालिकाएँ खाली करता है। हालाँकि, डेटाबेस स्तर पर, अनुपयोगी ऐप्स में ट्रंकेशन संबंधित मॉडल को कैस्केड कर सकता है। इसके अलावा post_migrate को निकाल नहीं दिया गया है; अनुप्रयोगों के सही सेट के चयन के बाद, इसे अगले TransactionTestCase द्वारा निकाल दिया जाएगा।

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

चूंकि डेटाबेस को फ्लश करने के बाद post_migrate को उत्सर्जित नहीं किया जाता है, एक TransactionTestCase बाद इसकी स्थिति एक post_migrate बाद की post_migrate नहीं है: यह श्रोताओं द्वारा post_migrate द्वारा बनाई गई पंक्तियों को याद कर post_migrate । उस आदेश को ध्यान में रखते हुए जिसमें परीक्षण निष्पादित किए जाते हैं , यह कोई समस्या नहीं है, बशर्ते कि किसी दिए गए परीक्षण सूट में सभी TransactionTestCase available_apps या available_apps नहीं है।

available_apps टैंगो के Django के अपने सूट में अनिवार्य है।

TransactionTestCase.reset_sequences

TransactionTestCase पर रीसेट रीसेट करना reset_sequences = True यह सुनिश्चित करेगा कि परीक्षण चलाने से पहले अनुक्रम हमेशा रीसेट हो जाएं:

class TestsThatDependsOnPrimaryKeySequences(TransactionTestCase):
    reset_sequences = True

    def test_animal_pk(self):
        lion = Animal.objects.create(name="lion", sound="roar")
        # lion.pk is guaranteed to always be 1
        self.assertEqual(lion.pk, 1)

जब तक आप स्पष्ट रूप से प्राथमिक कुंजी अनुक्रम संख्याओं का परीक्षण नहीं कर रहे हैं, तब तक यह अनुशंसा की जाती है कि आप परीक्षणों में प्राथमिक कोड मानों को हार्ड कोड न करें।

reset_sequences = True का उपयोग करना reset_sequences = True परीक्षण को धीमा कर देगा, क्योंकि प्राथमिक कुंजी रीसेट एक अपेक्षाकृत महंगा डेटाबेस ऑपरेशन है।

पुन: प्रयोज्य अनुप्रयोगों का परीक्षण करने के लिए Django परीक्षण धावक का उपयोग करना

यदि आप एक पुन: प्रयोज्य अनुप्रयोग लिख रहे हैं, तो आप अपने स्वयं के परीक्षण सूट को चलाने के लिए Django परीक्षण धावक का उपयोग करना चाहते हैं और इस प्रकार Django परीक्षण अवसंरचना से लाभ उठा सकते हैं।

एक सामान्य प्रैक्टिस एप्लिकेशन कोड के बगल में एक परीक्षण निर्देशिका है, जिसमें निम्न संरचना है:

runtests.py
polls/
    __init__.py
    models.py
    ...
tests/
    __init__.py
    models.py
    test_settings.py
    tests.py

आइए उन फ़ाइलों के एक जोड़े के अंदर एक नज़र डालें:

#!/usr/bin/env python
import os
import sys

import django
from django.conf import settings
from django.test.utils import get_runner

if __name__ == "__main__":
    os.environ['DJANGO_SETTINGS_MODULE'] = 'tests.test_settings'
    django.setup()
    TestRunner = get_runner(settings)
    test_runner = TestRunner()
    failures = test_runner.run_tests(["tests"])
    sys.exit(bool(failures))

यह वह स्क्रिप्ट है जिसे आप टेस्ट सूट चलाने के लिए आमंत्रित करते हैं। यह Django वातावरण सेट करता है, परीक्षण डेटाबेस बनाता है और परीक्षण चलाता है।

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

SECRET_KEY = 'fake-key'
INSTALLED_APPS = [
    "tests",
]

इस फ़ाइल में आपके ऐप के परीक्षण चलाने के लिए आवश्यक Django सेटिंग्स हैं

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

चूंकि परीक्षण पैकेज को आपके परीक्षण चलाते समय INSTALLED_APPS में शामिल किया गया है, आप इसकी मॉडल- models.py फ़ाइल में केवल-परीक्षण मॉडल को परिभाषित कर सकते हैं।

विभिन्न परीक्षण रूपरेखाओं का उपयोग करना

स्पष्ट रूप से, unittest केवल पायथन परीक्षण ढाँचा नहीं है। जबकि Django वैकल्पिक फ्रेमवर्क के लिए स्पष्ट समर्थन प्रदान नहीं करता है, यह वैकल्पिक फ्रेमवर्क के लिए निर्मित परीक्षणों को लागू करने का एक तरीका प्रदान करता है जैसे कि वे सामान्य Django परीक्षण थे।

जब आप चलाते हैं ./manage.py test , Django TEST_RUNNER सेटिंग को TEST_RUNNER है कि क्या करना है। डिफ़ॉल्ट रूप से, TEST_RUNNER 'django.test.runner.DiscoverRunner' । यह वर्ग डिफ़ॉल्ट Django परीक्षण व्यवहार को परिभाषित करता है। इस व्यवहार में शामिल हैं:

  1. वैश्विक पूर्व-परीक्षण सेटअप का प्रदर्शन करना।
  2. वर्तमान निर्देशिका के नीचे किसी भी फ़ाइल में परीक्षण की तलाश है जिसका नाम पैटर्न test*.py मेल खाता है। test*.py
  3. परीक्षण डेटाबेस बनाना।
  4. परीक्षण डेटाबेस में मॉडल और प्रारंभिक डेटा स्थापित migrate लिए migrate चलाना।
  5. सिस्टम की जाँच चल रही है
  6. परीक्षण चल रहे थे कि पाया गया।
  7. परीक्षण डेटाबेस को नष्ट करना।
  8. परीक्षण के बाद की वैश्विक अशांति का प्रदर्शन।

यदि आप अपने स्वयं के परीक्षण धावक वर्ग को परिभाषित करते हैं और उस कक्षा में TEST_RUNNER को इंगित TEST_RUNNER , तो Django आपके परीक्षण धावक को निष्पादित करेगा जब भी आप चलाते हैं ./manage.py test । इस तरह, किसी भी परीक्षण ढांचे का उपयोग करना संभव है जिसे पायथन कोड से निष्पादित किया जा सकता है, या जो भी परीक्षण आवश्यकताएं हो उसे संतुष्ट करने के लिए Django परीक्षण निष्पादन प्रक्रिया को संशोधित कर सकते हैं।

एक परीक्षण धावक को परिभाषित करना

एक परीक्षण धावक एक वर्ग है जो एक run_tests() विधि को परिभाषित करता है। Django जहाज एक DiscoverRunner वर्ग के साथ जो डिफ़ॉल्ट Django परीक्षण व्यवहार को परिभाषित करता है। यह वर्ग run_tests() एंट्री पॉइंट को परिभाषित करता है, साथ ही अन्य तरीकों का चयन करता है जो टेस्ट सूट को स्थापित करने, निष्पादित करने और फाड़ने के लिए run_tests() द्वारा उपयोग किए जाते हैं।

class DiscoverRunner(pattern='test*.py', top_level=None, verbosity=1, interactive=True, failfast=False, keepdb=False, reverse=False, debug_mode=False, debug_sql=False, **kwargs) [source]

DiscoverRunner किसी भी फाइल मिलान pattern में परीक्षणों की खोज करेगा।

top_level का उपयोग आपके शीर्ष-स्तरीय पायथन मॉड्यूल वाले निर्देशिका को निर्दिष्ट करने के लिए किया जा सकता है। आमतौर पर Django इसे स्वचालित रूप से समझ सकता है, इसलिए इस विकल्प को निर्दिष्ट करना आवश्यक नहीं है। यदि निर्दिष्ट किया गया है, तो यह आम तौर पर आपकी manage.py फ़ाइल के साथ निर्देशिका होनी चाहिए।

verbosity नोटिफिकेशन की मात्रा और डिबग सूचना को निर्धारित करता है जो कंसोल को प्रिंट किया जाएगा; 0 कोई आउटपुट नहीं है, 1 सामान्य आउटपुट है, और 2 वर्बोज़ आउटपुट है।

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

यदि failfast True , तो परीक्षण परीक्षण विफल होने के बाद परीक्षण सूट चलना बंद हो जाएगा।

यदि keepdb True , तो परीक्षण सूट मौजूदा डेटाबेस का उपयोग करेगा, या यदि आवश्यक हो तो एक बना सकता है। यदि False , तो एक नया डेटाबेस बनाया जाएगा, जो मौजूदा को हटाने के लिए उपयोगकर्ता को संकेत देगा, यदि मौजूद है।

यदि reverse True , तो reverse मामलों में परीक्षण मामलों को निष्पादित किया जाएगा। यह उन परीक्षणों का डिबग करने के लिए उपयोगी हो सकता है जो ठीक से अलग नहीं होते हैं और साइड इफेक्ट होते हैं। इस विकल्प का उपयोग करते समय परीक्षण वर्ग द्वारा समूहीकरण संरक्षित है।

debug_mode निर्दिष्ट करता है कि चल रहे परीक्षणों से पहले DEBUG सेटिंग को क्या सेट किया जाना चाहिए।

यदि debug_sql True , तो परीक्षण मामलों में विफल होने से SQL क्वेरीज़ को django.db.backends लकड़हारे के साथ-साथ ट्रेसबैक में लॉग इन किया जाएगा। यदि verbosity 2 , तो सभी परीक्षणों में प्रश्न आउटपुट हैं।

Django, समय-समय पर, नए तर्क जोड़कर परीक्षण धावक की क्षमताओं का विस्तार कर सकता है। **kwargs घोषणा इस विस्तार के लिए अनुमति देता है। यदि आप DiscoverRunner रनर को उप-वर्ग करते हैं या अपना स्वयं का परीक्षण धावक लिखते हैं, तो यह सुनिश्चित करें कि यह **kwargs स्वीकार करता है।

आपका परीक्षण धावक अतिरिक्त कमांड-लाइन विकल्पों को भी परिभाषित कर सकता है। एक add_arguments(cls, parser) वर्ग विधि बनाएं या ओवरराइड करें और पद्धति के अंदर parser.add_argument() कॉल करके कस्टम तर्क जोड़ें, ताकि test कमांड उन तर्कों का उपयोग करने में सक्षम हो जाए।

गुण

DiscoverRunner.test_suite

क्लास में टेस्ट सूट का निर्माण किया जाता था। डिफ़ॉल्ट रूप से यह unittest.TestSuite सेट है। यदि आप परीक्षणों को इकट्ठा करने के लिए अलग-अलग तर्क को लागू करना चाहते हैं तो यह ओवरराइड किया जा सकता है।

DiscoverRunner.test_runner

यह निम्न-स्तरीय परीक्षण धावक की श्रेणी है जिसका उपयोग व्यक्तिगत परीक्षणों को निष्पादित करने और परिणामों को प्रारूपित करने के लिए किया जाता है। डिफ़ॉल्ट रूप से यह unittest.TextTestRunner सेट है। नामकरण सम्मेलनों में दुर्भाग्यपूर्ण समानता के बावजूद, डिस्कवररनर के रूप में यह उसी प्रकार का वर्ग नहीं है, जो जिम्मेदारियों के व्यापक सेट को कवर करता है। जिस तरह से परीक्षण किए गए और रिपोर्ट किए गए हैं, उन्हें संशोधित करने के लिए आप इस विशेषता को ओवरराइड कर सकते हैं।

DiscoverRunner.test_loader

यह वह वर्ग है जो परीक्षण को लोड करता है, चाहे टेस्टकेस या मॉड्यूल से या अन्यथा और रनर के लिए परीक्षण सूट में उन्हें बंडल करता है। डिफ़ॉल्ट रूप से यह unittest.defaultTestLoader सेट है। यदि आपके परीक्षण असामान्य तरीकों से लोड होने जा रहे हैं तो आप इस विशेषता को ओवरराइड कर सकते हैं।

तरीके

DiscoverRunner.run_tests(test_labels, extra_tests=None, **kwargs) [source]

परीक्षण सूट चलाएं।

test_labels आपको यह निर्दिष्ट करने की अनुमति देता है कि कौन से परीक्षण चलाने के लिए और कई स्वरूपों का समर्थन करता है ( DiscoverRunner.build_suite() स्वरूपों की सूची के लिए DiscoverRunner.build_suite() देखें)।

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

इस पद्धति को उन परीक्षणों की संख्या वापस करनी चाहिए जो विफल रहे।

classmethod DiscoverRunner.add_arguments(parser) [source]

test प्रबंधन कमांड द्वारा स्वीकार किए गए कस्टम तर्कों को जोड़ने के लिए इस वर्ग पद्धति को ओवरराइड करें। पार्सर के लिए तर्क जोड़ने के विवरण के लिए argparse.ArgumentParser.add_argument() देखें।

DiscoverRunner.setup_test_environment(**kwargs) [source]

setup_test_environment() कॉल setup_test_environment() और self.debug_mode को self.debug_mode ( False लिए डिफ़ॉल्ट setup_test_environment() सेट करके परीक्षण वातावरण सेट करता है।

DiscoverRunner.build_suite(test_labels, extra_tests=None, **kwargs) [source]

एक परीक्षण सूट का निर्माण करता है जो प्रदान किए गए परीक्षण लेबल से मेल खाता है।

test_labels परीक्षण चलाने के लिए वर्णित स्ट्रिंग की एक सूची है। एक परीक्षण लेबल चार रूपों में से एक ले सकता है:

  • path.to.test_module.TestCase.test_method - एक परीक्षण मामले में एक एकल परीक्षण विधि चलाएँ।
  • path.to.test_module.TestCase - परीक्षण मामले में सभी परीक्षण विधियाँ चलाएँ।
  • path.to.module - नामित पायथन पैकेज या मॉड्यूल में सभी परीक्षण खोजें और चलाएं।
  • path/to/directory - खोजें और नामित निर्देशिका के नीचे सभी परीक्षण चलाते हैं।

यदि test_labels का None मूल्य None , तो परीक्षण धावक वर्तमान निर्देशिका के नीचे सभी फाइलों में परीक्षणों की खोज करेगा जिनके नाम इसके pattern मेल खाते हैं (ऊपर देखें)।

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

एक TestSuite उदाहरण देता है जो चलाने के लिए तैयार है।

DiscoverRunner.setup_databases(**kwargs) [source]

setup_databases() डेटाबेस setup_databases() कॉल करके परीक्षण डेटाबेस बनाता है।

DiscoverRunner.run_checks() [source]

सिस्टम की जाँच चलाता है।

DiscoverRunner.run_suite(suite, **kwargs) [source]

परीक्षण सूट चलाता है।

परीक्षण सूट चलाने के द्वारा उत्पादित परिणाम देता है।

DiscoverRunner.get_test_runner_kwargs() [source]

SearchRunner.test_runner को तुरंत हटाने के DiscoverRunner.test_runner कीवर्ड तर्क देता है।

DiscoverRunner.teardown_databases(old_config, **kwargs) [source]

परीक्षण डेटाबेस को नष्ट कर देता है, पूर्व-परीक्षण की स्थिति को फाड़ कर taddown_dat डेटाबेस teardown_databases() कॉल करके।

DiscoverRunner.teardown_test_environment(**kwargs) [source]

पूर्व-परीक्षण वातावरण को पुनर्स्थापित करता है।

DiscoverRunner.suite_result(suite, result, **kwargs) [source]

परीक्षण सूट के आधार पर एक रिटर्न कोड की गणना और रिटर्न करता है, और उस परीक्षण सूट से परिणाम।

उपयोगिताओं का परीक्षण

django.test.utils

अपने स्वयं के परीक्षण धावक के निर्माण में सहायता करने के लिए, Django django.test.utils मॉड्यूल में कई उपयोगिता विधियां प्रदान करता है।

setup_test_environment(debug=None) [source]

वैश्विक प्री-टेस्ट सेटअप करता है, जैसे कि टेम्प्लेट रेंडरिंग सिस्टम के लिए इंस्ट्रूमेंटेशन स्थापित करना और डमी ईमेल आउटबॉक्स स्थापित करना।

यदि debug कोई None , तो DEBUG सेटिंग को इसके मान में अद्यतन किया जाता है।

teardown_test_environment() [source]

टेम्प्लेट सिस्टम से इंस्ट्रूमेंटेशन को हटाने और सामान्य ईमेल सेवाओं को पुनर्स्थापित करने जैसे वैश्विक पोस्ट-टेस्ट अशांति करता है।

setup_databases(verbosity, interactive, keepdb=False, debug_sql=False, parallel=0, **kwargs) [source]

परीक्षण डेटाबेस बनाता है।

एक डेटा संरचना देता है जो किए गए परिवर्तनों को पूर्ववत करने के लिए पर्याप्त विवरण प्रदान करता है। यह डेटा परीक्षण के समापन पर teardown_databases() डेटाबेस teardown_databases() फ़ंक्शन को प्रदान किया जाएगा।

teardown_databases(old_config, parallel=0, keepdb=False) [source]

परीक्षण डेटाबेस को नष्ट कर देता है, पूर्व-परीक्षण स्थितियों को बहाल करता है।

old_config डेटाबेस कॉन्फ़िगरेशन में परिवर्तन को परिभाषित करने वाली एक डेटा संरचना है, जिसे उलट करने की आवश्यकता होती है। यह setup_databases() विधि का रिटर्न मान है।

django.db.connection.creation

डेटाबेस बैकएंड का निर्माण मॉड्यूल कुछ उपयोगिताओं को भी प्रदान करता है जो परीक्षण के दौरान उपयोगी हो सकते हैं।

create_test_db(verbosity=1, autoclobber=False, serialize=True, keepdb=False)

एक नया परीक्षण डेटाबेस बनाता है और इसके खिलाफ migrate चलाता है।

verbosity में run_tests() के समान व्यवहार होता है।

autoclobber उस व्यवहार का वर्णन करता है जो तब होगा जब परीक्षण डेटाबेस खोजे गए समान नाम वाला डेटाबेस:

  • यदि autoclobber False , तो उपयोगकर्ता को मौजूदा डेटाबेस को नष्ट करने के लिए मंजूरी देने के लिए कहा जाएगा। अगर उपयोगकर्ता को मंजूरी नहीं है तो sys.exit को कहा जाता है।
  • यदि ऑटोक्लोब्बर True , तो डेटाबेस उपयोगकर्ता के परामर्श के बिना नष्ट हो जाएगा।

serialize निर्धारित करता है यदि परीक्षण चलाने से पहले Django डेटाबेस को इन-मेमोरी JSON स्ट्रिंग में अनुक्रमित करता है (यदि आपके पास लेनदेन नहीं है तो परीक्षण के बीच डेटाबेस स्थिति को पुनर्स्थापित करने के लिए उपयोग किया जाता है)। यदि आप serialized_rollback=True साथ कोई परीक्षण कक्षा नहीं रखते हैं, तो आप इसे सृजन समय को गति देने के लिए False पर सेट कर सकते हैं।

यदि आप डिफ़ॉल्ट टेस्ट रनर का उपयोग कर रहे हैं, तो आप इसे TEST शब्दकोश में SERIALIZE प्रविष्टि के साथ नियंत्रित कर सकते हैं।

अगर परीक्षण चलाने के लिए मौजूदा डेटाबेस का उपयोग करना चाहिए, या नया बनाना चाहिए, तो keepdb यह निर्धारित करता है। यदि True , तो मौजूदा डेटाबेस का उपयोग किया जाएगा, या नहीं होने पर बनाया जाएगा। यदि False , तो एक नया डेटाबेस बनाया जाएगा, जो मौजूदा को हटाने के लिए उपयोगकर्ता को संकेत देगा, यदि मौजूद है।

उस परीक्षण डेटाबेस का नाम लौटाता है जिसे उसने बनाया था।

create_test_db() का DATABASES में NAME के मान को संशोधित करने का साइड इफेक्ट है, टेस्ट डेटाबेस के नाम से मेल खाने के लिए।

destroy_test_db(old_database_name, verbosity=1, keepdb=False)

उस डेटाबेस को नष्ट कर देता है जिसका नाम DATABASES में NAME का मान है, और NAME को old_database_name के मान में सेट करता है।

verbosity तर्क का वही व्यवहार है जो verbosity के DiscoverRunner

यदि keepdb तर्क True , तो डेटाबेस से कनेक्शन बंद हो जाएगा, लेकिन डेटाबेस नष्ट नहीं होगा।

coverage.py साथ एकीकरण

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

Django को आसानी से coverage.py थिंक के साथ एकीकृत किया जा सकता है, पायथन कार्यक्रमों के कोड कवरेज को मापने के लिए एक उपकरण। सबसे पहले, कवरेज को स्थापित करें । इसके बाद, अपने प्रोजेक्ट फोल्डर से निम्नलिखित को manage.py : जिसमें manage.py करें।

coverage run --source='.' manage.py test myapp

यह आपके परीक्षण चलाता है और आपकी परियोजना में निष्पादित फ़ाइलों का कवरेज डेटा एकत्र करता है। आप निम्न आदेश टाइप करके इस डेटा की रिपोर्ट देख सकते हैं:

coverage report

ध्यान दें कि परीक्षण चलाने के दौरान कुछ Django कोड निष्पादित किया गया था, लेकिन पिछले कमांड के लिए source ध्वज पारित होने के कारण इसे यहां सूचीबद्ध नहीं किया गया है।

मिस की गई लाइनों का विवरण देने वाली एनोटेट HTML सूचियों जैसे अधिक विकल्पों के लिए, coverage.py थिंकपैड डॉक्स देखें।