Оптимизация настройки и отрыва для модели образца django с использованием django_nose и django-dynamic-fixture

79
3

Учитывая мою модель, выполните следующие действия:


class Author(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()

class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ManyToManyField(Author)


Я использую django-dynamic-fixture, чтобы легко сгенерировать модельные светильники для теста. Я также использую django_nose, который помогает мне легко запускать и управлять тестированием.
Установив файл test_runner в файле settings.py и разместив все установочные файлы на месте.


Чтобы создать модель, как указано выше, тест должен быть


from django_dynamic_fixture import G

class BookModelTest(TestCase):

def test_book_creation(self):
author1 = G(Author)
author2 = G(Author)
book = G(Book, author=[author1])
book_obj = Book.objects.all()
self.assertEquals(book_obj.count(), 1)
self.assertEquals(list(book_obj[0].author), [author1])
self.assertEquals(book_obj[0].title, book.title)
self.assertNotEquals(list(book_obj[0].author), [author1])

def another_test(self):
"Here as well i need the same, author1, author2 and book


Также, если я пишу


class AuthorModelTest(TestCase):

def test_some_stuff()


Мне понадобится какое-то значение прибора.
Итак, следующие запросы:


Как я могу продлить срок службы устройства DRY. Значит, не создавать книги и авторские светильники из G в каждой из функций?


django_nose помогает оптимизировать методы setUp и tearDown и улучшает скорость, как я могу использовать их здесь? Просто поместив * django_nose.FastFixtureTestCase * позаботится о том, что у вас возникли болячки setUp tearDown? Или мне нужно использовать TransactionTestCase? Как оптимизировать описанные выше приборы и тест?

спросил(а) 2012-09-19T04:22:00+04:00 8 лет назад
1
Решение
80

Я не знаком с функциями оптимизации django-носа, но в ответ на ваш первый вопрос, если вам понадобится один и тот же набор объектов для кучи тестов, я просто сделаю утилиту или автономную функцию, которую вы может вызвать то, что создает эти объекты и возвращает их (или один из них, из которого вы можете перейти к другим).

ответил(а) 2012-09-19T19:17:00+04:00 8 лет назад
90

Последняя версия Django Dynamic Fixture включает плагин Django Nose облегчить создание глобальных светильников. Проверьте, помогает ли это вам.

ответил(а) 2012-11-13T03:16:00+04:00 7 лет, 10 месяцев назад
57

FastFixtureTestCase используется для быстрой обработки светильников, и в этой ситуации это вообще не поможет.


Используя django_dynamic_fixture или factory_boy (который я использую лично) и всегда создаю только такие маленькие объекты, какие нужны для тестов, и даже если это возможно - полностью опустить базу данных (например, при тестировании только методов модели, не связанных с другими моделями) это самый быстрый подход.


Также, если база данных - это то, что замедляет работу, попробуйте использовать обычную базу данных для тестирования. Я знаю, что sqlite в тестах должен быть быстрым, потому что он запускается в памяти и все это, но он все еще намного медленнее, чем обычная база данных postgres/mysql. Вы также можете включить опцию REUSE_DB в django-носе, что значительно ускорит запуск и выключение тестов.

ответил(а) 2012-09-26T23:56:00+04:00 8 лет назад
41

TransactionTestCase поможет вам сэкономить всю флеш-память БД за каждый тест, он ожидает, что вы начнете с unmarred db, вы можете генерировать его с помощью любого генератора приборов. TransactionTestCase однако оставляет базу данных загроможденной, django-нос помогает вам ее оптимизировать. django-нос, однако, имеет еще один тестовый бегун FastFixtureTestCase, который помогает вам оптимизировать setUp и tearDown.

Как уже говорилось, вы можете использовать любое поколение приборов, если хотите, чтобы доброкачественность джанго-носа использовала FastFixtureTestCase, и это поможет вам оптимизировать время ввода-вывода.

ответил(а) 2012-09-27T12:25:00+04:00 8 лет назад
41

вы можете создать обработку данных API обработки данных.


class TestData(objects):
def create_a_book_with_author(self):
author1 = G(Author)
author2 = G(Author)
book = G(Book, author=[author1])

class BookModelTest(TestCase):

def setUp(self):
TestData().create_a_book_with_author()
self.book_obj = Book.objects.all()

def test_book_creation(self):
self.assertEquals(self.book_obj.count(), 1)
self.assertEquals(list(self.book_obj[0].author), [author1])
self.assertEquals(self.book_obj[0].title, book.title)
self.assertNotEquals(list(self.book_obj[0].author), [author1])

ответил(а) 2012-09-22T08:48:00+04:00 8 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема