Djangoのドキュメント( http://docs.djangoproject.com/en/1.3/topics/testing/#running-tests )は、指定することで個々のテストケースを実行できることを示していますそれら:
$ ./manage.py test animals.AnimalTestCase
これは、Djangoアプリケーションのtests.pyファイルにテストがあることを前提としています。これが当てはまる場合、このコマンドは期待どおりに機能します。
TestsディレクトリにDjangoアプリケーションのテストがあります:
my_project/apps/my_app/
├── __init__.py
├── tests
│ ├── __init__.py
│ ├── field_tests.py
│ ├── storage_tests.py
├── urls.py
├── utils.py
└── views.py
tests/__init__.py
ファイルにはsuite()関数があります:
import unittest
from my_project.apps.my_app.tests import field_tests, storage_tests
def suite():
tests_loader = unittest.TestLoader().loadTestsFromModule
test_suites = []
test_suites.append(tests_loader(field_tests))
test_suites.append(tests_loader(storage_tests))
return unittest.TestSuite(test_suites)
私が行うテストを実行するには:
$ ./manage.py test my_app
個々のテストケースを指定しようとすると、例外が発生します。
$ ./manage.py test my_app.tests.storage_tests.StorageTestCase
...
ValueError: Test label 'my_app.tests.storage_tests.StorageTestCase' should be of the form app.TestCase or app.TestCase.test_method
私は例外メッセージが言ったことをやろうとしました:
$ ./manage.py test my_app.StorageTestCase
...
ValueError: Test label 'my_app.StorageTestCase' does not refer to a test
テストが複数のファイルにある場合、個々のテストケースを指定するにはどうすればよいですか?
チェックアウト Django-nose 。次のように実行するテストを指定できます。
python manage.py test another.test:TestCase.test_method
またはコメントに記載されているように、構文を使用します。
python manage.py test another.test.TestCase.test_method
Django 1.6以降では、実行する要素の完全なドット表記を使用して、完全なテストケースまたは単一のテストを実行できます。
自動テスト検出は、作業ディレクトリの下でtestで始まるすべてのファイルでテストを検索するようになりました。必要なディレクトリ内に保存できます。カスタムファイル名を使用する場合は、オプションフラグ--pattern="my_pattern_*.py"
でパターン(デフォルトDjangoテストランナー)を指定できます。
manage.py
ディレクトリにいて、テストを実行したい場合test_a
内TestCase
サブクラスA
ファイル内tests.py
app/moduleの下でexample
あなたがする:
python manage.py test example.tests.A.test_a
依存関係を含めたくなく、Django 1.6以降にいる場合は、その方法です。
自分でこの問題を抱えていて、他の人が来た場合に備えて、この質問を見つけました。 DjangoTestSuiteRunerはbuild_test(label)というメソッドを使用して、ラベルに基づいて実行するテストケースを特定します。このメソッドを調べると、「models」または「test」モジュールでgetattr()を実行していることがわかります。つまり、テストランナーがスイートを返す場合、テストランナーはそのスイートでテストケースを探していませんが、それらのモジュールの1つだけを検索します。
簡単な回避策は、スイートを定義する代わりに、__init__.py
を使用してテストを直接インポートすることです。は、それらを「テスト」モジュールの一部にするため、build_test(label)はそれらを見つけることができます。
上記の例では、tests/__init__.py
には次のものが含まれている必要があります。
from field_tests import *
from storage_tests import *
これは非常にエレガントではありません。もちろん、スイートでもっと複雑なことを行おうとするとうまくいきませんが、この場合はうまくいきます。
これは動作するはずです
python manage.py test my_app.tests.storage_tests
このコードを__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__)
同様に、テストスイートの場合は、単に次を使用できます。
def suite():
return unittest.TestLoader().discover("appname.tests", pattern="*.py")
新しいテストのためにあなたがしなければならないのは、それらを書いて、それらがテストフォルダにあることを確認することです。インポートの面倒なメンテナンスはもうありません!
私もこの問題に遭遇し、Django-noseを使用する代わりに、次のリンクをたどりました。 http://www.pioverpi.net/2010/03/10/organizing-Django-tests-into-folders/ 。 init。pyを開いて、テストをインポートする必要があります。
Ex(init。py:from unique_test_file import *