أمثلة على استخدام Doctests في Django بطريقة رشيقة / BDD

StackOverflow https://stackoverflow.com/questions/1907610

  •  19-09-2019
  •  | 
  •  

سؤال

أنا مهتم بتعلم كيفية اختبارات المستندات والوحدة بطريقة أكثر رشيقة / BDD. لقد وجدت بعض البرامج التعليمية التي تبدو معقولة، لكنها مجرد مصغرة. ما أود رؤيته هو الرمز المصدر لبعض مشاريع Django التي تم تطوير أسلوب BDD.

الأشياء التي لا أملها عن كيفية التعامل مع كائنات الطلب وما إلى ذلك. لدي موقف حيث نشرت تطبيقي وأنا أحصل على سلوك مختلف تماما في الإنتاج الذي فعلته في التنمية أو حتى من قذيفة بيثون على الإنتاج الخادم. آمل أن يساعدني بعض المستندات في تشخيص هذا وكذلك فتح الباب لعملية أكثر رشيقة لكتابة الاختبارات أولا.

على وجه التحديد، هنا هو الرمز الذي أحاول اختباره:

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}) 

كيف يمكنني إنشاء مستند أن يضمن إرجاع الفهرس 10 كائنات؟
يبدو أن استفسارات المنتج تعمل بشكل جيد من قذيفة على خادم الإنتاج. الخادم الفعلي لا يعود أي منتجات على الإطلاق.

هل كانت مفيدة؟

المحلول

لقد سألت نفسي نفس السؤال من قبل. لقد وجدت Doctests لتكون ذات فائدة محدودة للأشياء مثل طرق العرض وطرق النماذج والمديرين بسبب

  1. تحتاج إلى أن تكون قادرا على إعداد بيانات اختبار وتعيينها للاستخدام في الواقع للاختبار
  2. الآراء تحتاج إلى اتخاذ كائن الطلب. في مستند، أين يأتي ذلك؟

لهذا السبب، لقد استخدمت دائما django وحدة التجارب الإطار الذي يتعامل مع كل هذا بالنسبة لك. لسوء الحظ، رغم ذلك، لا تحصل على بعض فوائد المستندات وتجعل TDD / BDD أصعب القيام به. ما يلي التالي المضاربة النقية حول كيف قد تجعل هذا العمل:

أعتقد أنك تريد الاستيلاء على المستندات من وحداتها ووظائفها وتنفيذها ضمن إطار اختبار الوحدة. هذا سيعتني بإجراء إعداد بيانات الاختبار / الدموع. إذا تم تنفيذ مستنداتك من خلال طريقة اختبار لشيء تفكيك الفئة الفرعية DJANGO Unittest.Testcase أنها ستكون قادرة على استخدام هذا الاختبار DB. يمكنك أيضا أن تتمكن من اجتياز كائن طلب وهمية في سياق تنفيذ اختبار DOC. هنا مقتطف django. يوفر كائن طلب وهمية و معلومات عليه. دعنا نقول أنك تريد اختبار DocStrings من جميع آراء التطبيقات. يمكنك القيام بشيء مثل هذا في Test.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})

مرة أخرى، هذا خارج أعلى رأس رأسي وليس اختباره بالكامل، ولكن هذه هي الطريقة الوحيدة التي أعتقد أنك يمكن أن تكون ما تريد دون وضع جميع اختبارات العرض الخاصة بك في إطار اختبار الوحدة.

نصائح أخرى

الطريقة التي كتبت طريقة نظرك، سيكون من الصعب اختبارها. يجب عليك كشط HTML لمعرفة ما إذا كان المحتوى الذي تريده موجودا، ثم تختبر أكثر مما تحتاج إليه. أفضل سيكون لإعادة كتابة وجهة نظرك لتسهيل الاختبار. ابدأ بمعلمة اسم القالب الخاص بك، حتى تتمكن من إنشاء قالب اختبار بسيط:

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".

يمكنك استعمال ال django testclient. واختبار متغيرات السياق التي تحصل على مجموعة:

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

يمكنك أيضا التحقق من رمز الاستجابة للتأكد من إرجاع الصفحة نجاحا 200.

ال zope.testbrowser. قد تكون الحزمة مفيدة في المستندات الخاصة بك، لأنك تريد تحليل إجابة HTML المقدمة من خادم الإنتاج الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top