我如何告诉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的测试运行器要求我在应用程序的测试目录里的__init__.py
文件中放一个叫做suite()的函数。这个函数会返回我在运行命令时要执行的测试用例,也就是当我输入
时会运行的测试。
我安装了django-nose。当我尝试用django-nose来运行测试时,却发现没有测试被执行:
$ python manage.py test <app_name>
如果我直接指向测试模块,测试就会被执行:
$ python manage.py test my_project.apps.my_app.tests.storage_tests
为什么django-nose的测试运行器找不到我的测试呢?我该怎么做才能解决这个问题?
5 个回答
0
如果你在模块的开头加上 test = True,并且你的方法名以 test_ 开头,nose 就会自动识别这些测试。
想了解 nose 是怎么找到测试的,可以看看这个链接 http://nose.readthedocs.io/en/latest/finding_tests.html
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
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']