Python 使用django_鼻和django动态夹具优化django模型样品的安装和拆卸

Python 使用django_鼻和django动态夹具优化django模型样品的安装和拆卸,python,django,unit-testing,nose,django-testing,Python,Django,Unit Testing,Nose,Django Testing,鉴于我的模型如下: 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) 我正在使用它轻松地为测试生

鉴于我的模型如下:

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) 
我正在使用它轻松地为测试生成模型夹具。我还使用了它,它可以帮助我很好地运行和管理测试。 在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有助于优化设置和拆卸方法并提高速度,我如何在这里使用它们?只要放上*django_nose.FastFixtureTestCase*就能解决安装拆卸的问题吗?或者我需要使用TransactionTestCase吗?如何优化上述夹具和测试

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

您可以创建一个处理数据创建的数据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])

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

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


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

TransactionTestCase
帮助您保存一个数据库,并在每个测试中保存一个完整的数据库刷新,它希望您从一个未修改的数据库开始,您可以使用任何夹具生成器自由地生成它
TransactionTestCase
然而,django nose会让数据库变得杂乱无章,它可以帮助您优化数据库。django nose还有另一个测试运行程序
FastFixtureTestCase
帮助您优化设置和拆卸


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

的最新版本包括一个用于帮助创建全局装置的。检查这是否对您有帮助。

您的答案没有提到“鼻子”的东西。如果您使用的是django dynamic fixture,FastFixtureTestCase将不会有帮助。正如作者在“为了将来的测试,最好使用”ModelMaker上所说的“模式,以编程方式创建DB对象。这样,测试就避免了不需要的设置,并且在测试和它需要的确切状态之间有了更清晰的联系。夹具捆绑机的目的是使现有的测试(已经对夹具进行了承诺)更容易接受。”