我怎么告诉django-nose我的测试在哪里?

时间:2011-05-19 21:36:38

标签: python django unit-testing nose django-nose

我在测试目录中测试了Django应用程序:

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

Django测试运行器要求我将一个suite()函数放在我的应用程序测试目录的__init__.py文件中。该函数返回将在我执行时运行的测试用例 $ python manage.py test

我安装了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的测试跑者没有找到我的测试?我该怎么办?

5 个答案:

答案 0 :(得分: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']

答案 1 :(得分: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

答案 2 :(得分:0)

如果你在模块的开头添加 test = True并且你的方法以test_

开头,那么

nose会自动选择

了解鼻子如何检测测试http://nose.readthedocs.io/en/latest/finding_tests.html

答案 3 :(得分:-1)

我也遇到过同样的情况。使用该套件,它将允许您运行所有测试或测试应用程序,但不能运行特定的测试用例或特定测试。

这非常hacky,但我为解决这个问题所做的不是在__init__.py中定义一个套件,而是从所有其他测试模块中只定义import *,它很糟糕但是它有效。

我做了一些事情来帮助确保我最终不会破坏其他模块中的测试套件...在每个测试模块中声明__all__因此只导入测试名称*并保持pylint运行我收到了类名重新定义的通知。

说过你应该能够在没有任何丑陋的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

或者运行一个特定的测试:

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

答案 4 :(得分:-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 test my_app.tests.storage_tests:TestCase.test_name