我在测试目录中测试了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的测试跑者没有找到我的测试?我该怎么办?
答案 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)
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