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


165

Djangoのドキュメント(http://docs.djangoproject.com/en/1.3/topics/testing/#running-tests)には、個々のテストケースを指定して実行できると記載されています。

$ ./manage.py test animals.AnimalTestCase

これは、Djangoアプリケーションのtests.pyファイルにテストがあることを前提としています。これがtrueの場合、このコマンドは期待どおりに機能します。

テストディレクトリに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ファイルには、スイート()関数があります。

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

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

回答:


156

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

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

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

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

@sdolanに感謝します。hekevintranと同じ問題が発生しました。django-noseに切り替えて、その問題を修正しました。また、デフォルトのDjangoテストランナーよりもはるかにうまく機能します。
LeeMobile

これはテストを実行しますが、TestCase全体を実行する方法は?
jMyles

5
@jMyles: another.test:TestCase
Sam Dolan

4
Stackoverflowから盲目的に貼り付ける私のような人々に注意してください:これは、言及されたプラグインなしではエラーになります。
アンディスミス

1
Djangoでこれを行う方法であるOPの質問には実際には回答しないため、この回答に反対しました。むしろ、それはNosetestに切り替えることを提案するだけです
Josh Brown

175

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

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

だからあなたがあなたの中にいるなら manage.pyディレクトリにいて、app / moduleの下のファイルtest_a内のTestCaseサブクラスA内でテストを実行する場合は、次のようにします。tests.pyexample

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

依存関係を含めたくない場合で、Django 1.6以降を使用している場合は、この方法で行います。

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


この機能がDjangoに組み込まれていることを確認してください。
hekevintran 2014

私はこれをまったく機能させることができません:error: option --pattern not recognizedおよびinvalid command name
geoidesic

これはDjango v3でうまく動作します!
カーク

11

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

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

上記の例でtests/__init__.pyは、単に以下を含む必要があります:

from field_tests import *
from storage_tests import *

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




3

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.