15

テストディレクトリにDjangoアプリケーションのテストがあります。

my_project/apps/my_app/
├── __init__.py
├── tests
│   ├── __init__.py
│   ├── field_tests.py
│   └── storage_tests.py
├── urls.py
├── utils.py
└── views.py

__init__.pyDjangoテストランナーでは、アプリケーションのテストディレクトリのファイルにsuite()関数を配置する必要があります。この関数は、$ pythonmanage.pytestを実行したときに実行されるテストケースを返します。

django-noseをインストールしました。django-noseでテストを実行しようとすると、0個のテストが実行されます。

$ python manage.py test <app_name>

テストモジュールを直接指すと、テストが実行されます。

$ python manage.py test my_project.apps.my_app.tests.storage_tests

django-noseのテストランナーが私のテストを見つけられないのはなぜですか?私は何をしなければなりませんか?

4

5 に答える 5

6

django-nose を使用する場合は、単純なセレクターを使用できます。

from nose.selector import Selector
from nose.plugins import Plugin
import os
import django.test

class TestDiscoverySelector(Selector):
    def wantDirectory(self, dirname):
        parts = dirname.split(os.path.sep)
        return 'my_app' in parts

    def wantClass(self, cls):
        return issubclass(cls, django.test.TestCase)

    def wantFile(self, filename):
        parts = filename.split(os.path.sep)
        return 'test' in parts and filename.endswith('.py')

    def wantModule(self, module):
        parts = module.__name__.split('.')
        return 'test' in parts

class TestDiscoveryPlugin(Plugin):
    enabled = True

    def configure(self, options, conf):
        pass

    def prepareTestLoader(self, loader):
        loader.selector = TestDiscoverySelector(loader.config)

これは単なる実装例であり、より構成可能にしたり、ニーズに合わせて調整したりできます。Django プロジェクトで使用するには、settigs.py で次のオプションを指定するだけです。

NOSE_PLUGINS = ['lorepo.utility.noseplugins.TestDiscoveryPlugin']
于 2012-02-23T09:25:34.107 に答える
4

違う:

python manage.py test my_app.tests.storage_tests:TestCase.test_name

実際には、クラス名までスラッシュがあり、ファイルの拡張子が付いています

右:

python manage.py test my_app/tests/storage_tests.py:TestCase.test_name
于 2012-05-29T14:13:31.483 に答える
-1

私もこれと同じ状況に遭遇しました。スイートを使用すると、すべてのテストまたはアプリのテストを実行できますが、特定のテストケースまたは特定のテストを実行することはできません。

これはかなりハッキーですが、これを回避するために私が行ったのは、スイートを定義する代わりに、他のすべてのテストモジュールから__init__.pyだけにすることです。import *

他のモジュールでテストスイートを壊さないようにするために私が行うことがいくつかあります...__all__各テストモジュールで宣言されているため、テスト名のみが*でインポートされ、pylintを実行し続けます。 mクラス名の再定義が通知されました。

醜いがらくたなしでこれを動作させることができるはずだと言ってもimport *...私は鼻とdjango-noseを使用しません...(私はすぐに修正するつもりです)...それはあなたがしていることだからですこれを行うと、appsディレクトリ内のすべてのテストを実行できるようになります。

python manage.py test apps

または、単一のテストモジュールに対してすべてのテストを実行するには:

python manage.py test apps.my_app.tests.storage_tests

前の例にプロジェクトを含めなかったことに注意してください...これは、nosetestsとdjango-noseを使用してうまく機能しているように見えました。

また、特定のテストスイートを実行するには、次のようにします。

python manage.py test apps.my_app.tests.storage_tests:TestCase

または、1つの特定のテストを実行するには:

python manage.py test apps.my_app.tests.storage_tests:TestCase.test_name
于 2011-05-22T05:05:24.963 に答える
-4

アプリの場所をノーズに認識させるには、manage.py の先頭にこれらを追加します。

import os, site

ROOT = os.path.dirname(os.path.abspath(__file__))
path = lambda *a: os.path.join(ROOT, *a)
site.addsitedir(path('apps'))

それ以来、あなたは使用することができます

python manage.py テスト my_app.tests.storage_tests:TestCase.test_name

于 2011-12-20T09:33:37.797 に答える