【问题标题】:Django tests that should not run automatically不应自动运行的 Django 测试
【发布时间】:2016-04-12 20:41:36
【问题描述】:

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

当我调用 python manage.py test 时应该运行通常的单元测试。

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

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

b) 数据一致性测试。

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

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

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

【问题讨论】:

    标签: python django unit-testing testing


    【解决方案1】:

    django 解决方案可以像here

    您将依赖于上下文的测试移动到单独的应用程序并排除它。然后实现这个跑步者: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
    

    来自docs

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

    -A=EXPR, --eval-attr=EXPR 仅针对其属性运行 Python 表达式 EXPR 计算结果为 True [NOSE_EVAL_ATTR]

    的测试

    【讨论】:

    • 感谢您的帮助就像魅力一样。在下面发布了 Django 1.9 更新(因为 DjangoTestSuiteRunner 已被弃用)。但是,接受的答案将交给您@aershov。
    【解决方案2】:

    这里是 Django 1.9 更新,我正在使用的确切代码 sn-p:

    # 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 2011-01-03
      • 2021-04-29
      • 1970-01-01
      相关资源
      最近更新 更多