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,它可以帮助我很好地运行和管理测试。在 settings.py 文件中设置了 test_runner 并将所有可安装文件放置在适当的位置。

要生成上述模型,测试应该是

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()             

我需要一些固定值。所以以下是我的疑问:

我如何保持我的灯具一代干燥。意味着不在G每个功能中创建书籍和作者装置?

django_nose 有助于优化 setUp 和 tearDown 方法并提高速度,我该如何在这里使用它们?只需放置 *django_nose.FastFixtureTestCase* 就可以解决 setUp tearDown 的痛苦?还是我需要使用TransactionTestCase?如何优化上述夹具和测试?

4

5 回答 5

4

最新版本的Django Dynamic Fixture包含一个Django Nose 插件,以方便创建全局灯具。检查这是否对您有帮助。

于 2012-11-13T00:16:59.037 回答
1

FastFixtureTestCase 用于快速夹具处理,在这种情况下根本没有帮助。

使用 django_dynamic_fixture 或 factory_boy(我个人使用)并始终只创建测试所需的尽可能少的对象,即使有可能 - 完全省略数据库(例如,仅测试与其他模型无关的模型方法时)是最快的方法。

此外,如果数据库使您放慢速度,请尝试使用常规数据库进行测试。我知道测试中的 sqlite 应该很快,因为它是在内存中运行的,但它仍然比普通的 postgres/mysql 数据库慢得多。您还可以在 django-nose 中启用 REUSE_DB 选项,这将使测试启动和关闭更快。

于 2012-09-26T20:56:30.147 回答
0

我不熟悉 django-nose 的优化功能,但在回答您的第一个问题时,如果您反复需要相同的一组对象进行一系列测试,我只需制作一个实用方法或独立函数即可调用创建这些对象并返回它们(或者您可以从中获取其他对象的其中一个)。

于 2012-09-19T16:17:06.573 回答
0

您可以创建处理数据创建的数据 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-22T05:48:58.593 回答
0

TransactionTestCase帮助您保存每次测试的整个数据库刷新,它希望您从一个未损坏的数据库开始,您可以使用任何夹具生成器自由生成它。TransactionTestCase但是让数据库变得杂乱无章,django-nose 可以帮助您优化它。然而,django-nose 有另一个测试运行FastFixtureTestCase器可以帮助您优化设置和拆解。

如前所述,您可以使用任何夹具生成,如果您想要 django-nose 的优点,请使用FastFixtureTestCase它,它将帮助您优化 IO 时间。

于 2012-09-27T09:25:50.360 回答