Я интересуюсь изучением как к 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 объектов?
Запросы продукта, кажется, хорошо работают от оболочки на рабочем сервере. Фактический сервер не возвращает продуктов вообще.
Я задавал себе тот же вопрос раньше. Я обнаружил, что doctests имеют ограниченную полезность для таких вещей, как представления, методы моделей и менеджеры, потому что
По этой причине я всегда использовал платформу модульного тестирования 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})
Опять же, это просто не в моей голове и совсем не проверено, но это единственный способ, которым, я думаю, вы можете делать все, что хотите, не просто помещая все свои тесты представления в среду модульного тестирования.
Это единственный способ, которым, я думаю, вы могли бы делать все, что хотите, не просто помещая все свои тесты представления в среду модульного тестирования. Это единственный способ, которым, я думаю, вы могли бы делать все, что хотите, не просто помещая все свои тесты представления в среду модульного тестирования.Как написано ваше мнение, его будет сложно проверить. Вам придется очистить 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».
Пакет zope.testbrowser может быть полезен в ваших тестах документов, так как вы хотите проанализировать отображаемый HTML-ответ вашего рабочего сервера.
Вы можете использовать django testclient и протестировать установленные контекстные переменные:
>>> response = client.get('/foo/')
>>> response.context['name']
'Arthur'
Вы также можете проверить код ответа, чтобы убедиться, что страница вернулась успешно 200
.