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对象。这样,测试就避免了不需要的设置,并且在测试和它需要的确切状态之间有了更清晰的联系。夹具捆绑机的目的是使现有的测试(已经对夹具进行了承诺)更容易接受。”