2009-12-15 3 views
6

मुझे सीखने में दिलचस्पी है कि कैसे अधिक एग्इल/बीडीडी तरीके से डॉक्टरेट और यूनिट परीक्षण करना है। मुझे कुछ ट्यूटोरियल मिले हैं जो उचित लगते हैं, लेकिन वे केवल थंबनेल हैं। जो मैं वास्तव में देखना चाहता हूं वह कुछ डीजेगो परियोजनाओं का स्रोत कोड है जो बीडीडी शैली विकसित किए गए थे।एंजिल/बीडीडी तरीके से Django में Doctests का उपयोग करने के उदाहरण

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

def match_pictures_with_products(queryset, number_of_images = 3):  
    products = [] 
    i = 0  
    for product in queryset: 
     if i < (number_of_images): 
      image = product.imagemain_set.all()[:1] 
      product.photo_url = image[0].photo.url 

     products.append(product) 
     i += 1 

    return products 

def index(request): 
    """returns the top 10 most clicked products"""  
    products = Product.objects.all()[:10] 
    products = match_pictures_with_products(products, 10) . 
    return render_to_response('products/product_list.html', {'products': products}) 

मैं एक Doctest सुनिश्चित करता है कि सूचकांक 10 वस्तुओं रिटर्न कैसे बना सकता हूँ:

विशेष रूप से, यहाँ कोड मैं परीक्षण करने के लिए कोशिश कर रहा हूँ है?
उत्पाद क्वेरी उत्पादन सर्वर पर खोल से ठीक काम करने लगती है। वास्तविक सर्वर किसी भी उत्पाद को वापस नहीं कर रहा है।

+0

यदि आप बीडीडी उपकरण चाहते हैं, तो लेटस का प्रयास करें। –

उत्तर

3

मैंने खुद से पहले एक ही सवाल पूछा है। मैं doctests पाया है विचारों, मॉडल तरीकों और प्रबंधकों जैसी चीजों के लिए सीमित उपयोगिता का हो सकता है क्योंकि

  1. आप और एक परीक्षण डेटा वास्तव में परीक्षण के लिए उपयोग करने के लिए
  2. विचार करने की जरूरत है सेट कटाव सेटअप करने के लिए सक्षम होना चाहिए एक अनुरोध वस्तु ले लो। एक कामकाजी में, वह कहां से आता है?

कारण है कि, मैं हमेशा Django unit testing ढांचा है जो आप के लिए यह सब संभालती है का उपयोग किया है। दुर्भाग्यवश, हालांकि, आपको सिद्धांतों के कुछ लाभ नहीं मिलते हैं और यह टीडीडी/बीडीडी को करने में कठोर बनाता है।

मुझे लगता है कि आप अपने-अपने मॉड्यूल और कार्यों से doctests हड़पने और इकाई परीक्षण रूपरेखा के भीतर उन्हें अमल करना चाहते हैं: आगे क्या इस प्रकार शुद्ध अटकलें कैसे आप इस काम कर सकता है के बारे में है। यह टेस्ट डेटा सेटअप/टियरडाउन का ख्याल रखेगा। यदि आपके कामकाज को किसी ऐसी चीज़ की परीक्षण विधि के भीतर से निष्पादित किया गया था जो Django के unittest subclasses.TestCase वे उस परीक्षण डीबी का उपयोग करने में सक्षम होंगे। आप दस्तावेज़ परीक्षण के निष्पादन संदर्भ में नकली अनुरोध ऑब्जेक्ट को भी पास करने में सक्षम होंगे। यहां एक Django snippet है जो एक नकली अनुरोध ऑब्जेक्ट और info प्रदान करता है। मान लीजिए कि आप सभी एप्लिकेशन दृश्यों से डॉकस्ट्रिंग का परीक्षण करना चाहते हैं। आप परीक्षण में ऐसा कुछ कर सकते हैं।py:

from ??? import RequestFactory 
from doctest import testmod, DocTestFailure 
from django.test import TestCase 

from myapp import views 

class MyAppTest(TestCase): 

    fixtures = ['test_data.json'] 

    def test_doctests(self):     
     try: 
      testmod(views, extraglobs={ 
       'REQUEST': RequestFactory() 
      }, raise_on_error=True) 
     except DocTestFailure, e: 
      self.fail(e) 

यह आप इस तरह कुछ करने के लिए अनुमति चाहिए:

def index(request): 
    """ 
    returns the top 10 most clicked products 

    >>> response = index(REQUEST) 
    >>> [test response content here] 

    """  
    products = Product.objects.all()[:10] 
    products = match_pictures_with_products(products, 10) . 
    return render_to_response('products/product_list.html', {'products': products}) 

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

0

zope.testbrowser पैकेज आपके कामकाज में उपयोगी हो सकता है, क्योंकि आप अपने उत्पादन सर्वर के प्रस्तुत HTML उत्तर का विश्लेषण करना चाहते हैं।

1

आपका विचार किस तरह लिखा गया है, परीक्षण करना मुश्किल होगा। आपको यह देखने के लिए HTML को स्क्रैप करना होगा कि आप जिस सामग्री को चाहते हैं वह मौजूद है या नहीं, और फिर आप की आवश्यकता से अधिक परीक्षण कर रहे हैं। परीक्षण करना आसान बनाने के लिए आपके विचार को फिर से लिखना बेहतर होगा। अपने टेम्पलेट नाम parameterizing करके प्रारंभ करें, ताकि आप एक साधारण परीक्षण टेम्पलेट बना सकते हैं:

def index(request, template_name='products/product_list.html'): 
    """returns the top 10 most clicked products"""  
    products = Product.objects.all()[:10] 
    products = match_pictures_with_products(products, 10) . 
    return render_to_response(template_name, {'products': products}) 

तो फिर तुम कि सिर्फ उत्पादों की संख्या की गणना एक सरल टेम्पलेट लिख सकते हैं:

{{ products.count }} 

और सुनिश्चित करें कि टेम्पलेट बनाने रिटर्न "10"।

+0

मुझे यकीन नहीं है कि मैं इसका अनुसरण कर रहा हूं। क्या आप टेम्पलेट का परीक्षण एक डॉक्टरेट के साथ करेंगे? मुझे कुछ Django परियोजनाओं को देखना अच्छा लगेगा जहां इसे लागू किया गया था। – BryanWheelock

1

आप django testclient का उपयोग करें और संदर्भ चर कि तैयार हो जाओ परीक्षण कर सकते हैं:

>>> response = client.get('/foo/') 
>>> response.context['name'] 
'Arthur' 

आपको यह भी सुनिश्चित पेज को सफल 200 लौटे बनाने के लिए जवाब कोड की जांच कर सकते हैं।

संबंधित मुद्दे