別のパッケージに保存している小さなアプリケーションをテストしたいと思います。今、私は「test_project」ディレクトリを作成し、そこにテストプロジェクトを作成し、プロジェクトのmanage.pyを使用してテストを実行しています。しかし、私は疑問に思っています-より良い方法はありますか?おそらくいくつかのデフォルト構成(sqliteデータベースなど)を使用して、単一のアプリのテストを起動することは可能ですか?
5 に答える
まだここに表示されていないので、これを書き留めます
djangoの構造が次のようになっている場合:
Project dir/
/myapp
/myotherapp
/myproject
Djangoでは、以下を実行することで、「myotherapp」からのみテストを実行できます。
./manage.py test myotherapp/
これは「myotherapp」の下ですべてのテストを実行しますが、
./manage.py test
プロジェクトディレクトリですべてのテストを実行します。
その目的のためにDjangoテストプロジェクトを作成せずに、単一のアプリのテストをスタンドアロンで実行することが可能です。runtests.py
これを行う1つの方法は、Django設定をセットアップし、./manage.py test your_app
プログラムで実行するをアプリのルートディレクトリに作成することです。その一例は、runtests.py
Django自身のruntests.py(ドキュメント)です。
Django自身runtests.py
は良いリファレンスですが、ほとんどの場合、複雑になっています。以下は、いくつかの代替例です。
noseを使用する場合は、単一のアプリのテストを実行できます。
python manage.py test app.tests:TestClassHere
単一のアプリのテストについて。私は他の大きなdjangoプロジェクトが行っている慣習に従いますが、それはまさにあなたがしていることです。test_projectディレクトリを作成します。
https://github.com/mozilla/django-piston/tree/master/tests/test_project
最大のdjangoプラガブルアプリのいくつかに十分であるかどうかは、私には十分だと思います。
もちろん、djangoの依存関係が必要ない場合は、スタンドアロンのユニットテストでPythonパーツをテストできます。
Django環境には、少なくともsettings.pyファイルとmanage.pyファイルが必要です。これらは重要なものだけでセットアップでき、manage.pyを使用してアプリを単体テストできます。プロジェクトはDjangoランタイム環境として表示されるはずです。それなしではDjangoはありません。おそらく設定を模倣することもできますが、単純さよりも多くのハックを作成することになります。
カスタムテストランナーを作成し、テストを検索するパスをオーバーライドすることもできます。
たぶん私はここにリードを埋めました。私は最近、歴史的な理由で保持したいレガシーテストを含むプロジェクトを継承したため、すべてのテストを1つのフォルダーに書き込み、それを指すように強制されました。
from django.test.runner import DiscoverRunner
class MyTestRunner(DiscoverRunner):
def __init__(self, *args, **kwargs):
kwargs.update({'top_level': str(settings.TEST_DISCOVER_TOP_LEVEL)})
super().__init__(*args, **kwargs)
def run_tests(self, test_labels, extra_tests=None, **kwargs):
# In order to override the top_level directory, the test_label must match the top_level
kwargs.update({'test_labels': [str(settings.TEST_DISCOVER_TOP_LEVEL)]})
return super().run_tests(extra_tests=extra_tests, **kwargs)
とあなたの設定で
TEST_RUNNER = 'path.to.my.module.MyTestRunner'
TEST_DISCOVER_TOP_LEVEL = BASE_DIR / 'tests/unit_and_integration_tests'