1
0
mirror of https://github.com/django/django.git synced 2025-07-05 18:29:11 +00:00

[gsoc2009-testing] Cleaned up runtests.py to be a little more acceptable. Still a huge hack, but I didn't want to introduce odd design elements for regression tests

git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/test-improvements@11115 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Kevin Kubasik 2009-06-26 11:34:05 +00:00
parent 217ba0d239
commit a8817035af

View File

@ -2,9 +2,10 @@
import os, sys, traceback import os, sys, traceback
import unittest import unittest
import django
import django.contrib as contrib import django.contrib as contrib
from django.core.servers import basehttp from django.core.servers import basehttp
import django from time import sleep
try: try:
set set
@ -14,7 +15,7 @@ except NameError:
try: try:
import coverage import coverage
except Exception, e: except Exception, e:
print "coverage module not available" print "coverage.py module not available"
CONTRIB_DIR_NAME = 'django.contrib' CONTRIB_DIR_NAME = 'django.contrib'
MODEL_TESTS_DIR_NAME = 'modeltests' MODEL_TESTS_DIR_NAME = 'modeltests'
@ -37,7 +38,7 @@ ALWAYS_INSTALLED_APPS = [
'django.contrib.admin', 'django.contrib.admin',
] ]
WINDMILL_FIXTURES = [ 'regressiontests/admin_views/fixtures/%s' % fix for fix in ['admin-views-users.xml', WINDMILL_FIXTURES = ['regressiontests/admin_views/fixtures/%s' % fix for fix in ['admin-views-users.xml',
'admin-views-colors.xml', 'admin-views-colors.xml',
'admin-views-fabrics.xml', 'admin-views-fabrics.xml',
'admin-views-unicode.xml', 'admin-views-unicode.xml',
@ -46,7 +47,6 @@ WINDMILL_FIXTURES = [ 'regressiontests/admin_views/fixtures/%s' % fix for fix in
'string-primary-key.xml', 'string-primary-key.xml',
'admin-views-person.xml']] 'admin-views-person.xml']]
#ALWAYS_INSTALLED_APPS.extend(('%s.%s' % (REGRESSION_TESTS_DIR_NAME,a) for a in os.listdir(REGRESSION_TEST_DIR) if not('.py' in a or '.svn' in a) ))
def get_test_models(): def get_test_models():
models = [] models = []
@ -115,6 +115,7 @@ def django_tests(verbosity, interactive, test_labels):
# Redirect some settings for the duration of these tests. # Redirect some settings for the duration of these tests.
settings.INSTALLED_APPS = ALWAYS_INSTALLED_APPS settings.INSTALLED_APPS = ALWAYS_INSTALLED_APPS
# Try and include windmill application if specified on command line.
if do_windmill: if do_windmill:
settings.INSTALLED_APPS.append('windmill') settings.INSTALLED_APPS.append('windmill')
settings.ROOT_URLCONF = 'urls' settings.ROOT_URLCONF = 'urls'
@ -139,7 +140,7 @@ def django_tests(verbosity, interactive, test_labels):
# Load all the ALWAYS_INSTALLED_APPS. # Load all the ALWAYS_INSTALLED_APPS.
# (This import statement is intentionally delayed until after we # (This import statement is intentionally delayed until after we
# access settings because of the USE_I18N dependency.) # access settings because of the USE_I18N dependency.)
from django.db.models.loading import get_apps, load_app, get_app from django.db.models.loading import get_apps, load_app
get_apps() get_apps()
# Load all the test model apps. # Load all the test model apps.
@ -180,11 +181,13 @@ def django_tests(verbosity, interactive, test_labels):
#establish coverage settings for the regression suite #establish coverage settings for the regression suite
settings.COVERAGE_MODULE_EXCLUDES = ['modeltests*', 'regressiontests*'] settings.COVERAGE_MODULE_EXCLUDES = ['modeltests*', 'regressiontests*']
settings.COVERAGE_CODE_EXCLUDES = ['def __unicode__\(self\):', 'def get_absolute_url\(self\):'] settings.COVERAGE_CODE_EXCLUDES = ['def __unicode__\(self\):', 'def get_absolute_url\(self\):']
#'from .* import .*', 'import .*', ] # depending on how this is run, we might need to tell the coverage libraries to consider django.*
settings.COVERAGE_ADDITIONAL_MODULES = ['django'] settings.COVERAGE_ADDITIONAL_MODULES = ['django']
# 'from .* import .*', 'import .*',
# Default number of failures is 0
failures = 0 failures = 0
#Run the appropriate test runner based on parameters.
#Run the appropriate test runner based on command line params.
if(do_std): if(do_std):
if(do_coverage): if(do_coverage):
test_runner = get_runner(settings, coverage=True, reports=True) test_runner = get_runner(settings, coverage=True, reports=True)
@ -196,114 +199,69 @@ def django_tests(verbosity, interactive, test_labels):
else: else:
tr = test_runner() tr = test_runner()
failures = tr.run_tests(test_labels, verbosity=verbosity, interactive=interactive, extra_tests=extra_tests) failures = tr.run_tests(test_labels, verbosity=verbosity, interactive=interactive, extra_tests=extra_tests)
#from windmill.authoring import djangotest
from time import sleep
#Run windmill tests if --windmill parameter was passed. #Run windmill tests if --windmill parameter was passed.
if do_windmill: if do_windmill:
# Our bank of windmill-specific imports. Only loaded when used.
#from django.test import windmill_tests as djangotest
import types import types
import logging import logging
import threading
from windmill.conf import global_settings from windmill.conf import global_settings
from windmill.authoring import setup_module, teardown_module
from django.core.management.commands.test_windmill import ServerContainer, attempt_import from django.core.management.commands.test_windmill import ServerContainer, attempt_import
from django.test.windmill_tests import WindmillDjangoUnitTest from django.test.windmill_tests import WindmillDjangoUnitTest
from django.db.models.loading import remove_model from django.db.models.loading import remove_model
# We don't want to try and parse models that we know are invalid.
remove_model('invalid_models') remove_model('invalid_models')
#from django.utils.importlib import import_module
#from django.contrib import admin # Determine which browser to run the tests in.
# print cache.app_models if 'ie' == wm_browser:
# print cache.app_store global_settings.START_IE = True
# m = cache.app_models['invalid_models'] elif 'safari' == wm_browser:
# print m global_settings.START_SAFARI = True
# if do_std: elif 'chrome' == wm_browser:
# #mod = import_module('.models','modeltests.invalid_models') global_settings.START_CHROME = True
# try: else:
# # print '1' global_settings.START_FIREFOX = True
# # print mod
# # print '2'
# # print cache.app_store
# # print '3'
# # # print cache.app_models
# # print '4'
# # print cache.app_models['invalid_models']
#
# if 'invalid_models' in cache.app_models:
# del cache.app_models['invalid_models']
# #del cache.app_store[mod]
# except Exception, e:
# print e
# Create the threaded server.
# print cache.app_models
# print cache.app_store
#from django.test import windmill_tests
# as testwm_cmd
# windmill_runner = testwm_cmd()
# windmill_runner.handle()
#settings.INSTALLED_APPS = [ia for ia in settings.INSTALLED_APPS if True]
# from windmill.authoring.djangotest import WindmillDjangoUnitTest
# if 'ie' in labels:
# global_settings.START_IE = True
# sys.argv.remove('ie')
# elif 'safari' in labels:
# global_settings.START_SAFARI = True
# sys.argv.remove('safari')
# elif 'chrome' in labels:
# global_settings.START_CHROME = True
# sys.argv.remove('chrome')
# else:
global_settings.START_FIREFOX = True
# if 'firefox' in labels:
# sys.argv.remove('firefox')
# if 'manage.py' in sys.argv:
# sys.argv.remove('manage.py')
# if 'test_windmill' in sys.argv:
# sys.argv.remove('test_windmill')
#tempapps = settings.INSTALLED_APPS
#get_apps()
#admin.autodiscover()
#settings.INSTALLED_APPS = tempapps
# from django.contrib import admin
# admin.autodiscover()
import threading
#Create the threaded server.
server_container = ServerContainer() server_container = ServerContainer()
#Set the server's 'fixtures' attribute so they can be loaded in-thread if using sqlite's memory backend. # Set the server's 'fixtures' attribute so they can be loaded in-thread if using sqlite's memory backend.
server_container.__setattr__('fixtures', WINDMILL_FIXTURES ) server_container.__setattr__('fixtures', WINDMILL_FIXTURES)
#Start the server thread. # Start the server thread.
started = server_container.start_test_server() started = server_container.start_test_server()
print 'Waiting for server to get online'
print 'Waiting for threaded server to come online.'
started.wait() started.wait()
print 'Database ready' print 'DB Ready, Server online.'
#sleep(5)
# These 2 unit tests can't be used while running our admin. Explicitly remove.
if 'regressiontests.bug8245' in settings.INSTALLED_APPS: if 'regressiontests.bug8245' in settings.INSTALLED_APPS:
settings.INSTALLED_APPS.remove('regressiontests.bug8245') settings.INSTALLED_APPS.remove('regressiontests.bug8245')
if 'django.contrib.gis' in settings.INSTALLED_APPS: if 'django.contrib.gis' in settings.INSTALLED_APPS:
settings.INSTALLED_APPS.remove('django.contrib.gis') settings.INSTALLED_APPS.remove('django.contrib.gis')
# Set the testing URL based on what available port we get.
global_settings.TEST_URL = 'http://localhost:%d' % server_container.server_thread.port global_settings.TEST_URL = 'http://localhost:%d' % server_container.server_thread.port
#import windmill
# windmill.stdout, windmill.stdin = sys.stdout, sys.stdin
from windmill.authoring import setup_module, teardown_module
# from django.conf import settings # Find which of our INSTALLED_APPS have tests.
tests = [] tests = []
for name in [ app for app in settings.INSTALLED_APPS if not('invalid' in app)]: for name in [app for app in settings.INSTALLED_APPS if not('invalid' in app)]:
for suffix in ['tests', 'wmtests', 'windmilltests']: for suffix in ['tests', 'wmtests', 'windmilltests']:
x = attempt_import(name, suffix) x = attempt_import(name, suffix)
if x is not None: tests.append((suffix,x,)); if x is not None:
tests.append((suffix, x, ))
# Collect the WindmillDjangoUnitTest from tests.py and any 'wmtests' or 'windmilltests' modules.
wmtests = [] wmtests = []
for (ttype, mod,) in tests: for (ttype, mod, ) in tests:
if ttype == 'tests': if ttype == 'tests':
for ucls in [getattr(mod, x) for x in dir(mod) for ucls in [getattr(mod, x) for x in dir(mod)
if ( type(getattr(mod, x, None)) in (types.ClassType, if (type(getattr(mod, x, None)) in (types.ClassType,
types.TypeType) ) and types.TypeType) ) and
issubclass(getattr(mod, x), WindmillDjangoUnitTest) issubclass(getattr(mod, x), WindmillDjangoUnitTest)
]: ]:
@ -315,27 +273,27 @@ def django_tests(verbosity, interactive, test_labels):
else: else:
wmtests.append(os.path.abspath(mod.__file__)) wmtests.append(os.path.abspath(mod.__file__))
# Make sure we even need to run tests.
if len(wmtests) is 0: if len(wmtests) is 0:
print 'Sorry, no windmill tests found.' print 'Sorry, no windmill tests found.'
else: else:
# Setup and run unittests.
testtotals = {} testtotals = {}
x = logging.getLogger() x = logging.getLogger()
x.setLevel(0) x.setLevel(0)
from windmill.server.proxy import logger from windmill.server.proxy import logger
from functest import bin from functest import bin
from functest import runner from functest import runner
runner.CLIRunner.final = classmethod(lambda self, totals: testtotals.update(totals) ) runner.CLIRunner.final = classmethod(lambda self, totals: testtotals.update(totals))
import windmill import windmill
#for t in tests:
setup_module(tests[0][1]) setup_module(tests[0][1])
#sys.argv = sys.argv + wmtests
sys.argv = wmtests sys.argv = wmtests
bin.cli() bin.cli()
teardown_module(tests[0][1]) teardown_module(tests[0][1])
if testtotals['fail'] is not 0: if testtotals['fail'] is not 0:
sleep(.5) sleep(.5)
sys.exit(1) sys.exit(1)
# If there where failures then report them, but give the server thread .5 seconds.
if failures: if failures:
sleep(.5) sleep(.5)
sys.exit(failures) sys.exit(failures)
@ -349,9 +307,7 @@ def django_tests(verbosity, interactive, test_labels):
settings.LOGIN_URL = old_login_url settings.LOGIN_URL = old_login_url
settings.MIDDLEWARE_CLASSES = old_middleware_classes settings.MIDDLEWARE_CLASSES = old_middleware_classes
# global do_windmill
# global do_coverage
# global do_std
if __name__ == "__main__": if __name__ == "__main__":
from optparse import OptionParser from optparse import OptionParser
usage = "%prog [options] [model model model ...]" usage = "%prog [options] [model model model ...]"
@ -369,6 +325,10 @@ if __name__ == "__main__":
help='Tells Django to not run the standard regression suite.') help='Tells Django to not run the standard regression suite.')
parser.add_option('--settings', parser.add_option('--settings',
help='Python path to settings module, e.g. "myproject.settings". If this isn\'t provided, the DJANGO_SETTINGS_MODULE environment variable will be used.') help='Python path to settings module, e.g. "myproject.settings". If this isn\'t provided, the DJANGO_SETTINGS_MODULE environment variable will be used.')
parser.add_option('--wmbrowser',
help='The browser for windmill to run its tests in.',
default='firefox', action='store', dest='wmbrowser', type='choice',
choices=['firefox', 'chrome', 'safari', 'ie'])
options, args = parser.parse_args() options, args = parser.parse_args()
if options.settings: if options.settings:
os.environ['DJANGO_SETTINGS_MODULE'] = options.settings os.environ['DJANGO_SETTINGS_MODULE'] = options.settings
@ -378,4 +338,5 @@ if __name__ == "__main__":
do_windmill = options.windmill do_windmill = options.windmill
do_coverage = options.coverage do_coverage = options.coverage
do_std = options.standard do_std = options.standard
wm_browser = options.wmbrowser
django_tests(int(options.verbosity), options.interactive, args) django_tests(int(options.verbosity), options.interactive, args)