问题描述
|
我在tests目录中有针对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()函数放在应用程序的tests目录的ѭ1put文件中。该函数返回我执行时将运行的测试用例
$ python manage.py测试
我安装了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的测试运行程序找不到我的测试?我必须做什么?
解决方法
如果使用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\']
,错误:
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
,如果在模块的开头添加test = True,并且方法以test_开头,则鼻子将自动拾取
了解鼻子如何检测测试http://nose.readthedocs.io/en/latest/finding_tests.html
,我也遇到过同样的情况。使用该套件,您可以运行所有测试或一个应用程序的测试,但不能运行特定的测试用例或特定的测试。
这很hacky,但是我为解决此问题所做的工作不是在ѭ1modules中定义套件,而是在所有其他测试模块中仅import *
,这很糟糕,但是可以工作。
为了确保我不会在其他模块中破坏测试套件,我需要做一些事情...在每个测试模块中声明了“ 10”,因此仅将测试名称与*一起导入并保持pylint运行我收到有关类名重新定义的通知。
话虽如此,您应该能够在没有任何丑陋的import *
废话的情况下正常工作...我不使用鼻子和django-nose ...(我打算很快予以纠正)...因为那是您\看起来您可以执行以下操作以运行apps目录中的所有测试:
python manage.py test apps
或为一个测试模块运行所有测试:
python manage.py test apps.my_app.tests.storage_tests
请注意,我没有在前面的示例中包括该项目……使用鼻子测试和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
,为了让您意识到应用程序的位置,请将其添加到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