- 私はpython-djangoアプリケーションを持っています
- 単体テストフレームワークを使用しています
- テストは、モジュールディレクトリの「tests.py」ファイルに配置されています。
- 私はテストを実行しています
./manage.py test app
今…
tests.py
ファイルはかなり大規模/複雑になっている/汚いですtests.py
テストの小さなコレクションに分割したい...
どうやって?
./manage.py test app
今…
tests.py
ファイルはかなり大規模/複雑になっている/汚いですtests.py
テストの小さなコレクションに分割したい...どうやって?
回答:
Django 1.6では動作が変更されたため、パッケージを作成する必要がなくなりました。ファイルに名前を付けるだけですtest*.py
。
テストを実行すると、テストユーティリティのデフォルトの動作では、名前がtestで始まるファイル内のすべてのテストケース(つまり、unittest.TestCaseのサブクラス)が検索され、それらのテストケースからテストスイートが自動的に構築されます。そのスイートを実行します。
テストディスカバリは、unittestモジュールの組み込みテストディスカバリに基づいています。デフォルトでは、現在の作業ディレクトリの下にある「test * .py」という名前のファイル内のテストが検出されます。
以前の動作、Django 1.5ドキュメントから:
テストを実行すると、テストユーティリティのデフォルトの動作では、models.pyとtests.pyですべてのテストケース(つまり、unittest.TestCaseのサブクラス)が検出され、それらのテストケースから自動的にテストスイートが構築されます。そのスイートを実行します。
モジュールのテストスイートを定義する2つ目の方法があります。models.pyまたはtests.pyでsuite()という関数を定義すると、Djangoテストランナーはその関数を使用して、そのモジュールのテストスイートを構築します。これは、単体テスト用に提案された編成に従います。複雑なテストスイートの作成方法の詳細については、Pythonのドキュメントをご覧ください。
test*.py
tests
しているため、フォルダをクリーンに保つために呼び出されるフォルダファイル -これは可能ですが、実行する必要が./manage.py test app.tests
あり、すべての相対インポートはレベルを上げる必要があります(にfrom .models
なるfrom ..models
)。
このアプローチはDjango 1.6から有効ではなくなったことに注意してください。この投稿を参照してください。
(パッケージになるように)内部でtests
フォルダを作成できます___init___.py
。次に、そこに分割テストの.pyファイルを追加し、それらすべてをにインポートし___init___.py
ます。
test.py
つまり、ファイルのように見え、動作するモジュールでファイルを置き換えます。
tests
問題のアプリの下にディレクトリを作成します
アプリ app \ models.py app \ views.py app \ tests app \ tests \ __ init__.py app \ tests \ bananas.py app \ tests \ apples.py
サブモジュールをにインポートしapp\tests\__init__.py
ます。
from bananas import *
from apples import *
これで、。/ manage.pyをすべて1つのファイルにあるかのように使用できます。
./manage.py test app.some_test_in_bananas
python manage.py test myapp
、実際にはこの答えがうまく機能することを意味します。(試してみただけ)
トマシュが述べた答えは正しいです。ただし、輸入を確実にすることは退屈な作業になる可能性があります。__init__.py
ファイル構造一致ます。
フォルダ内のすべてのテストを自動的に検出するには、これを__init__.py
次の場所に追加できます。
import unittest
def suite():
return unittest.TestLoader().discover("appname.tests", pattern="*.py")
これにより、実行はできます./manage.py test appname
が、特定のテストの実行は処理されません。これを行うには、次のコードを使用できます(これも__init__.py
):
import pkgutil
import unittest
for loader, module_name, is_pkg in pkgutil.walk_packages(__path__):
module = loader.find_module(module_name).load_module(module_name)
for name in dir(module):
obj = getattr(module, name)
if isinstance(obj, type) and issubclass(obj, unittest.case.TestCase):
exec ('%s = obj' % obj.__name__)
これで、すべてのテストを実行するmanage.py test app
か、特定のテストを実行できますmanage.py test app.TestApples
__init__.py
sys.modules[packagename]
。簡単な回避策はdel
、上記の後に問題を引き起こすものです。(または、フォルダの名前を変更できます;))
python manage.py test appName
)を実行すると、コードの2番目のビットが__path__
利用できないことを示すエラーをスローするエラーに遭遇しました。2つ目のスニペットをif '__path__' in locals():
チェックでラップすることで回避しました。答えてくれてありがとう!
http://docs.python.org/library/unittest.html#organizing-testsは、ファイルをモジュールに分割することについて話し、そのすぐ上のセクションには例があります。
initで何もコーディングする必要はありません。アプリにサブディレクトリを作成するだけです。要件はそれをテストと呼ぶことではありません*例の 場合
app/
app/__init_.py
app/serializers.py
app/testing/
app/testing/__init__.py
app/testing/tests_serializers.py
私は./manage.py test
単にすべてのテストトリックを実行していると思います(django> = 1.7で)。
あなたの場合は整理テストについてですグループ化とチェリーピッキング、あなたはのファンnose
を使用鼻ジャンゴ:
python manage.py test another.test:TestCase.test_method
あなたが鼻を知っているなら、あなたはあなたのすべてのファイルをはるかにうまく「ワイルドカード」する方法を知っています。
PS
それは単なるより良い習慣です。お役に立てば幸いです。答えはここから借りました:アプリにテストディレクトリがある場合のDjangoでの特定のテストケースの実行