2012-03-05 7 views
28

На полпути через мой текущий проект, после того, как я страдаю от потери расходов на бесчисленное количество минут при отладке, я решил принять TDD. Для начала я планирую написать набор модульных тестов для каждой из существующих моделей. Но для моделей, которые имеют только определенные атрибуты (т. Е. Никаких дополнительных методов/свойств), я не уверен, что мне нужно проверить и как это сделать.Написание тестовых примеров для моделей django

class Product(models.Model): 
    name = models.CharField(max_length=50) 
    description = models.TextField(default='', blank=True) 
    retails = models.ManyToManyField(Retail, verbose_name='Retail stores that carry the product') 
    manufacturer = models.ForeignKey(Manufacturer, related_name='products') 
    date_created = models.DateTimeField(auto_now_add=True) 
    date_modified = models.DateTimeField(auto_now=True) 

Использование Продукт в качестве примера, какие вещи о нем, что модульные тесты должны охватывать? И как должен ForeignKey и ManyToManyField быть покрыт?

ответ

62

Это была статья, которую я нашел полезной: http://toastdriven.com/blog/2011/apr/10/guide-to-testing-in-django/. Вот хороший обзор того, что для теста: «Что должен (или не должен) я проверить»

Еще одним распространенным препятствием для разработчиков/дизайнеров новых для тестирования является вопрос Пока нет жестких & быстро правил, которые аккуратно применяются везде, есть некоторые общие принципы, я могу предложить на принятие решения:

  • Если код в вопросе встроенные в Python функции/библиотеки , не проверяйте его. Примеры, например, библиотеки datetime.

  • Если этот код встроен в Django, не проверяйте его. Примеры, такие как поля на модели или тестирование, как встроенный шаблон .Node отображает теги.

  • Если ваша модель имеет собственные методы, вы должны проверить это, как правило, с помощью модульных тестов.

  • То же самое касается пользовательских представлений, форм, тегов шаблонов, контекстных процессоров, промежуточного программного обеспечения, команд управления и т. Д. Если вы внедрили бизнес-логику, вы должны проверить свои аспекты кода.

Так, для примера, там не будет действительно ничего, чтобы проверить, пока не писать некоторые пользовательские функции.
На мой взгляд, тестирование ForeignKey и ManyToManyField ссылок будет подпадать под вторую категорию (код, встроенный в Django), поэтому я бы не тестировал их, так как вы действительно проверяете, работает ли Django должным образом. Если у вас есть метод, который создает экземпляр вашего продукта, включая внешние отношения и M2M, вы можете проверить, что данные были созданы, что будет проверять ваш собственный метод, а не функциональность Django.

Используя парадигму TDD, тесты построены для проверки бизнес-логики и требований к дизайну.

+3

Да, это действительно помогло мне. Я думаю, что тестирование - одна из самых больших частей развития, которая часто пропускается из-за временных ограничений. Именно поэтому писать эффективные, эффективные и не избыточные тесты так важно. Счастливое тестирование! :-) – Furbeenator

+0

+1 для того, чтобы избежать тестов переутомления в слое модели. – Soask

+0

@Furbeenator мой коллега говорит, что мы должны проверять поля 'auto_add', потому что кто-то может изменить его в будущем и/или удалить. Правильно? – Masious

Смежные вопросы