我如何告诉 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 我的测试在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

如何告诉 visualvm 在哪里可以找到我的源代码?

如何告诉 lcov 在哪里可以找到我的 .cpp 和 .h 文件?

如何告诉我的 django 模板静态文件(dajax.core.js)在哪里?

为啥 LogCat 不告诉我的代码中的错误在哪里

告诉 CMake 在 Windows 中哪里可以找到 z.lib

如何删除网络测试警报