Switch to in-memory sqlite for unit tests; 1500% speed improvement.

All unit tests now run in 4 seconds, instead of 64 seconds on a HDD.

 _ENGINE global setting had to be moved into get_engine() so that migration works, otherwise get_engine() creates a new isolated in-memory database for
every call.

Other unit test speedups in this change are to stub out some eventlet sleeps
which saves about 5 seconds.

Change-Id: I3643b73dd9bd86c414934b7c78db67402587f570
This commit is contained in:
Steve Baker 2012-09-24 15:26:56 +12:00
parent 71324379f9
commit 54d53d307d
4 changed files with 29 additions and 15 deletions

View File

@ -30,7 +30,7 @@ from heat.openstack.common import utils
from heat.openstack.common import cfg
import heat.utils
SQL_CONNECTION = 'sqlite:///heat-test.db/'
SQL_CONNECTION = 'sqlite://'
SQL_IDLE_TIMEOUT = 3600
db_opts = [
cfg.StrOpt('db_backend',

View File

@ -16,12 +16,12 @@
import sqlalchemy.interfaces
import sqlalchemy.orm
import sqlalchemy.engine
from sqlalchemy.exc import DisconnectionError
from heat.openstack.common import log as logging
from heat.db import api as db_api
from heat.openstack.common import cfg
logger = logging.getLogger('heat.db.sqlalchemy.session')
_ENGINE = None
@ -30,11 +30,10 @@ _MAKER = None
def get_session(autocommit=True, expire_on_commit=False):
"""Return a SQLAlchemy session."""
global _ENGINE, _MAKER
global _MAKER
if _MAKER is None or _ENGINE is None:
_ENGINE = get_engine()
_MAKER = get_maker(_ENGINE, autocommit, expire_on_commit)
if _MAKER is None:
_MAKER = get_maker(get_engine(), autocommit, expire_on_commit)
return _MAKER()
@ -69,17 +68,21 @@ class MySQLPingListener(object):
def get_engine():
"""Return a SQLAlchemy engine."""
connection_dict = sqlalchemy.engine.url.make_url(_get_sql_connection())
engine_args = {
"pool_recycle": _get_sql_idle_timeout(),
"echo": False,
'convert_unicode': True,
}
global _ENGINE
if _ENGINE is None:
connection_dict = sqlalchemy.engine.url.make_url(_get_sql_connection())
engine_args = {
"pool_recycle": _get_sql_idle_timeout(),
"echo": False,
'convert_unicode': True
}
if 'mysql' in connection_dict.drivername:
engine_args['listeners'] = [MySQLPingListener()]
if 'mysql' in connection_dict.drivername:
engine_args['listeners'] = [MySQLPingListener()]
return sqlalchemy.create_engine(_get_sql_connection(), **engine_args)
_ENGINE = sqlalchemy.create_engine(_get_sql_connection(),
**engine_args)
return _ENGINE
def get_maker(engine, autocommit=True, expire_on_commit=False):

View File

@ -16,6 +16,7 @@
import sys
import os
import eventlet
import json
import nose
import mox
@ -48,6 +49,7 @@ class UserTest(unittest.TestCase):
self.m.StubOutWithMock(self.fc.ec2, 'create')
self.m.StubOutWithMock(self.fc.ec2, 'get')
self.m.StubOutWithMock(self.fc.ec2, 'delete')
self.m.StubOutWithMock(eventlet, 'sleep')
def tearDown(self):
self.m.UnsetStubs()
@ -108,6 +110,7 @@ class UserTest(unittest.TestCase):
# delete script
user.User.keystone().AndReturn(self.fc)
self.fc.users.get(user.DummyId('1')).AndRaise(Exception('not found'))
eventlet.sleep(1).AndReturn(None)
user.User.keystone().AndReturn(self.fc)
self.fc.users.get(user.DummyId('1')).AndReturn(fake_user)

View File

@ -16,6 +16,7 @@
import sys
import os
import eventlet
import json
import nose
import mox
@ -41,6 +42,7 @@ class VolumeTest(unittest.TestCase):
self.m.StubOutWithMock(self.fc.volumes, 'delete')
self.m.StubOutWithMock(self.fc.volumes, 'create_server_volume')
self.m.StubOutWithMock(self.fc.volumes, 'delete_server_volume')
self.m.StubOutWithMock(eventlet, 'sleep')
def tearDown(self):
self.m.UnsetStubs()
@ -98,6 +100,7 @@ class VolumeTest(unittest.TestCase):
# delete script
vol.Volume.nova('volume').AndReturn(self.fc)
self.fc.volumes.get('vol-123').AndReturn(fv)
eventlet.sleep(1).AndReturn(None)
vol.Volume.nova('volume').AndReturn(self.fc)
self.fc.volumes.get('vol-123').AndReturn(fv)
@ -132,6 +135,8 @@ class VolumeTest(unittest.TestCase):
display_description='test_stack.DataVolume',
display_name='test_stack.DataVolume').AndReturn(fv)
eventlet.sleep(1).AndReturn(None)
self.m.ReplayAll()
t = self.load_template()
@ -156,6 +161,7 @@ class VolumeTest(unittest.TestCase):
vol.VolumeAttachment.nova('volume').AndReturn(self.fc)
self.fc.volumes.get('vol-123').AndReturn(fv)
eventlet.sleep(1).AndReturn(None)
self.m.ReplayAll()
@ -181,6 +187,7 @@ class VolumeTest(unittest.TestCase):
vol.VolumeAttachment.nova('volume').AndReturn(self.fc)
self.fc.volumes.get('vol-123').AndReturn(fv)
eventlet.sleep(1).AndReturn(None)
# delete script
@ -190,6 +197,7 @@ class VolumeTest(unittest.TestCase):
'vol-123').AndReturn(None)
vol.VolumeAttachment.nova('volume').AndReturn(self.fc)
self.fc.volumes.get('vol-123').AndReturn(fv)
eventlet.sleep(1).AndReturn(None)
self.m.ReplayAll()