我怎么告诉django-nose我的测试在哪里?

hek*_*ran 15 python django unit-testing nose django-nose

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

my_project/apps/my_app/
??? __init__.py
??? tests
?   ??? __init__.py
?   ??? field_tests.py
?   ??? storage_tests.py
??? urls.py
??? utils.py
??? views.py
Run Code Online (Sandbox Code Playgroud)

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

我安装了django-nose.当我尝试使用django-nose运行测试时,运行0测试:

$ python manage.py test <app_name>
Run Code Online (Sandbox Code Playgroud)

如果我直接指向测试模块,则运行测试:

$ python manage.py test my_project.apps.my_app.tests.storage_tests
Run Code Online (Sandbox Code Playgroud)

为什么django-nose的测试跑者没有找到我的测试?我必须做什么?

Mat*_*ski 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)
Run Code Online (Sandbox Code Playgroud)

这只是一个示例实现,您可以使其更具可配置性或根据您的需要进行调整.要在Django项目中使用它,只需在settigs.py中提供以下选项

NOSE_PLUGINS = ['lorepo.utility.noseplugins.TestDiscoveryPlugin']
Run Code Online (Sandbox Code Playgroud)


Mat*_*son -1

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

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

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

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

python manage.py test apps
Run Code Online (Sandbox Code Playgroud)

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

python manage.py test apps.my_app.tests.storage_tests
Run Code Online (Sandbox Code Playgroud)

请注意,我没有在前面的示例中包含该项目...这对我来说使用nosetests和django-nose似乎工作得很好。

此外,要运行特定的测试套件,您可以执行以下操作:

python manage.py test apps.my_app.tests.storage_tests:TestCase
Run Code Online (Sandbox Code Playgroud)

或者运行一项特定测试:

python manage.py test apps.my_app.tests.storage_tests:TestCase.test_name
Run Code Online (Sandbox Code Playgroud)