我如何告诉 django-nose 我的测试在哪里?
Posted
技术标签:
【中文标题】我如何告诉 django-nose 我的测试在哪里?【英文标题】:How do I tell django-nose where my tests are? 【发布时间】:2011-08-29 05:44:38 【问题描述】:我在测试目录中有一个 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() 函数。该函数返回将在我执行时运行的测试用例
$ 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 1.6 开始,他们增加了合理的测试发现能力,所以这不再是一个问题。请参阅***.com/questions/5875111/… 了解更多信息。 【参考方案1】:nose 会自动选择,如果您在模块开头添加 test = True 并且您的方法以 test_ 开头
看看鼻子如何检测测试http://nose.readthedocs.io/en/latest/finding_tests.html
【讨论】:
请不要在多个问题中添加the same answer。回答最好的一个并将其余的标记为重复。见Is it acceptable to add a duplicate answer to several questions?【参考方案2】:错误:
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
【讨论】:
如果python manage.py test -v3 --collect-only
以第二种风格输出测试名称而不是第一种,那就太好了。
其实这两种方法都可以,我已经测试了两种方法的功能,都没有问题!【参考方案3】:
如果你使用 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']
【讨论】:
【参考方案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
【讨论】:
【参考方案5】:我也遇到过同样的情况。使用该套件,您可以运行所有测试或应用程序测试,但不能运行特定测试用例或特定测试。
这很 hacky,但我为解决这个问题所做的不是在 __init__.py
中定义一个套件,而是仅从所有其他测试模块中定义一个 import *
,它很糟糕,但它确实有效。
我会做一些事情来帮助确保不会破坏其他模块中的测试套件...在每个测试模块中声明 __all__
,因此只有测试名称使用 * 导入并保持 pylint 运行我会收到有关类名重新定义的通知。
话虽如此,你应该能够在没有任何丑陋的 import *
废话的情况下让它工作......我不使用鼻子和 django-nose......(我打算很快纠正)......因为这就是你正在做的事情,看起来你可以这样做来运行你的应用程序目录中的所有测试:
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
【讨论】:
我在命令中包含项目的原因是因为我使用 buildout 将我的项目放在 Python 的 sys.path 中。我发现的最佳解决方案是使用目录路径:$ python manage.py test my_project/apps/my_app/ 参见 GitHub 问题:github.com/jbalogh/django-nose/issues/34以上是关于我如何告诉 django-nose 我的测试在哪里?的主要内容,如果未能解决你的问题,请参考以下文章
如何告诉 lcov 在哪里可以找到我的 .cpp 和 .h 文件?
如何告诉我的 django 模板静态文件(dajax.core.js)在哪里?