Примеры использования Doctests в Django в Гибком / BDD путь

Я интересуюсь изучением как к Doctests и Unit tests в Более гибком / BDD путь. Я нашел несколько учебных руководств, которые кажутся разумными, но они - просто миниатюры. То, что я действительно хотел бы видеть, является исходным кодом некоторых проектов Django, которые были разработанным стилем BDD.

Вещи, о которых я неясен, состоят в том, как Вы обрабатываете объекты запроса и т.д. У меня есть ситуация, где я развернул свое приложение, и я получаю совершенно другое поведение в производстве, которое я сделал в разработке или даже от оболочки Python на рабочем сервере. Я надеюсь, что некоторый Doctests поможет мне диагностировать это и хорошо как открытое дверь для Более гибкого процесса записи тестов сначала.

А именно, вот код, который я пытаюсь протестировать:

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 объектов?
Запросы продукта, кажется, хорошо работают от оболочки на рабочем сервере. Фактический сервер не возвращает продуктов вообще.

6
задан BryanWheelock 15 December 2009 в 13:51
поделиться

4 ответа

Я задавал себе тот же вопрос раньше. Я обнаружил, что doctests имеют ограниченную полезность для таких вещей, как представления, методы моделей и менеджеры, потому что

  1. Вы должны иметь возможность настраивать и демонтировать набор тестовых данных, чтобы фактически использовать его для тестирования
  2. Представления должны принимать запрос объект. Откуда это в документации?

По этой причине я всегда использовал платформу модульного тестирования Django , которая все это делает за вас. К сожалению, вы не получаете некоторых преимуществ от тестов, и это затрудняет выполнение TDD / BDD. Далее следует чистое предположение о том, как вы могли бы заставить эту работу работать:

Я думаю, вы захотите взять доктесты из соответствующих модулей и функций и выполнить их в рамках модульного тестирования. Это позаботится о настройке / удалении тестовых данных. Если бы ваши тесты выполнялись из тестового метода чего-то, что является подклассом Django unittest.TestCase, они смогут использовать эту тестовую БД. Вы также сможете передать фиктивный объект запроса в контекст выполнения теста документа. Вот фрагмент Django , который предоставляет фиктивный объект запроса и информацию о нем. Предположим, вы хотите протестировать строки документации из всех представлений приложения. Вы можете сделать что-то вроде этого в tests.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})

Опять же, это просто не в моей голове и совсем не проверено, но я думаю, что это единственный способ, которым вы могли бы сделать то, что хотите, не просто помещая все свои тесты представления в среду модульного тестирования.

Если бы ваши тесты выполнялись из тестового метода чего-то, что является подклассом Django unittest.TestCase, они смогут использовать эту тестовую БД. Вы также сможете передать фиктивный объект запроса в контекст выполнения теста документа. Вот фрагмент Django , который предоставляет фиктивный объект запроса и информацию о нем. Предположим, вы хотите протестировать строки документации из всех представлений приложения. Вы можете сделать что-то вроде этого в tests.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})

Опять же, это просто не в моей голове и совсем не проверено, но я думаю, что это единственный способ, которым вы могли бы сделать то, что хотите, не просто помещая все свои тесты представления в среду модульного тестирования.

Если бы ваши тесты выполнялись из тестового метода чего-то, что является подклассом Django unittest.TestCase, они смогут использовать эту тестовую БД. Вы также сможете передать фиктивный объект запроса в контекст выполнения теста документа. Вот фрагмент Django , который предоставляет фиктивный объект запроса и информацию о нем. Предположим, вы хотите протестировать строки документации из всех представлений приложения. Вы можете сделать что-то вроде этого в tests.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})

Опять же, это просто не в моей голове и совсем не проверено, но я думаю, что это единственный способ, которым вы могли бы сделать то, что хотите, не просто помещая все свои тесты представления в среду модульного тестирования.

Я смогу использовать эту тестовую БД. Вы также сможете передать фиктивный объект запроса в контекст выполнения теста документа. Вот фрагмент Django , который предоставляет фиктивный объект запроса и информацию о нем. Предположим, вы хотите протестировать строки документации из всех представлений приложения. Вы можете сделать что-то вроде этого в tests.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})

Опять же, это просто не в моей голове и совсем не проверено, но я думаю, что это единственный способ, которым вы могли бы сделать то, что хотите, не просто помещая все свои тесты представления в среду модульного тестирования.

Я смогу использовать эту тестовую БД. Вы также сможете передать фиктивный объект запроса в контекст выполнения теста документа. Вот фрагмент Django , который предоставляет фиктивный объект запроса и информацию о нем. Предположим, вы хотите протестировать строки документации из всех представлений приложения. Вы можете сделать что-то вроде этого в tests.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})

Опять же, это просто не в моей голове и совсем не проверено, но я думаю, что это единственный способ, которым вы могли бы сделать то, что хотите, не просто помещая все свои тесты представления в среду модульного тестирования.

sa Фрагмент Django , который предоставляет фиктивный объект запроса и информацию о нем. Предположим, вы хотите протестировать строки документации из всех представлений приложения. Вы можете сделать что-то вроде этого в tests.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})

Опять же, это просто не в моей голове и совсем не проверено, но я думаю, что это единственный способ, которым вы могли бы сделать то, что хотите, не просто помещая все свои тесты представления в среду модульного тестирования.

sa Фрагмент Django , который предоставляет фиктивный объект запроса и информацию о нем. Предположим, вы хотите протестировать строки документации из всех представлений приложения. Вы можете сделать что-то вроде этого в tests.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})

Опять же, это просто не в моей голове и совсем не проверено, но это единственный способ, которым, я думаю, вы можете делать все, что хотите, не просто помещая все свои тесты представления в среду модульного тестирования.

Это единственный способ, которым, я думаю, вы могли бы делать все, что хотите, не просто помещая все свои тесты представления в среду модульного тестирования.

Это единственный способ, которым, я думаю, вы могли бы делать все, что хотите, не просто помещая все свои тесты представления в среду модульного тестирования.

3
ответ дан 17 December 2019 в 04:47
поделиться

Как написано ваше мнение, его будет сложно проверить. Вам придется очистить 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».

1
ответ дан 17 December 2019 в 04:47
поделиться

Пакет zope.testbrowser может быть полезен в ваших тестах документов, так как вы хотите проанализировать отображаемый HTML-ответ вашего рабочего сервера.

0
ответ дан 17 December 2019 в 04:47
поделиться

Вы можете использовать django testclient и протестировать установленные контекстные переменные:

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

Вы также можете проверить код ответа, чтобы убедиться, что страница вернулась успешно 200.

.
1
ответ дан 17 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: