I wanted to use Nose with Django so I came up with this.
TEST_RUNNER = 'noserun.run_tests'
in settings.py
It does not do setup/teardown implicitly between test methods, you need to call nosetest.test.flush() and nosetest.test.loaddata() manually if you want that.
Enables the method names setup and teardown
The environment variable NOSE_COVER runs coverage tests and NO_DROPDB preserves the test db.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | """
noserun/__init__.py here
"""
# vim: tabstop=4 expandtab autoindent shiftwidth=4 fileencoding=utf-8
import os
import sys
if not os.environ.has_key('DJANGO_SETTINGS_MODULE'):
print 'DJANGO_SETTINGS_MODULE not set'
sys.exit(1)
from django.conf import settings
from django.core.management.commands import syncdb
from django.db import connection
from django.test import utils
import nose
def run_tests(test_labels, verbosity=2, interactive=True, extra_tests=[]):
"""Run tests with nose
"""
### Preamble
# Remember our real database name for restore-after-destruct
real_db = settings.DATABASE_NAME
cmd_dict = {
'verbosity': verbosity,
'interactive': interactive,
}
### The real deal
## Setup
utils.setup_test_environment()
## Create test db
test_db = connection.creation.create_test_db(verbosity)
if verbosity:
print 'Created db %s' % test_db
# syncdb
cmd = syncdb.Command()
cmd.handle_noargs(**cmd_dict)
## Find tests
# Not needed with nose <3
## Run tests
# Command line handling
argv = sys.argv
if verbosity == 2:
argv.append('-s')
# Always do doctests, because Django does them too!
# At least I believe/hope it does ;)
argv.append('--with-doctest')
# manage.py doesn't like arbitrary args, use environment
if os.environ.has_key('NOSE_COVER'):
argv.append('--with-coverage')
if verbosity == 2:
print 'Running nose'
print ' Test labels', test_labels
print ' Extra tests', extra_tests
# Pass argv explicitly here
# The above assignment sets a reference and Just Works,
# but this makes it more obvious
if test_labels:
for label in test_labels:
nose.run(module=label, argv=argv)
else:
nose.run(argv=argv)
## Destroy test db
if not os.environ.has_key('NO_DROPDB'):
connection.creation.destroy_test_db(real_db, verbosity)
if verbosity:
print 'OK'
## Teardown
utils.teardown_test_environment()
# EOF
"""
noserun/test.py here
"""
# vim: tabstop=4 expandtab autoindent shiftwidth=4 fileencoding=utf-8
from django.core.management import call_command
from django.core import mail
from nose.util import try_run
from django import test
class TestCase(test.TestCase):
"""Sane TestCase for nose
"""
def setUp(self):
names = ('setup',)
try_run(self, names)
def tearDown(self):
names = ('teardown',)
try_run(self, names)
def _pre_setup(self):
"""Otherwise the superclass _pre_setup but skip everything
related to fixtures.
"""
if hasattr(self, 'urls'):
self._old_root_urlconf = settings.ROOT_URLCONF
settings.ROOT_URLCONF = self.urls
clear_url_caches()
mail.outbox = []
def flush(verbosity=0, interactive=False):
"""Shortcut to flush db
"""
call_command('flush', verbosity=verbosity, interactive=interactive)
def loaddata(*fixtures, **kwargs):
"""A list of fixtures to load, kwargs given as **{'verbosity': 0}
and defaults to exactly that
"""
if not kwargs:
kwargs = {'verbosity': 0}
call_command('loaddata', *fixtures, **kwargs)
# EOF
|
More like this
- Template tag - list punctuation for a list of items by shapiromatron 11 months ago
- JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 11 months, 1 week ago
- Serializer factory with Django Rest Framework by julio 1 year, 6 months ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 6 months ago
- Help text hyperlinks by sa2812 1 year, 7 months ago
Comments
Please login first before commenting.