जब आपके ऐप में परीक्षण निर्देशिका हो, तो Django में एक विशिष्ट परीक्षण केस चलाना


165

Django प्रलेखन ( http://docs.djangoproject.com/en/1.3/topics/testing/#running-tests ) का कहना है कि आप व्यक्तिगत परीक्षण के मामलों को निर्दिष्ट करके चला सकते हैं:

$ ./manage.py test animals.AnimalTestCase

यह मानता है कि आप अपने परीक्षण को अपने Django अनुप्रयोग में एक test.py फ़ाइल में है। अगर यह सच है, तो यह कमांड उम्मीद की तरह काम करता है।

मैं एक परीक्षण निर्देशिका में एक Django आवेदन के लिए अपने परीक्षण है:

my_project/apps/my_app/
├── __init__.py
├── tests
   ├── __init__.py
   ├── field_tests.py
   ├── storage_tests.py
├── urls.py
├── utils.py
└── views.py

tests/__init__.pyफ़ाइल एक सूट () फ़ंक्शन है:

import unittest

from my_project.apps.my_app.tests import field_tests, storage_tests

def suite():
    tests_loader = unittest.TestLoader().loadTestsFromModule
    test_suites = []
    test_suites.append(tests_loader(field_tests))
    test_suites.append(tests_loader(storage_tests))
    return unittest.TestSuite(test_suites)

मेरे द्वारा किए जाने वाले परीक्षण चलाने के लिए:

$ ./manage.py test my_app

एक व्यक्तिगत परीक्षण मामले को निर्दिष्ट करने की कोशिश करना एक अपवाद को जन्म देता है:

$ ./manage.py test my_app.tests.storage_tests.StorageTestCase
...
ValueError: Test label 'my_app.tests.storage_tests.StorageTestCase' should be of the form app.TestCase or app.TestCase.test_method

मैंने वह करने की कोशिश की जो अपवाद संदेश ने कहा:

$ ./manage.py test my_app.StorageTestCase
...
ValueError: Test label 'my_app.StorageTestCase' does not refer to a test

जब मेरे परीक्षण कई फाइलों में हैं, तो मैं एक व्यक्तिगत परीक्षण मामला कैसे निर्दिष्ट करूं?

जवाबों:


156

चेकआउट django-nose । यह आपको परीक्षण चलाने की अनुमति देता है जैसे:

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

या टिप्पणियों के अनुसार, वाक्यविन्यास का उपयोग करें:

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

साभार @sdolan हेक्विंट्रान जैसी ही समस्या का सामना किया। Django- नाक पर स्विच किया गया और यह तय हो गया कि यह मुद्दा, डिफ़ॉल्ट Django परीक्षण धावक की तुलना में बहुत बेहतर है।
लीमोबाइल

यह एक परीक्षण चलाता है, लेकिन पूरे टेस्टकैसे कैसे चलाएं?
jMyles

5
@ शैलियों:another.test:TestCase
सैम Dolan

4
मेरे जैसे लोगों पर ध्यान दें जो स्टैकओवरफ़्लो से आँख बंद करके पेस्ट करते हैं: यह उल्लेखित प्लगइन के बिना त्रुटि करेगा, दूसरे उत्तर में वर्णित वाक्यविन्यास का उपयोग करें (इसके बजाय :) जो कि Django 1.6+ में काम करता है।
एंडी स्मिथ

1
मैंने इस उत्तर को अस्वीकार कर दिया क्योंकि यह वास्तव में ओपी के प्रश्न का उत्तर नहीं देता है, जो कि Django में यह कैसे करना था। बल्कि, यह सिर्फ Nosetest पर स्विच करने का सुझाव देता है
जोश ब्राउन

175

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

स्वचालित परीक्षण खोज से अब किसी भी फ़ाइल में परीक्षण मिलेंगे जो कि कार्यशील निर्देशिका के तहत परीक्षण से शुरू होती है , इसलिए उस प्रश्न को संबोधित करते हुए जिसे आपको अपनी फ़ाइलों का नाम बदलना होगा, लेकिन अब आप उन्हें अपनी इच्छित निर्देशिका के अंदर रख सकते हैं। यदि आप कस्टम फ़ाइल नामों का उपयोग करना चाहते हैं, तो आप विकल्प ध्वज के साथ एक पैटर्न (डिफ़ॉल्ट Django परीक्षण धावक) निर्दिष्ट कर सकते हैं --pattern="my_pattern_*.py"

इसलिए यदि आप अपनी manage.pyनिर्देशिका में हैं और ऐप / मॉड्यूल के तहत एक फ़ाइल के test_aअंदर TestCaseउपवर्ग के Aअंदर परीक्षण चलाना चाहते हैं, तो आप क्या करेंगे:tests.pyexample

python manage.py test example.tests.A.test_a

यदि आप एक निर्भरता को शामिल नहीं करना चाहते हैं और Django 1.6 में हैं या बाद में आप इसे कैसे करते हैं।

अधिक जानकारी के लिए Django प्रलेखन देखें


Django में निर्मित इस सुविधा को देखकर अच्छा लगा।
हेकविंट्रान

मुझे यह सब काम करने के लिए नहीं मिल सकता है: error: option --pattern not recognizedऔरinvalid command name
जियोसाइडिक

यह Django v3 में बहुत अच्छा काम करता है!
कर्क

11

मुझे खुद से यह समस्या हो रही थी और मुझे यह सवाल मिला, अगर कोई और साथ आता है, तो यहाँ मैंने क्या खोदा था। DjangoTestSuiteRuner build_test (लेबल) नामक एक विधि का उपयोग करता है जो यह जांचता है कि लेबल के आधार पर कौन से परीक्षण मामले चलते हैं। इस पद्धति को देखते हुए यह पता चलता है कि वे "मॉडल" या "परीक्षण" मॉड्यूल पर एक गेटैट () कर रहे हैं। इसका मतलब है कि यदि आप एक सूट वापस करते हैं तो परीक्षण धावक उस सूट में आपके परीक्षण मामलों की तलाश नहीं करता है, यह केवल उन मॉड्यूलों में से एक में दिखता है।

एक त्वरित काम के आसपास __init__.pyएक सूट को परिभाषित करने के बजाय सीधे अपने परीक्षणों को आयात करने के लिए उपयोग करना है। उन्हें "परीक्षण" मॉड्यूल का हिस्सा बनाता है और इसलिए build_test (लेबल) उन्हें पा सकते हैं।

उपरोक्त आपके उदाहरण के लिए, tests/__init__.pyबस इसमें शामिल होना चाहिए:

from field_tests import *
from storage_tests import *

यह बहुत सुरुचिपूर्ण नहीं है और यदि आप अपने सूट के साथ कुछ अधिक जटिल करने की कोशिश कर रहे हैं तो यह काम नहीं करेगा, लेकिन यह इस मामले के लिए होगा।



4

मैं भी इस समस्या में भाग गया और django- नाक का उपयोग करने के बजाय मैंने इस लिंक का यहां अनुसरण किया: http://www.pioverpi.net/2010/03/10/organizing-django-tests-into-folders/ । आपको init .py खोलने और अपने परीक्षण आयात करने की आवश्यकता है ।

पूर्व init .py:from unique_test_file import *


3

इस कोड को अपने __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__)

इसी तरह, अपने परीक्षण सूट के लिए आप बस उपयोग कर सकते हैं:

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

अब आपको केवल नए परीक्षणों के लिए उन्हें लिखना है और सुनिश्चित करें कि वे परीक्षण फ़ोल्डर में हैं। आयात का कोई और अधिक कठिन रखरखाव!

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