Тестирование в Django (Часть 2) - Модель Mommy против Django.

Тестирование в 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

Синхронизировать БД.

Как выглядит наш отчет о покрытии?

Model Mommy test coverage

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. Обязательно прокомментируйте ниже, если у вас есть вопросы. Ура!

Related