我如何告诉django-nose我的测试在哪里?

15 投票
5 回答
6172 浏览
提问于 2025-04-16 17:59

我在一个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 test

时会运行的测试。

我安装了django-nose。当我尝试用django-nose来运行测试时,却发现没有测试被执行:

$ python manage.py test <app_name>

如果我直接指向测试模块,测试就会被执行:

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

为什么django-nose的测试运行器找不到我的测试呢?我该怎么做才能解决这个问题?

5 个回答

0

如果你在模块的开头加上 test = True,并且你的方法名以 test_ 开头,nose 就会自动识别这些测试。

想了解 nose 是怎么找到测试的,可以看看这个链接 http://nose.readthedocs.io/en/latest/finding_tests.html

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
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']

撰写回答