2012-09-19 12 views
3

優化的安裝和拆卸樣品Django的模型如下:使用django_nose並鑑於我的模型Django的動態夾具

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?我如何優化上述夾具和測試?

回答

0

TransactionTestCase可以幫助您節省每次測試的整個數據庫刷新次數,它希望您從一個未經過評估的數據庫開始,您可以使用任何夾具生成器自由生成它。然而,TransactionTestCase會使數據庫混亂,django-nose可以幫助您優化它。然而,django-nose有另一個測試跑步者FastFixtureTestCase可幫助您優化setUp和tearDown。

如前所述,如果您想讓django-nose使用FastFixtureTestCase,它可以幫助您優化IO時間,您可以使用任何夾具生成。

+0

如果您使用的是django-dynamic-fixture,FastFixtureTestCase將無法提供幫助。正如作者在https://github.com/jbalogh/django-nose#how-fixture-bundling-works上所說的那樣:「對於未來的測試,最好使用」模型製造者「模式,以編程方式創建數據庫對象。這樣,測試避免了他們不需要的設置,測試和它所需的確切狀態之間有一個更清晰的聯繫。夾具捆綁器旨在使現有的測試,已經承諾固定裝置,更容忍。「 – jasisz

0

我對django-nose的優化功能並不熟悉,但是在回答第一個問題時,如果您需要重複測試一組相同的對象,我只需製作一個實用程序方法或獨立功能你可以調用它創建這些對象並返回它們(或者你可以從其中獲得其中的一個)。

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]) 
+0

你的答案不談論「鼻子」的東西。 – whatf

1

FastFixtureTestCase用於快速夾具處理,它在這種情況下根本沒有幫助。

使用django_dynamic_fixture或factory_boy(我個人使用),並且始終僅創建測試所需的小對象,即使可能 - 完全省略數據庫(例如,僅測試與其他模型無關的模型方法)是最快的方法。

此外,如果數據庫是什麼讓你放慢你嘗試使用常規數據庫進行測試。我知道測試中的sqlite應該很快,因爲它運行在內存和所有的東西,但它仍然比普通的postgres/mysql數據庫慢得多。您也可以在django-nose中啓用REUSE_DB選項,這將使測試的啓動和關閉速度更快。