我正在使用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