कैसे कई फ़ाइलों पर django इकाई परीक्षण फैलाने के लिए?


126
  • मेरे पास एक अजगर-डीजंगो एप्लिकेशन है
  • मैं इकाई परीक्षण ढांचे का उपयोग कर रहा हूं
  • मॉड्यूल डायरेक्टरी में "test.py" फ़ाइल में परीक्षण की व्यवस्था की गई है
  • मैं के माध्यम से परीक्षण चला रहा हूँ ./manage.py test app

अभी..

  • tests.pyफ़ाइल नहीं बल्कि बड़े / जटिल हो रही है / गन्दा
  • मैं tests.pyपरीक्षणों के छोटे संग्रह में टूटना चाहूंगा ...

कैसे?

जवाबों:


47

Django 1.6 में व्यवहार बदल गया है, इसलिए अब पैकेज बनाने की आवश्यकता नहीं है। बस अपनी फाइलों को नाम दें test*.py

Django 1.7 प्रलेखन से

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

से Django 1.6 प्रलेखन ,

परीक्षण की खोज, यूनिस्टेस्ट मॉड्यूल की अंतर्निहित परीक्षण खोज पर आधारित है। डिफ़ॉल्ट रूप से, यह वर्तमान कार्यशील निर्देशिका के तहत "परीक्षण * .py" नामक किसी भी फ़ाइल में परीक्षणों की खोज करेगा।

पिछला व्यवहार, Django 1.5 प्रलेखन से :

जब आप अपने परीक्षण चलाते हैं, तो परीक्षण उपयोगिता का डिफ़ॉल्ट व्यवहार सभी परीक्षा मामलों (जो कि unitest.TestCase के उप-वर्ग) को मॉडल-थ्रेड और test.py में ढूंढता है, स्वचालित रूप से उन परीक्षण मामलों में से एक परीक्षण सूट का निर्माण करता है, और उस सुइट को चलाएं।

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


4
Django 2.6 में यह वास्तव में कुछ भी नहीं
खोजता है

2
वर्तमान में उपयोग कर Django 1.10, मैं अपने सभी रखना चाहते थे test*.pyनामक फ़ोल्डर में फ़ाइलों को testsफ़ोल्डर को साफ रखने के - यह संभव है, लेकिन आप चलाना चाहिए ./manage.py test app.testsऔर सभी रिश्तेदार आयात एक स्तर (ऊपर जाने की जरूरत from .modelsहो जाता है from ..models)।
स्कॉट स्टीवंस

123

ध्यान दें कि यह दृष्टिकोण Django 1.6 से मान्य नहीं है, इस पोस्ट को देखें ।

आप अंदर से testsफ़ोल्डर बना सकते हैं ___init___.py(ताकि यह एक पैकेज बन जाए)। फिर आप अपना विभाजन परीक्षण .py फाइलें वहां जोड़ दें और उन सभी को आयात करें ___init___.py

Ie: test.pyफ़ाइल की तरह दिखने वाले और काम करने वाले मॉड्यूल के साथ फ़ाइल को प्रतिस्थापित करें :

testsप्रश्न में एप्लिकेशन के तहत एक निर्देशिका बनाएं

एप्लिकेशन
एप्लिकेशन \ models.py
एप्लिकेशन \ views.py
एप्लिकेशन \ परीक्षण
एप्लिकेशन \ परीक्षण \ __ init__.py
एप्लिकेशन \ परीक्षण \ bananas.py
एप्लिकेशन \ परीक्षण \ apples.py

सबमॉड्यूल में आयात करें app\tests\__init__.py:

from bananas import *
from apples import *

अब आप उपयोग कर सकते हैं ।/manage.py जैसे कि वे सभी एक ही फ़ाइल में थे:

./manage.py test app.some_test_in_bananas

1
रवींद्र। मेरा मतलब था कि मैं जिस एप्लिकेशन का परीक्षण कर रहा हूं, उसके तहत 'परीक्षण' मॉड्यूल बनाना; परीक्षण नामक एक नया अनुप्रयोग नहीं। मुझे ये अब मिला। बहुत बढ़िया। धन्यवाद!
जॉन मी

@ जॉन: मैं अब अपने जवाब को नहीं पहचान सकता! :-) लेकिन आप पूरी तरह से सही हैं कि यह बहुत अस्पष्ट था, भले ही सही हो - आपके उदाहरण इसे स्पष्ट करते हैं, मेरे मूल शब्द के विपरीत।
टॉमस ज़ीलिस्की

2
@ टोमसज़ .. आपके शब्द अभी भी हैं - पूर्ण रूप से बरकरार। मैंने अभी इसे थोड़ा ठीक किया है क्योंकि आपने मुझे सही रास्ते पर रखा है।
जॉन मय

@ जॉन: मुझे इस बात पर गुस्सा नहीं था कि आपका क्या मतलब है :) यह मेरा मजाकिया अंदाज में कुछ अलग अंदाज में देखने के लिए मज़ेदार था
टॉमस ज़ीलिस्की

4
@jMyles, यदि "नियमित django टेस्ट धावक" से आपका मतलब है, python manage.py test myappतो वास्तव में यह उत्तर ठीक काम करता है। (अभी इसे आजमाया)
किर्क वूल

27

टॉमस द्वारा कहा गया उत्तर सही है। हालांकि, यह सुनिश्चित करना थकाऊ हो सकता है कि आयात __init__.pyआपकी फ़ाइल संरचना से मेल खाता है।

करने के लिए स्वचालित रूप से फ़ोल्डर में सभी परीक्षण का पता लगाने आप में इस जोड़ सकते हैं __init__.py:

