summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Kubasik <kevin@kubasik.net>2009-06-26 09:51:26 +0000
committerKevin Kubasik <kevin@kubasik.net>2009-06-26 09:51:26 +0000
commit2dd363fc0c608556edf852552434591a7d519bc7 (patch)
treea3144001e377d1726c40195716123cc157a08cde
parentbbcffeaabe35e3726a3f50ca4ebbd6abd96bcfbe (diff)
r10925@kevin-kubasiks-macbook: kkubasik | 2009-06-26 00:44:22 -0600
[gsoc2009-testing] Solved the threading issues. sqlite3 works again, :memory: as well. Tests run much faster now, and runtests.py behaves as expected when only running windmill tests. Still needs lots of commenting and cleanup git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/test-improvements@11112 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/test/windmill_tests.py61
-rw-r--r--tests/regressiontests/admin_views/tests.py2
-rw-r--r--tests/regressiontests/admin_views/urls.py5
-rw-r--r--tests/regressiontests/admin_views/windmilltests/__init__.py19
-rwxr-xr-xtests/runtests.py78
5 files changed, 91 insertions, 74 deletions
diff --git a/django/test/windmill_tests.py b/django/test/windmill_tests.py
index 8b0b7c2504..e0eea2223c 100644
--- a/django/test/windmill_tests.py
+++ b/django/test/windmill_tests.py
@@ -16,6 +16,11 @@ try:
except ImportError:
from django.test.testcases import TestCase
+try:
+ from windmill.authoring import unit
+except Exception, e:
+ print "You don't appear to have windmill installed, please install before trying to run windmill tests again."
+ unit = None
class StoppableWSGIServer(basehttp.WSGIServer):
"""WSGIServer with short timeout, so that server thread can stop this server."""
@@ -46,7 +51,24 @@ class TestServerThread(threading.Thread):
def run(self):
"""Sets up test server and database and loops over handling http requests."""
+
+ # Must do database stuff in this new thread if database in memory.
+ from django.conf import settings
+ if settings.DATABASE_ENGINE == 'sqlite3' \
+ and (not settings.TEST_DATABASE_NAME or settings.TEST_DATABASE_NAME == ':memory:'):
+ from django.db import connection
+ print 'Creating test DB'
+ db_name = connection.creation.create_test_db(0)
+ #call_command('syncdb', 0, 0)
+ # Import the fixture data into the test database.
+ if hasattr(self, 'fixtures'):
+ print 'Loading fixtures.'
+ # We have to use this slightly awkward syntax due to the fact
+ # that we're using *args and **kwargs together.
+ call_command('loaddata', *self.fixtures, **{'verbosity': 0})
+
try:
+ print "running thread"
handler = basehttp.AdminMediaHandler(WSGIHandler())
httpd = None
while httpd is None:
@@ -55,6 +77,7 @@ class TestServerThread(threading.Thread):
httpd = StoppableWSGIServer(server_address, basehttp.WSGIRequestHandler)
except basehttp.WSGIServerException, e:
if "Address already in use" in str(e):
+ print "Address already in use"
self.port +=1
else:
raise e
@@ -65,18 +88,6 @@ class TestServerThread(threading.Thread):
self.started.set()
return
- # Must do database stuff in this new thread if database in memory.
- from django.conf import settings
- if settings.DATABASE_ENGINE == 'sqlite3' \
- and (not settings.TEST_DATABASE_NAME or settings.TEST_DATABASE_NAME == ':memory:'):
- from django.db import connection
- db_name = connection.creation.create_test_db(0)
- #call_command('syncdb', 0, 0)
- # Import the fixture data into the test database.
- if hasattr(self, 'fixtures'):
- # We have to use this slightly awkward syntax due to the fact
- # that we're using *args and **kwargs together.
- call_command('loaddata', *self.fixtures, **{'verbosity': 0})
# Loop until we get a stop event.
while not self._stopevent.isSet():
@@ -99,6 +110,7 @@ def start_test_server(self, address='localhost', port=8000):
self.server_thread.started.wait()
if self.server_thread.error:
raise self.server_thread.error
+ return self.server_thread.started
def stop_test_server(self):
if self.server_thread:
@@ -108,22 +120,17 @@ def stop_test_server(self):
TestCase.start_test_server = classmethod(start_test_server)
TestCase.stop_test_server = classmethod(stop_test_server)
-try:
- from windmill.authoring import unit
- class WindmillDjangoUnitTest(TestCase, unit.WindmillUnitTestCase):
- test_port = 8000
- def setUp(self):
- self.start_test_server('localhost', self.test_port)
- self.test_url = 'http://localhost:%d' % self.server_thread.port
- unit.WindmillUnitTestCase.setUp(self)
-
- def tearDown(self):
- unit.WindmillUnitTestCase.tearDown(self)
- self.stop_test_server()
- WindmillDjangoTransactionUnitTest = WindmillDjangoUnitTest
-except Exception, e:
- print "You don't appear to have windmill installed, please install before trying to run windmill tests again."
+class WindmillDjangoUnitTest(TestCase, unit.WindmillUnitTestCase):
+ test_port = 8000
+ def setUp(self):
+ self.start_test_server('localhost', self.test_port)
+ self.test_url = 'http://localhost:%d' % self.server_thread.port
+ unit.WindmillUnitTestCase.setUp(self)
+ def tearDown(self):
+ unit.WindmillUnitTestCase.tearDown(self)
+ self.stop_test_server()
+WindmillDjangoTransactionUnitTest = WindmillDjangoUnitTest
diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py
index c59acaefe6..f2ffbe8c2f 100644
--- a/tests/regressiontests/admin_views/tests.py
+++ b/tests/regressiontests/admin_views/tests.py
@@ -1421,7 +1421,7 @@ class AdminInlineTests(TestCase):
self.failUnlessEqual(FancyDoodad.objects.all()[0].name, "Fancy Doodad 1 Updated")
import os
-from django.test import windmill_tests as djangotest
+#from django.test import windmill_tests as djangotest
#from windmill.authoring import djangotest
#from windmill.conf import global_settings
diff --git a/tests/regressiontests/admin_views/urls.py b/tests/regressiontests/admin_views/urls.py
index ae9eccc4b1..ae14d117a0 100644
--- a/tests/regressiontests/admin_views/urls.py
+++ b/tests/regressiontests/admin_views/urls.py
@@ -2,10 +2,7 @@ from django.conf.urls.defaults import *
from django.contrib import admin
import views
import customadmin
-
-#admin.autodiscover()
-
-
+admin.autodiscover()
urlpatterns = patterns('',
(r'^admin/doc/', include('django.contrib.admindocs.urls')),
(r'^admin/secure-view/$', views.secure_view),
diff --git a/tests/regressiontests/admin_views/windmilltests/__init__.py b/tests/regressiontests/admin_views/windmilltests/__init__.py
index 3d8fcaf1a3..8fa8dcac92 100644
--- a/tests/regressiontests/admin_views/windmilltests/__init__.py
+++ b/tests/regressiontests/admin_views/windmilltests/__init__.py
@@ -1,8 +1,11 @@
# import os
# from django.test import windmill_tests as djangotest
# #from windmill.authoring import djangotest
-from windmill.conf import global_settings
-ADMIN_URL = "%s/test_admin/admin" % global_settings.TEST_URL
+
+#from windmill.conf import global_settings
+#ADMIN_URL = "%s/test_admin/admin" % global_settings.TEST_URL
+ADMIN_URL = 'http://localhost:8000/test_admin/admin/'
+
#
# class TestProjectWindmillTest(djangotest.WindmillDjangoUnitTest):
# fixtures = ['admin-views-users.xml', 'admin-views-colors.xml', 'admin-views-fabrics.xml', 'admin-views-unicode.xml',
@@ -377,7 +380,7 @@ def test_AdminAuthContrib():
client.waits.forElement(link=u'Users', timeout=u'8000')
client.click(link=u'Users')
client.waits.forPageLoad(timeout=u'20000')
- print client.commands.getPageText()
+ #print client.commands.getPageText()
client.asserts.assertNode(link=u'adduser')
client.asserts.assertNode(link=u'changeuser')
client.asserts.assertNode(link=u'deleteuser')
@@ -423,10 +426,10 @@ def test_contribFlatSitesRedirect():
client.open(url=ADMIN_URL)
client.waits.forPageLoad(timeout=u'20000')
- print client.commands.getPageText()
- client.click(xpath=u"//div[@id='content-main']/div[5]/table/tbody/tr[1]/td/a")
+ #print client.commands.getPageText()
+ client.click(xpath=u"//div[@id='content-main']/div[table/caption/a/text()='Flatpages']/table/tbody/tr[1]/td/a")
client.waits.forPageLoad(timeout=u'20000')
- print client.commands.getPageText()
+ #print client.commands.getPageText()
client.click(id=u'id_url')
client.type(text=u'/testflat/test/', id=u'id_url')
client.type(text=u'Test Flat', id=u'id_title')
@@ -466,7 +469,7 @@ def test_contribFlatSitesRedirect():
client.waits.forPageLoad(timeout=u'20000')
client.click(link=u'Home')
client.waits.forPageLoad(timeout=u'20000')
- client.click(xpath=u"//div[@id='content-main']/div[6]/table/tbody/tr[1]/th/a")
+ client.click(xpath=u"//div[@id='content-main']/div[table/caption/a/text()='Redirects']/table/tbody/tr[1]/th/a")
client.waits.forPageLoad(timeout=u'20000')
client.click(link=u' Add redirect ')
client.waits.forPageLoad(timeout=u'20000')
@@ -489,6 +492,6 @@ def test_contribFlatSitesRedirect():
client.waits.forPageLoad(timeout=u'20000')
client.open(url=u'http://localhost:8000/events/test')
client.waits.forPageLoad(timeout=u'8000')
- client.asserts.assertText(xpath=u'/html/body', validator=u'This is some unique test content. ')
+ client.asserts.assertText(xpath=u'/html/body', validator=u'\nThis is some unique test content.\n')
client.open(url=u'http://localhost:8000/test_admin/admin/')
client.waits.forPageLoad(timeout=u'8000') \ No newline at end of file
diff --git a/tests/runtests.py b/tests/runtests.py
index 19672dfc4a..0048f25f39 100755
--- a/tests/runtests.py
+++ b/tests/runtests.py
@@ -104,7 +104,6 @@ class InvalidModelTestCase(unittest.TestCase):
def django_tests(verbosity, interactive, test_labels):
from django.conf import settings
-
old_installed_apps = settings.INSTALLED_APPS
old_test_database_name = settings.TEST_DATABASE_NAME
old_root_urlconf = getattr(settings, "ROOT_URLCONF", "")
@@ -140,7 +139,7 @@ def django_tests(verbosity, interactive, test_labels):
# Load all the ALWAYS_INSTALLED_APPS.
# (This import statement is intentionally delayed until after we
# access settings because of the USE_I18N dependency.)
- from django.db.models.loading import get_apps, load_app
+ from django.db.models.loading import get_apps, load_app, get_app
get_apps()
# Load all the test model apps.
@@ -207,30 +206,30 @@ def django_tests(verbosity, interactive, test_labels):
from windmill.conf import global_settings
from django.core.management.commands.test_windmill import ServerContainer, attempt_import
from django.test.windmill_tests import WindmillDjangoUnitTest
- from django.db.models.loading import cache
- from django.utils.importlib import import_module
-
+ #from django.db.models.loading import cache
+ #from django.utils.importlib import import_module
+ #from django.contrib import admin
# print cache.app_models
# print cache.app_store
# m = cache.app_models['invalid_models']
# print m
- if do_std:
- mod = import_module('.models','modeltests.invalid_models')
- try:
- # print '1'
- # 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
+ # if do_std:
+ # #mod = import_module('.models','modeltests.invalid_models')
+ # try:
+ # # print '1'
+ # # 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
@@ -263,21 +262,31 @@ def django_tests(verbosity, interactive, test_labels):
# sys.argv.remove('manage.py')
# if 'test_windmill' in sys.argv:
# sys.argv.remove('test_windmill')
+ #tempapps = settings.INSTALLED_APPS
- #Load the admin interface
- from django.contrib import admin
- admin.autodiscover()
-
+ #get_apps()
+ #admin.autodiscover()
+ #settings.INSTALLED_APPS = tempapps
+ # from django.contrib import admin
+ # admin.autodiscover()
+ import threading
#Create the threaded server.
server_container = ServerContainer()
#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 )
#Start the server thread.
- server_container.start_test_server()
-
+ started = server_container.start_test_server()
+ print 'Waiting for server to get online'
+ started.wait()
+ print 'Database ready'
+ #sleep(5)
+ if 'regressiontests.bug8245' in settings.INSTALLED_APPS:
+ settings.INSTALLED_APPS.remove('regressiontests.bug8245')
+ if 'django.contrib.gis' in settings.INSTALLED_APPS:
+ settings.INSTALLED_APPS.remove('django.contrib.gis')
global_settings.TEST_URL = 'http://localhost:%d' % server_container.server_thread.port
- import windmill
+ #import windmill
# windmill.stdout, windmill.stdin = sys.stdout, sys.stdin
from windmill.authoring import setup_module, teardown_module
@@ -316,11 +325,12 @@ def django_tests(verbosity, interactive, test_labels):
from functest import runner
runner.CLIRunner.final = classmethod(lambda self, totals: testtotals.update(totals) )
import windmill
- setup_module(tests[0][1])
- #sys.argv = sys.argv + wmtests
- sys.argv = wmtests
- bin.cli()
- teardown_module(tests[0][1])
+ for t in tests:
+ setup_module(t[1])
+ #sys.argv = sys.argv + wmtests
+ sys.argv = wmtests
+ bin.cli()
+ teardown_module(t[1])
if testtotals['fail'] is not 0:
sleep(.5)
sys.exit(1)