24

テストに関するDjango 1.4 のドキュメントには次のように記載されています。

特定の Django アプリケーションについて、テスト ランナーは次の 2 つの場所で doctest を探します。

  • models.pyファイル。モジュールレベルの doctest や個々のモデルの doctest を定義できます。アプリケーションレベルの doctest をモジュールの docstring に入れ、モデルレベルの doctest をモデルの docstring に入れるのが一般的です。

  • tests.pyアプリケーション ディレクトリ (models.py を保持するディレクトリ) で呼び出されるファイル。このファイルは、必ずしもモデルに関連していない、書きたいすべての doctest のフックです。

好奇心から、Django のテストランナーが の doctest に限定されている理由を知りたいのですmodels.pyが、より実際には、実行時にテストランナーの doctest を (たとえば)views.pyおよび他のモジュールを含めるように拡張する方法を知りたいmanage.py testです。

ご意見をお寄せいただければ幸いです。

ありがとうございました。

ブライアン

4

7 に答える 7

23

これを行うには、tests.py で suite() 関数を追加/編集します。これは、django テスト ランナーによって実行されるテストを定義します。

import unittest
import doctest
from project import views

def suite():
    suite = unittest.TestSuite()
    suite.addTest(doctest.DocTestSuite(views))
    return suite

次に、通常どおりテストを実行するだけで、views.py run に doctests が表示されるはずです。

$ python manage.py test project

これについては、 django テストのドキュメントで詳しく説明されています。

テストを実行すると、テスト ユーティリティのデフォルトの動作は、models.py および tests.py 内のすべてのテスト ケース (つまり、unittest.TestCase のサブクラス) を検索し、それらのテスト ケースからテスト スイートを自動的に構築することです。そのスイートを実行します。

モジュールのテスト スイートを定義する 2 つ目の方法があります。models.py または tests.py で suite() という関数を定義すると、Django テスト ランナーはその関数を使用して、そのモジュールのテスト スイートを構築します。これは、単体テストの推奨構成に従います。複雑なテスト スイートを作成する方法の詳細については、Python のドキュメントを参照してください。

ただし、独自のテスト スイートを構築するということは、django テスト ランナーが tests.py にあるテストを自動的に実行しないことを意味することに注意してください。たとえば、これらをスイートに手動で追加する必要があります

import unittest
import doctest
from project import views

class FooTestCase(unittest.TestCase):
    def testFoo(self):
        self.assertEquals('foo', 'bar')

def suite():
    suite = unittest.TestSuite()
    suite.addTest(doctest.DocTestSuite(views))
    suite.addTest(unittest.TestLoader().loadTestsFromTestCase(FooTestCase))
    return suite
于 2010-06-12T20:59:57.373 に答える
8

これは、Jesse Shieh answertests/__init__.pyに基づいた私の実装です:

import doctest
import unittest

list_of_doctests = [
    'myapp.views.myview',
    'myapp.forms.myform',
]
list_of_unittests = [
    'sometestshere',  # This file is myapp/tests/sometestshere.py
    'moretestshere',  # This file is myapp/tests/moretestshere.py
    'myapp.tests.othertest',  # Absolute paths also work.
]

def suite():
    suite = unittest.TestSuite()
    for t in list_of_doctests:
        suite.addTest(doctest.DocTestSuite(
            __import__(t, globals(), locals(), fromlist=["*"])
        ))
    for t in list_of_unittests:
        suite.addTest(unittest.TestLoader().loadTestsFromModule(
            __import__(t, globals(), locals(), fromlist=["*"])
        ))
    return suite

基本的に、このソリューションでは、任意の「ファイル」(実際にはモジュール) をテスト スイートに追加できます。単体テストを個別のファイルに分割したり、doctests を含むモジュールを追加したりできます。このファイルの先頭にある適切なリストにモジュール名を追加するだけです。

于 2011-01-27T12:28:07.293 に答える
5

django のプラグイン (django-sane-testing または django-nose) を使用して、nosetests を使用し、 --with-doctest フラグを使用します。

于 2010-03-04T18:35:20.207 に答える
2

unittestDjango のネイティブ テスト システムは、パッケージに基づいています。そのため、可能な限り強力ではありません。

ステロイドに下位互換性のあるを使用することをお勧めします. nodes を使用するDjango テスト ランナーunittestと一緒に使用します。フラグを使用してカスタム テストの場所を指定するなど、さまざまな方法でノーズをカスタマイズできます。-m

于 2010-03-05T11:11:45.973 に答える
2

プロジェクト内の任意のファイルまたはモジュールでテストを実行できる github gist を投稿しました。 特定のモジュールとファイルからの doctest の実行

于 2011-02-16T08:09:05.323 に答える
1

独自testrunnerのファイルを作成して、ドキュメント テスト用にチェックする他のファイルを含めることができるかどうかを確認できます。

http://docs.djangoproject.com/en/dev/topics/testing/#defining-a-test-runner

于 2010-03-04T16:33:15.800 に答える