import unittest

def suite():   
    return unittest.TestLoader().discover("appname.tests", pattern="*.py")

यह आपको चलाने की अनुमति देगा, ./manage.py test appnameलेकिन विशिष्ट परीक्षणों को चलाने में सक्षम नहीं होगा। ऐसा करने के लिए आप इस कोड का उपयोग कर सकते हैं (इसमें भी __init__.py):

import pkgutil
import unittest

for loader, module_name, is_pkg in pkgutil.walk_packages(__path__):
    module = loader.find_module(module_name).load_module(module_name)
    for name in dir(module):
        obj = getattr(module, name)
        if isinstance(obj, type) and issubclass(obj, unittest.case.TestCase):
            exec ('%s = obj' % obj.__name__)

अब आप अपने सभी परीक्षण manage.py test appया विशिष्ट के माध्यम से चला सकते हैंmanage.py test app.TestApples


आप दूसरा टुकड़ा कहाँ रखते हैं?
rh0dium

दोनों टुकड़े__init__.py
ब्रायस ड्रेनन

ध्यान दें कि यदि आपके टेस्ट पैकेज में से कोई भी नाम शीर्ष स्तर के मॉड्यूल नामों से मेल खाता है, जो परीक्षण रन के दौरान आयात हो जाते हैं, तो pkgutil स्निपेट आयात को विफल कर देगा क्योंकि परीक्षण के रूप में जोड़े जाते हैं sys.modules[packagename]। एक त्वरित वर्कअराउंड delकिसी भी समस्या है जो उपरोक्त के बाद समस्याओं का कारण बनता है। (या आप अपने फ़ोल्डरों का नाम बदल सकते हैं;))
पॉल फेनी

यह बहुत अच्छा है, लेकिन मैं एक त्रुटि में भाग गया, जहां, जब ऐप स्तर परीक्षण ( python manage.py test appName) कोड का दूसरा भाग चल रहा __path__था, जो उपलब्ध नहीं था, एक त्रुटि को फेंक देगा । मैंने दूसरी स्निपेट को एक if '__path__' in locals():चेक में लपेटकर इसे टाल दिया , जिसने चाल चली। जवाब के लिए धन्यवाद!
अलुकाच

1
+1 यह भी सुनिश्चित करता है कि init फ़ाइल आम कोडिंग मानकों का पालन करती है, अर्थात इसमें * या अप्रयुक्त आयात नहीं है
मार्टिन बी।

13

बस अपनी निर्देशिका संरचना इस तरह बनाएं:

myapp/
    __init__.py
    tests/
        __init__.py
        test_one.py
        test_two.py
        ...
    ...

और python manage.py test myappउम्मीद के मुताबिक काम करेंगे।


5

http://docs.python.org/library/unittest.html#organizing-tests मॉड्यूल में फ़ाइलों को विभाजित करने के बारे में बात करता है, और इसके ठीक ऊपर के अनुभाग में एक उदाहरण है।


2
'बिट एक्स्ट्रा', जिसे मैं rtfm के लिए देख रहा हूँ, django सेटिंग्स पर्यावरण, डेटाबेस और परीक्षणों के लिए जुड़नार है।
जॉन मी

2

Init में कुछ भी कोड करने की आवश्यकता नहीं है। बस अपने ऐप में एक उपनिर्देशिका बनाएं। केवल आवश्यकता है यह परीक्षण कॉल करने के लिए नहीं * उदाहरण के लिए

app/
app/__init_.py
app/serializers.py
app/testing/
app/testing/__init__.py
app/testing/tests_serializers.py

1
आप इसे "परीक्षण" से शुरू होने वाली चीज़ क्यों नहीं कह सकते?
सर्प C

मैं Django 1.11.4 के साथ इस उत्तर का उपयोग कर रहा हूं। इसका उपयोग करने के कारण: (1) फ़ाइल "ऐप / परीक्षण / __ init__.py" खाली रहती है और (2) कमांड मूल "अजगर
प्रबंधन थिंकपैड

2

Django 2.2 के साथ एक सरल और काफी अच्छा समाधान एक बनाने के लिए हो सकता है testकिसी ऐप के अंदर फ़ोल्डर, और आप अपने संबंधित डाल सकते हैं test_...py, में फ़ाइलों को जोड़ __init__.pyके लिए testफ़ोल्डर।


1

यदि आपके पास एक अधिक जटिल सेटअप है, या from ... import *-प्रकार के स्टेटमेंट का उपयोग नहीं करना चाहते हैं , तो आप suiteअपने टेस्टशो (या परीक्षण / __ init__.py) नामक एक फ़ंक्शन को परिभाषित कर सकते हैं , जिसका एक उदाहरण देता है unittest.TestSuite


0

मुझे लगता है कि ./manage.py testबस सभी परीक्षण चाल चल रहे हैं (django में = = 1.7)।

यदि आपका आयोजन परीक्षण समूहीकरण और चेरीपिंग के बारे में है और आप django नाक के noseउपयोग के प्रशंसक हैं :

python manage.py test another.test:TestCase.test_method

यदि आप नाक जानते हैं, तो आप जानते हैं कि आपकी सभी फाइलों पर "वाइल्डकार्ड" कितना अच्छा है।

पुनश्च

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


0

मेरे पास दो फाइलें हैं। एक है tests.pyऔर दूसरा है test_api.py। मैं नीचे के रूप में इन व्यक्तिगत रूप से चला सकते हैं।

   manage.py test companies.tests
   manage.py test companies.test_api

फ़ाइल नामकरण सम्मेलन के बारे में @ ओसा की प्रतिक्रिया देखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.