Files
sqlalchemy/test/perf/sessions.py
T
Mike Bayer 20cdc64588 trying different approaches to test layout. in this one, the testing modules
become an externally usable package but still remains within the main sqlalchemy parent package.
in this system, we use kind of an ugly hack to get the noseplugin imported outside of the
"sqlalchemy" package, while still making it available within sqlalchemy for usage by
third party libraries.
2012-09-27 02:37:33 -04:00

96 lines
2.8 KiB
Python

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.testing.compat import gc_collect
from sqlalchemy.testing import AssertsExecutionResults, profiling, testing
from test.orm import _fixtures
# in this test we are specifically looking for time spent in the attributes.InstanceState.__cleanup() method.
ITERATIONS = 100
class SessionTest(fixtures.TestBase, AssertsExecutionResults):
@classmethod
def setup_class(cls):
global t1, t2, metadata,T1, T2
metadata = MetaData(testing.db)
t1 = Table('t1', metadata,
Column('c1', Integer, primary_key=True),
Column('c2', String(30)))
t2 = Table('t2', metadata,
Column('c1', Integer, primary_key=True),
Column('c2', String(30)),
Column('t1id', Integer, ForeignKey('t1.c1'))
)
metadata.create_all()
l = []
for x in range(1,51):
l.append({'c2':'this is t1 #%d' % x})
t1.insert().execute(*l)
for x in range(1, 51):
l = []
for y in range(1, 100):
l.append({'c2':'this is t2 #%d' % y, 't1id':x})
t2.insert().execute(*l)
class T1(fixtures.ComparableEntity):
pass
class T2(fixtures.ComparableEntity):
pass
mapper(T1, t1, properties={
't2s':relationship(T2, backref='t1')
})
mapper(T2, t2)
@classmethod
def teardown_class(cls):
metadata.drop_all()
clear_mappers()
@profiling.profiled('clean', report=True)
def test_session_clean(self):
for x in range(0, ITERATIONS):
sess = create_session()
t1s = sess.query(T1).filter(T1.c1.between(15, 48)).all()
for index in [2, 7, 12, 15, 18, 20]:
t1s[index].t2s
sess.close()
del sess
gc_collect()
@profiling.profiled('dirty', report=True)
def test_session_dirty(self):
for x in range(0, ITERATIONS):
sess = create_session()
t1s = sess.query(T1).filter(T1.c1.between(15, 48)).all()
for index in [2, 7, 12, 15, 18, 20]:
t1s[index].c2 = 'this is some modified text'
for t2 in t1s[index].t2s:
t2.c2 = 'this is some modified text'
del t1s
gc_collect()
sess.close()
del sess
gc_collect()
@profiling.profiled('noclose', report=True)
def test_session_noclose(self):
for x in range(0, ITERATIONS):
sess = create_session()
t1s = sess.query(T1).filter(T1.c1.between(15, 48)).all()
for index in [2, 7, 12, 15, 18, 20]:
t1s[index].t2s
del sess
gc_collect()