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

フィクスチャの値が必要になります。だから以下は私が持っていたクエリです:

フィクスチャ生成をDRYに保つにはどうすればよいですか。G各機能から本や著者のフィクスチャを作成しないという意味ですか?

django_noseは、setUpメソッドとtearDownメソッドを最適化し、速度を向上させるのに役立ちます。ここでそれらをどのように使用できますか?* django_nose.FastFixtureTestCase *を置くだけで、セットアップのティアダウンの問題を解決できますか?または、 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

データ作成を処理するデータ 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

私はdjango-noseの最適化機能に精通していませんが、最初の質問への回答として、一連のテストで同じオブジェクトのセットが繰り返し必要な場合は、それを呼び出すことができるユーティリティメソッドまたはスタンドアロン関数を作成するだけです.これらのオブジェクトを作成し、それらを返します (または、他のオブジェクトにアクセスできるオブジェクトの 1 つを返します)。

于 2012-09-19T16:17:06.573 に答える