Django测试不应该自动运行



我正在使用Django 1.9和Django Restframework开发一个传感器API和仪表板应用程序。

我有一些通常的单元测试,应该在调用python manage.py test时运行。

此外,我还有两种不同类型的测试:

a) 测试与上游数据源和API的连接。

b) 数据一致性测试。

虽然单元测试应该在任何上下文中运行,但a)和b)取决于特定的上下文。当这些上下文可用(或者应该测试)时,我想手动调用它们。

我不希望它们在我调用management test命令时运行(并失败)。

任何建议,如何创建一个测试运行程序,默认情况下排除某些测试文件夹,但在显式调用时运行它们。

django解决方案如下

您将依赖上下文的测试移动到单独的应用程序并将其排除。然后实现此runner:TEST_RUNNER = 'testing.simple.AdvancedTestSuiteRunner'

from django.test.simple import DjangoTestSuiteRunner #@UnresolvedImport
import logging
from django.conf import settings
EXCLUDED_APPS = getattr(settings, 'TEST_EXCLUDE', [])
    class AdvancedTestSuiteRunner(DjangoTestSuiteRunner):
        def __init__(self, *args, **kwargs):
            from django.conf import settings
            settings.TESTING = True
            south_log = logging.getLogger("south")
            south_log.setLevel(logging.WARNING)
            super(AdvancedTestSuiteRunner, self).__init__(*args, **kwargs)
        def build_suite(self, *args, **kwargs):
            suite = super(AdvancedTestSuiteRunner, self).build_suite(*args, **kwargs)
            if not args[0] and not getattr(settings, 'RUN_ALL_TESTS', False):
                tests = []
                for case in suite:
                    pkg = case.__class__.__module__.split('.')[0]
                    if pkg not in EXCLUDED_APPS:
                        tests.append(case)
                suite._tests = tests 
            return suite

当显式添加到命令中时,应用程序不会被忽略'python manage.py test south'


或者使用鼻检

他们有类别

@attr(speed='slow')
class MyTestCase:
    def test_long_integration(self):
        pass
    def test_end_to_end_something(self):
        pass

来自文档

-a=ATTR,--ATTR=ATTR仅运行具有ATTR[NOSE_ATTR]指定属性的测试

-A=EXPR,--eval attr=EXPR仅运行Python表达式EXPR评估为True[NOSE_EVAL_ATTR]的属性的测试

这里是Django 1.9的更新,确切的代码片段,我使用的是:

# from https://djangosnippets.org/snippets/2211/
from django.test.runner import DiscoverRunner
import logging
from django.conf import settings
EXCLUDED_APPS = getattr(settings, 'TEST_EXCLUDE', [])
class AdvancedDiscoverRunner(DiscoverRunner):
    def __init__(self, *args, **kwargs):
        from django.conf import settings
        settings.TESTING = True
        south_log = logging.getLogger("south")
        south_log.setLevel(logging.WARNING)
        super(AdvancedDiscoverRunner, self).__init__(*args, **kwargs)
    def build_suite(self, *args, **kwargs):
        suite = super(AdvancedDiscoverRunner, self).build_suite(*args, **kwargs)
        if not args[0] and not getattr(settings, 'RUN_ALL_TESTS', False):
            tests = []
            for case in suite:
                pkg = case.__class__.__module__.split('.')[0]
                if pkg not in EXCLUDED_APPS:
                    tests.append(case)
                suite._tests = tests
          return suite

最新更新