web-dev-qa-db-ja.com

アプリにテストディレクトリがある場合、Djangoで特定のテストケースを実行する

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

テストが複数のファイルにある場合、個々のテストケースを指定するにはどうすればよいですか?

139
hekevintran

チェックアウト Django-nose 。次のように実行するテストを指定できます。

python manage.py test another.test:TestCase.test_method

またはコメントに記載されているように、構文を使用します。

python manage.py test another.test.TestCase.test_method
134
Sam Dolan

Django 1.6以降では、実行する要素の完全なドット表記を使用して、完全なテストケースまたは単一のテストを実行できます。

自動テスト検出は、作業ディレクトリの下でtestで始まるすべてのファイルでテストを検索するようになりました。必要なディレクトリ内に保存できます。カスタムファイル名を使用する場合は、オプションフラグ--pattern="my_pattern_*.py"でパターン(デフォルトDjangoテストランナー)を指定できます。

manage.pyディレクトリにいて、テストを実行したい場合test_aTestCaseサブクラスAファイル内tests.py app/moduleの下でexampleあなたがする:

python manage.py test example.tests.A.test_a

依存関係を含めたくなく、Django 1.6以降にいる場合は、その方法です。

詳細については、Djangoのドキュメントを参照

152
cristiano2lopes

自分でこの問題を抱えていて、他の人が来た場合に備えて、この質問を見つけました。 DjangoTestSuiteRunerはbuild_test(label)というメソッドを使用して、ラベルに基づいて実行するテストケースを特定します。このメソッドを調べると、「models」または「test」モジュールでgetattr()を実行していることがわかります。つまり、テストランナーがスイートを返す場合、テストランナーはそのスイートでテストケースを探していませんが、それらのモジュールの1つだけを検索します。

簡単な回避策は、スイートを定義する代わりに、__init__.pyを使用してテストを直接インポートすることです。は、それらを「テスト」モジュールの一部にするため、build_test(label)はそれらを見つけることができます。

上記の例では、tests/__init__.pyには次のものが含まれている必要があります。

from field_tests import *
from storage_tests import *

これは非常にエレガントではありません。もちろん、スイートでもっと複雑なことを行おうとするとうまくいきませんが、この場合はうまくいきます。

10
Chris T

これは動作するはずです

python manage.py test my_app.tests.storage_tests
9
Swapnil Patel

このコードを__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")

新しいテストのためにあなたがしなければならないのは、それらを書いて、それらがテストフォルダにあることを確認することです。インポートの面倒なメンテナンスはもうありません!

3
Bryce Drennan

私もこの問題に遭遇し、Django-noseを使用する代わりに、次のリンクをたどりました。 http://www.pioverpi.net/2010/03/10/organizing-Django-tests-into-folders/init。pyを開いて、テストをインポートする必要があります。

Ex(init。py:from unique_test_file import *

3
Austin