15

我在测试目录中对 Django 应用程序进行了测试:

my_project/apps/my_app/
├── __init__.py
├── tests
│   ├── __init__.py
│   ├── field_tests.py
│   └── storage_tests.py
├── urls.py
├── utils.py
└── views.py

__init__.pyDjango 测试运行程序要求我在应用程序测试目录的文件中放置一个 suite() 函数。该函数返回当我执行 $ python manage.py test 时将运行的测试用例

我安装了 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 的测试运行器找不到我的测试?我必须做什么?

4

5 回答 5

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']
于 2012-02-23T09:25:34.107 回答
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
于 2012-05-29T14:13:31.483 回答
0

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

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

于 2017-02-03T12:11:45.663 回答
-1

我也遇到过同样的情况。使用该套件,您可以运行所有测试或应用程序测试,但不能运行特定测试用例或特定测试。

这很 hacky,但我为解决这个问题所做的不是定义一个套件,__init__.py而是import *仅从所有其他测试模块中定义一个套件,它很糟糕,但它确实有效。

我做了一些事情来帮助确保我不会最终破坏其他模块中的测试套件......__all__在每个测试模块中都声明了所以只有测试名称用 * 导入并保持 pylint 运行我' m 通知类名重新定义。

话虽如此,你应该能够在没有任何丑陋的import *废话的情况下让它工作......我不使用鼻子和django-nose......(我打算很快纠正)......因为那是你看起来你可以这样做来运行你的应用程序目录中的所有测试:

python manage.py test apps

或为单个测试模块运行所有测试:

python manage.py test apps.my_app.tests.storage_tests

请注意,我没有在前面的示例中包含该项目......使用nosetests 和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
于 2011-05-22T05:05:24.963 回答
-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

于 2011-12-20T09:33:37.797 回答