【问题标题】:How do I tell django-nose where my tests are?我如何告诉 django-nose 我的测试在哪里?
【发布时间】: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 开始,他们增加了合理的测试发现能力,所以这不再是一个问题。请参阅stackoverflow.com/questions/5875111/… 了解更多信息。

标签: python django unit-testing nose django-nose


【解决方案1】:

nose 会自动选择,如果您在模块开头添加 test = True 并且您的方法以 test_ 开头

看看鼻子如何检测测试http://nose.readthedocs.io/en/latest/finding_tests.html

【讨论】:

【解决方案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
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 2017-01-11
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      相关资源
      最近更新 更多