簡體   English   中英

使用django_nose和django-dynamic-fixture優化樣本django模型的設置和拆卸

[英]optimizing setup and teardown for sample django model using django_nose and django-dynamic-fixture

鑒於我的模型如下:

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

我需要一些固定值。 以下是我的查詢:

如何讓我的夾具生成DRY。 意思是不是在每個函數中都從G創建書籍和作者裝置?

django_nose有助於優化setUp和tearDown方法並提高速度,我如何在這里使用它們? 只是把* django_nose.FastFixtureTestCase *放在一起會照顧setUp tearDown的痛苦嗎? 或者我需要使用TransactionTestCase嗎? 如何優化上述夾具並進行測試?

最新版本的Django Dynamic Fixture包含一個Django Nose插件,以方便創建全局燈具。 檢查這是否對您有所幫助。

FastFixtureTestCase用於快速固定裝置處理,在這種情況下根本無濟於事。

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

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

我不熟悉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])

TransactionTestCase可以幫助您節省每次測試保存整個數據庫刷新的時間,它希望您從未使用的數據庫開始,您可以使用任何夾具生成器自由生成它。 但是, TransactionTestCase會使數據庫混亂,django-nose可幫助您優化數據庫。 但是django-nose有另一個測試運行器FastFixtureTestCase可以幫助你優化setUp和tearDown。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM