2009-12-15 8 views
6

Tôi muốn tìm hiểu cách thực hiện Doctests và kiểm tra Đơn vị theo cách Agile/BDD hơn. Tôi đã tìm thấy một vài hướng dẫn có vẻ hợp lý, nhưng chúng chỉ là hình thu nhỏ. Điều tôi thực sự muốn thấy là mã nguồn của một số dự án Django được phát triển theo kiểu BDD.Ví dụ về việc sử dụng Doctests ở Django theo cách Agile/BDD

Những điều tôi chưa rõ là làm cách nào để xử lý các đối tượng yêu cầu, v.v. Tôi có một tình huống mà tôi đã triển khai ứng dụng của mình và tôi nhận được hành vi hoàn toàn khác trong sản xuất mà tôi đã phát triển hoặc thậm chí từ Vỏ Python trên máy chủ sản xuất. Tôi hy vọng một số Doctests sẽ giúp tôi chẩn đoán điều này và cũng như mở cửa cho một quá trình nhanh nhẹn hơn bằng văn bản các bài kiểm tra đầu tiên.

Cụ thể, đây là mã Tôi đang cố gắng để kiểm tra:

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

Làm thế nào để tạo ra một doctest đảm bảo rằng chỉ số trả 10 đối tượng?
Truy vấn sản phẩm dường như hoạt động tốt từ trình bao trên máy chủ sản xuất. Máy chủ thực tế không trả lại bất kỳ sản phẩm nào.

+0

Nếu bạn muốn có công cụ BDD, hãy thử rau diếp. –

Trả lời

3

Tôi đã tự hỏi mình cùng một câu hỏi trước đây. Tôi đã tìm thấy doctests là tiện ích hạn chế cho những thứ như quan điểm, phương pháp mô hình và các nhà quản lý vì

  1. Bạn cần để có thể thiết lập và teardown một dữ liệu thử nghiệm thiết lập để thực sự sử dụng để thử nghiệm
  2. xem cần phải lấy một đối tượng yêu cầu. Trong một tài liệu, nó xuất phát từ đâu?

Vì lý do đó, tôi luôn sử dụng khung công tác Django unit testing xử lý tất cả điều này cho bạn. Thật không may, mặc dù, bạn không nhận được một số lợi ích của doctests và nó làm cho TDD/BDD khó làm hơn. Điều tiếp theo là đầu cơ thuần túy về cách bạn có thể thực hiện công việc này:

Tôi nghĩ bạn muốn lấy các tài liệu từ các mô-đun và chức năng tương ứng của chúng và thực hiện chúng trong khuôn khổ thử nghiệm đơn vị. Điều này sẽ chăm sóc của thiết lập dữ liệu thử nghiệm/teardown. Nếu doctests của bạn đã được thực hiện từ bên trong một phương pháp thử nghiệm của một cái gì đó mà phân lớp unittest.TestCase Django của họ sẽ có thể sử dụng DB thử nghiệm. Bạn cũng có thể chuyển đối tượng yêu cầu giả vào ngữ cảnh thực thi của tài liệu thử nghiệm. Dưới đây là một số Django snippet cung cấp đối tượng yêu cầu mô phỏng và info trên đó. Giả sử bạn muốn kiểm tra các tài liệu từ tất cả các chế độ xem ứng dụng. Bạn có thể làm một cái gì đó như thế này trong các bài kiểm tra.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) 

này nên cho phép bạn làm điều gì đó như thế này:

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

Một lần nữa, điều này chỉ ra khỏi đỉnh đầu của tôi và không phải ở tất cả các thử nghiệm, nhưng đó là cách duy nhất tôi nghĩ rằng bạn có thể làm những gì bạn muốn mà không cần phải đưa tất cả các bài kiểm tra xem của bạn vào khung kiểm thử đơn vị.

0

Gói zope.testbrowser có thể hữu ích trong tài liệu của bạn, vì bạn muốn phân tích câu trả lời HTML trả về của máy chủ sản xuất.

1

Cách xem của bạn được viết, thật khó để kiểm tra. Bạn sẽ phải xóa các html để xem nội dung bạn muốn có mặt không, và sau đó bạn đang thử nghiệm nhiều hơn mức bạn cần. Tốt hơn là viết lại chế độ xem của bạn để dễ kiểm tra hơn. Bắt đầu bằng cách parameterizing tên mẫu của bạn, vì vậy bạn có thể tạo ra một mẫu thử nghiệm đơn giản:

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

Sau đó, bạn có thể viết một mẫu đơn giản rằng chỉ cần đếm số lượng sản phẩm:

{{ products.count }} 

Và chắc chắn rằng mẫu trả về "10".

+0

Tôi không chắc mình đang theo dõi điều này. Bạn có kiểm tra mẫu với Doctest không? Tôi rất muốn xem một số dự án Django nơi mà điều này đã được thực hiện. – BryanWheelock

1

Bạn có thể sử dụng django testclient và kiểm tra các biến bối cảnh mà có được thiết lập:

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

Bạn cũng có thể kiểm tra mã phản hồi để đảm bảo trang trở thành công 200.