Тестирование в Django (Часть 2) - Модель Mommy против Django.
В последнихpost я познакомил вас с тестированием в Django, и мы рассмотрели лучшие практики, а также несколько примеров. На этот раз я покажу вам более сложный пример и познакомлю вас сModel Mommy для создания образцов данных.
Почему вы должны заботиться?
В последнем посте я сказал, что «https://github.com/rbarrois/factory_boy[factory_boy],model_mommy иmock используются вместо фикстур или ORM для заполнения необходимые данные для тестирования. И приборы, и ORM могут работать медленно и должны обновляться всякий раз, когда меняется ваша модель ».
Подводя итог, тестовые приспособления Django проблематичны, потому что они:
-
должны обновляться каждый раз, когда меняется ваша модель / схема,
-
действительно очень медленно; и
-
иногда жестко закодированные данные могут привести к сбою ваших тестов в будущем.
Таким образом, используя Model Mommy, вы можете создавать приборы, которые загружаются быстрее и которые легче обслуживать с течением времени.
Тестовые приспособления Django
Давайте начнем с рассмотрения нашего примера тестирования модели в последнем посте:
class WhateverTest(TestCase):
def create_whatever(self, title="only a test", body="yes, this is only a test"):
return Whatever.objects.create(
title=title, body=body, created_at=timezone.now())
def test_whatever_creation(self):
w = self.create_whatever()
self.assertTrue(isinstance(w, Whatever))
self.assertEqual(w.__unicode__(), w.title)
Здесь мы просто создали объектWhatever()
и утверждали, что созданный заголовок соответствует ожидаемому заголовку.
Если вы скачали проект изrepo, запустите сервер и выполните тесты:
$ coverage run manage.py test whatever -v 2
Вы увидите, что вышеперечисленные тесты проходят:
test_whatever_creation (whatever.tests.WhateverTest) ... ok
Теперь вместо того, чтобы каждый раз создавать новый экземпляр с каждым атрибутом (скучно!), Мы можем использовать Model Mommy для оптимизации процесса.
Модель мама
Установка:
$ pip install model_mommy
Помните, как выглядит наша модель?
class Whatever(models.Model):
title = models.CharField(max_length=200)
body = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
return self.title
Теперь мы можем переписать вышеприведенный тест гораздо проще:
from model_mommy import mommy
class WhateverTestMommy(TestCase):
def test_whatever_creation_mommy(self):
what = mommy.make(Whatever)
self.assertTrue(isinstance(what, Whatever))
self.assertEqual(what.__unicode__(), what.title)
Запустить его. Это прошло?
Насколько это было легко? Не нужно передавать аргументы.
Новая модель
Давайте посмотрим на немного более сложный пример.
Настроить
Создать новое приложение:
$ python manage.py startapp whatevs
Добавьте приложение вInstalled_Apps
в файлеsettings.py
Создайте модель:
from django.db import models
from django.contrib.auth.models import User
from django.contrib import admin
class Forum(models.Model):
title = models.CharField(max_length=100)
def __unicode__(self):
return self.title
class Post(models.Model):
title = models.CharField(max_length=100)
created = models.DateTimeField(auto_now_add=True)
creator = models.ForeignKey(User, blank=True, null=True)
forum = models.ForeignKey(Forum)
body = models.TextField(max_length=10000)
def __unicode__(self):
return unicode(self.creator) + " - " + self.title
Синхронизировать БД.
Как выглядит наш отчет о покрытии?
Test
Добавьте тесты:
from model_mommy import mommy
from django.test import TestCase
from whatevs.models import Forum, Thread
class WhateverTestMommy(TestCase):
def test_forum_creation_mommy(self):
new_forum = mommy.make('whatevs.Forum')
new_thread = mommy.make('whatevs.Thread')
self.assertTrue(isinstance(new_forum, Forum))
self.assertTrue(isinstance(new_thread, Thread))
self.assertEqual(new_forum.__unicode__(), new_forum.title)
self.assertEqual(
new_thread.__unicode__(),
(str(new_thread.forum) + " - " + str(new_thread.title)))
Перезапустите ваши тесты (которые должны пройти), затем создайте отчет о покрытии:
$ coverage run manage.py test whatevs -v 2
$ coverage html
Что ж?
Не хотите ли попробовать запустить вышеуказанные тесты с использованием фикстурJSON, чтобы увидеть, как настроить тесты с помощью приспособлений для тестирования Django?
Я не уверен, что нас ждет в следующем уроке, поэтому дайте мне знать, что вы хотели бы увидеть. Возьмите кодhere. Обязательно прокомментируйте ниже, если у вас есть вопросы. Ура!